Às vezes, você precisa de um Makefile para ser executado em diferentes sistemas operacionais de destino e deseja que a compilação falhe mais cedo se um executável necessário não estiver disponível, em PATH
vez de ser executado por um possivelmente longo tempo antes de falhar.
A excelente solução fornecida por engineerchuan requer fazer um alvo . No entanto, se você tiver muitos executáveis para testar e seu Makefile tiver muitos destinos independentes, cada um dos quais requer os testes, então cada destino requer o destino de teste como uma dependência. Isso gera uma grande quantidade de digitação extra, bem como tempo de processamento, quando você cria mais de um destino por vez.
A solução fornecida por 0xf pode testar um executável sem criar um alvo. Isso economiza muito tempo de digitação e execução quando há vários destinos que podem ser construídos separadamente ou juntos.
Meu aprimoramento para a última solução é usar o which
executável ( where
no Windows), ao invés de contar com a existência de uma --version
opção em cada executável, diretamente na ifeq
diretiva GNU Make , ao invés de definir uma nova variável, e usar o GNU Make error
para interromper a construção se um executável necessário não estiver disponível ${PATH}
. Por exemplo, para testar o lzop
executável:
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
Se você tiver vários executáveis para verificar, convém usar uma foreach
função com o which
executável:
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
Observe o uso do :=
operador de atribuição que é necessário para forçar a avaliação imediata da expressão RHS. Se o seu Makefile mudar o PATH
, então, em vez da última linha acima, você precisará:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
Isso deve fornecer uma saída semelhante a:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.