Mengapa menggunakan make over skrip shell?

129

Buat saya tampak seperti skrip shell dengan penanganan argumen baris perintah yang sedikit lebih mudah.

Mengapa standar untuk menjalankan make daripada ./make.sh

HoboBen
sumber
untuk pertanyaan kebalikannya: mengapa menggunakan skrip shell daripada make (karena penanganan argumen baris perintah yang terlihat lebih mudah), terutama untuk tugas-tugas administrator sistem, baca di sini: unix.stackexchange.com/a/497601/1170
lesmana

Jawaban:

126

Ide umumnya adalah yang makemendukung (cukup) pembangunan ulang minimal - yaitu, Anda memberi tahu bagian mana dari program Anda yang bergantung pada bagian mana yang lain. Ketika Anda memperbarui beberapa bagian dari program, itu hanya membangun kembali bagian-bagian yang bergantung padanya. Meskipun Anda dapat melakukan ini dengan skrip shell, ini akan menjadi lebih banyak pekerjaan (secara eksplisit memeriksa tanggal terakhir diubah pada semua file, dll.) Satu-satunya alternatif yang jelas dengan skrip shell adalah membangun kembali semuanya setiap saat. Untuk proyek kecil, ini adalah pendekatan yang masuk akal, tetapi untuk proyek besar, pembangunan kembali lengkap dapat dengan mudah memakan waktu satu jam atau lebih - menggunakan make, Anda dapat dengan mudah mencapai hal yang sama dalam satu atau dua menit ...

Saya mungkin juga harus menambahkan bahwa ada beberapa alternatif untuk dibuat yang setidaknya memiliki kemampuan yang mirip. Terutama dalam kasus di mana hanya beberapa file dalam proyek besar yang sedang dibangun kembali, beberapa di antaranya (misalnya, Ninja ) seringkali jauh lebih cepat daripada buatan.

Jerry Coffin
sumber
67

Make adalah sistem pakar

Ada berbagai hal yang dapat dilakukan yang sulit dilakukan dengan skrip shell ...

  • Tentu saja, ia memeriksa untuk melihat apa yang sudah ketinggalan zaman, sehingga hanya membangun apa yang perlu dibangunnya
  • Ini melakukan semacam topologi atau beberapa jenis analisis pohon yang menentukan apa yang bergantung pada apa dan urutan apa untuk membangun hal-hal yang sudah ketinggalan zaman sehingga setiap prasyarat dibangun sebelum setiap ketergantungan, dan hanya dibangun sekali.
  • Ini adalah bahasa untuk pemrograman deklaratif . Elemen baru dapat ditambahkan tanpa perlu menggabungkannya menjadi aliran kontrol wajib.
  • Ini berisi mesin inferensi untuk memproses aturan, pola, dan tanggal, dan ini, jika digabungkan dengan aturan dalam Makefile khusus Anda, inilah yang mengubah make menjadi sistem pakar .
  • Ini memiliki prosesor makro.
  • Lihat juga: ringkasan awal pembuatan .
DigitalRoss
sumber
2
Ini sangat terbatas sebagai sistem pakar. Misalnya setiap inferensi dapat menggunakan aturan yang sama hanya sekali.
reinierpost
1
Hanya untuk menguraikan poin 2) dalam istilah teknik yang lebih awam, skrip shell memberlakukan pengurutan linier, sedangkan makefile mirip dengan pohon. Ini menghilangkan ketergantungan kronologis yang tidak perlu (meskipun dalam praktiknya proses make akan dijalankan secara linier).
Sridhar Sarnobat
2
... Saya pikir masalah dengan Makefiles over shell scripts dapat dianalogikan dengan masalah dengan CSS melalui javascript. Tidak begitu jelas urutan kronologis setiap node dijalankan. Meskipun setidaknya dengan Makefiles Anda masih bisa melihat perintah shell yang sebenarnya. Dengan CSS bahkan yang disarikan.
Sridhar Sarnobat
Saya memiliki beberapa komentar yang saya hargai jika seseorang menjelaskannya. 1 / Bukankah poin pertama dan dua poin Anda terkait, dalam arti bahwa urutan topologis adalah bagaimana build inkremental diimplementasikan? 2 / Tidak bisakah Anda poin nomor 3 diimplementasikan menggunakan komposisi fungsi juga. 3 / Saya ingin memahami lebih banyak tentang keuntungan 4 dan 5 untuk pengguna akhir MakeFile, dan mengapa keunggulan ini tidak dapat diimplementasikan dengan membuat perintah shell bersama
Amine Hajyoussef
Ini adalah pertama kalinya saya menemukan Make yang digambarkan sebagai Sistem Pakar. Sebagai seseorang yang membangun sistem pakar, itu bukanlah sesuatu yang akan saya pertimbangkan. Make jelas memiliki mesin inferensi untuk menyimpulkan bagaimana membangun program Anda melalui aturan deklaratif yang ditentukan dalam makefile, tetapi kurang jelas bahwa ini adalah sistem berbasis pengetahuan karena aturan (daun) adalah perintah shell yang akan dijalankan daripada fakta. Dan istilah "sistem pakar" digunakan untuk merujuk pada sistem yang telah berhasil menangkap keahlian pakar kelas dunia, padahal sebenarnya tidak demikian. Juri masih mencariku.
Dennis
9

Pastikan bahwa hanya file yang diperlukan yang dikompilasi ulang saat Anda membuat perubahan pada file sumber Anda.

Sebagai contoh:

final : 1.o 2.o
    gcc -o final 1.o 2.o

1.o : 1.c 2.h
    gcc -c 1.c

2.o : 2.c 2.h
    gcc -c 2.c

Jika saya hanya mengubah file 2.h& menjalankan make, itu mengeksekusi semua 3 perintah, dalam urutan terbalik.

Jika saya hanya mengubah file 1.c& menjalankan make, itu hanya menjalankan 2 perintah pertama dalam urutan terbalik.

Mencoba untuk mencapai itu dengan skrip shell Anda sendiri akan melibatkan banyak if/elsepemeriksaan.

Chris Dodd
sumber
atau gunakan sesuatu seperti ini rsync -r -c -I $SOURCE $DEST_DIRdi shell.
Spartacus 9
9

Seperti di atas, Make adalah bahasa pemrograman paralel deklaratif (-ish).

Katakanlah Anda memiliki 4.000 file grafik untuk diubah dan 4 CPU. Cobalah menulis skrip shell 10 baris (saya bermurah hati di sini) yang akan melakukannya dengan andal sambil memenuhi CPU Anda.

Mungkin pertanyaan sebenarnya adalah mengapa orang repot-repot menulis skrip shell.

bobbogo.dll
sumber
1
Ya, Anda melonggarkan pengurutan linier total menjadi pengurutan yang lebih mirip pohon.
Sridhar Sarnobat
4

make handle dependencies: makefile menjelaskannya: biner bergantung pada file objek, setiap file objek bergantung pada file sumber dan header ... saat make dijalankan, tanggal file dibandingkan untuk menentukan apa yang perlu dikompilasi ulang .

Seseorang dapat memanggil secara langsung satu target untuk tidak membangun semua yang dijelaskan dalam Makefile.

Selain itu, sintaks make menyediakan substitusi, vpath

Semua ini dapat ditulis dalam skrip shell, dengan make Anda sudah memilikinya.

dermawan
sumber