Bazen farklı hedef işletim sistemlerinde çalışabilmek için bir Makefile'a ihtiyaç duyarsınız ve gerekli bir yürütülebilir dosya PATH
başarısız olmadan önce muhtemelen uzun bir süre çalıştırmak yerine içinde değilse derlemenin erken başarısız olmasını istersiniz .
Tarafından sağlanan mükemmel çözüm engineerchuan bir yapım gerektirir hedef . Bununla birlikte, test edilecek çok sayıda yürütülebilir dosyanız varsa ve Makefile'ınızın her biri testleri gerektiren birçok bağımsız hedefi varsa, her hedef bağımlılık olarak test hedefini gerektirir. Bu, bir seferde birden fazla hedef yaptığınızda fazladan yazmanın yanı sıra işlem süresi sağlar.
0xf tarafından sağlanan çözüm , bir hedef belirlemeden yürütülebilir bir dosyayı test edebilir. Bu, ayrı ayrı veya birlikte oluşturulabilen birden fazla hedef olduğunda çok fazla yazma ve yürütme süresinden tasarruf sağlar.
İkinci çözüme yönelik geliştirmem , yeni bir değişken tanımlamak yerine , her yürütülebilir dosyada doğrudan GNU Make yönergesinde bir seçeneğe güvenmek yerine which
yürütülebilir dosyayı ( where
Windows'ta) kullanmak ve GNU Make'i kullanmaktır. gerekli bir yürütülebilir dosya yoksa derlemeyi durdurmak için işlev . Örneğin, yürütülebilir dosyayı test etmek için :--version
ifeq
error
${PATH}
lzop
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
Kontrol etmeniz gereken birkaç çalıştırılabilir dosyanız varsa foreach
, which
çalıştırılabilir dosyayla bir işlev kullanmak isteyebilirsiniz :
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
:=
RHS ifadesinin anında değerlendirilmesini zorunlu kılmak için gerekli olan atama operatörünün kullanımına dikkat edin . Makefile dosyanız değişiyorsa, PATH
yukarıdaki son satır yerine şunlara ihtiyacınız olacaktır:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
Bu size şuna benzer bir çıktı vermelidir:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.