Terkadang Anda memerlukan Makefile agar dapat berjalan di OS target yang berbeda dan Anda ingin build tersebut gagal lebih awal jika executable yang diperlukan tidak ada PATH
daripada dijalankan dalam waktu yang mungkin lama sebelum gagal.
Solusi terbaik yang diberikan oleh engineerchuan membutuhkan pembuatan target . Namun, jika Anda memiliki banyak executable untuk diuji dan Makefile Anda memiliki banyak target independen, yang masing-masing memerlukan pengujian, maka setiap target memerlukan target pengujian sebagai dependensi. Itu menghasilkan banyak pengetikan tambahan serta waktu pemrosesan ketika Anda membuat lebih dari satu target pada satu waktu.
Solusi yang disediakan oleh 0xf dapat menguji executable tanpa membuat target. Itu menghemat banyak waktu pengetikan dan eksekusi ketika ada beberapa target yang dapat dibangun secara terpisah atau bersama-sama.
Perbaikan saya untuk solusi yang terakhir adalah dengan menggunakan yang which
dapat dieksekusi ( where
di Windows), daripada mengandalkan adanya --version
opsi di setiap yang dapat dieksekusi, langsung di ifeq
direktif GNU Make , daripada untuk menentukan variabel baru, dan untuk menggunakan GNU Make error
berfungsi untuk menghentikan build jika executable yang diperlukan tidak ada ${PATH}
. Misalnya, untuk menguji yang lzop
dapat dieksekusi:
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
Jika Anda memiliki beberapa executable untuk diperiksa, Anda mungkin ingin menggunakan foreach
fungsi dengan which
executable:
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
Perhatikan penggunaan :=
operator penugasan yang diperlukan untuk memaksa evaluasi langsung dari ekspresi RHS. Jika Makefile Anda mengubah PATH
, maka alih-alih baris terakhir di atas Anda perlu:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
Ini akan memberi Anda hasil yang mirip dengan:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.