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 PATH
piuttosto 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' which
eseguibile ( where
in Windows), piuttosto che fare affidamento sul fatto che ci sia --version
un'opzione in ogni eseguibile, direttamente nella ifeq
direttiva GNU Make , piuttosto che definire una nuova variabile e usare GNU Make error
funzione per interrompere la compilazione se un eseguibile richiesto non è presente ${PATH}
. Ad esempio, per verificare l' lzop
eseguibile:
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 foreach
funzione con l' which
eseguibile:
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.