A volte è necessario un Makefile per essere in grado di funzionare su diversi sistemi operativi di destinazione e si desidera che la compilazione fallisca in anticipo se un eseguibile richiesto non è presente PATHpiuttosto che eseguire per un tempo possibilmente lungo prima di fallire.
L'eccellente soluzione fornita da engineerchuan richiede la creazione di un obiettivo . Tuttavia, se hai molti eseguibili da testare e il tuo Makefile ha molti target indipendenti, ognuno dei quali richiede i test, allora ogni target richiede il target di test come dipendenza. Ciò rende molto più digitazione e tempo di elaborazione quando crei più di un obiettivo alla volta.
La soluzione fornita da 0xf può testare un eseguibile senza creare una destinazione. Ciò consente di risparmiare molto tempo di digitazione e di esecuzione quando ci sono più target che possono essere costruiti separatamente o insieme.
Il mio miglioramento a quest'ultima soluzione consiste nell'usare l' whicheseguibile ( wherein Windows), piuttosto che fare affidamento sul fatto che ci sia --versionun'opzione in ogni eseguibile, direttamente nella ifeqdirettiva GNU Make , piuttosto che definire una nuova variabile e usare GNU Make errorfunzione per interrompere la compilazione se un eseguibile richiesto non è presente ${PATH}. Ad esempio, per verificare l' lzopeseguibile:
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
Se devi controllare diversi eseguibili, potresti voler utilizzare una foreachfunzione con l' whicheseguibile:
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
Notare l'uso :=dell'operatore di assegnazione necessario per forzare la valutazione immediata dell'espressione RHS. Se il tuo Makefile cambia il PATH, allora invece dell'ultima riga sopra avrai bisogno di:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
Questo dovrebbe darti un output simile a:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.