OU condicional em makefile
-
14-11-2019 - |
Pergunta
Gostaria de habilitar uma compilação detalhada em meu makefile, mas não consigo descobrir como fazer uma compilação condicional OR
.
Deixe-me explicar:Quero poder especificar um detalhado compilação por configuração V=1
ou VERBOSE=1
.eu quero manter VERBOSE=1
disponível porque temos alguns scripts que fazem uso dele (e usamos outros makefiles apenas cientes de VERBOSE
)
Portanto, o resultado deve ser que esses dois comandos sejam iguais:
make all VERBOSE=1 # pain to write
make all V=1
Agora, meu makefile está assim hoje:
ifdef VERBOSE
[issue compilation commands with verbose mode]
endif
O que eu gostaria de alcançar está próximo do pré-processador em C:
if defined(VERBOSE) || defined(V)
[issue compilation commands with verbose mode]
endif
voce sabe como fazer isso?
Solução
Eu gosto disso:
ifneq "$(or $(LINUX_TARGET),$(OSX_TARGET))" ""
endif
Semelhante à abordagem $(strip, mas usando a abordagem mais intuitiva $(ou palavra-chave
Outras dicas
VERBOSE := $(or $(VERBOSE),$(V))
...então...
ifeq ($(VERBOSE),1)
#Conditional stuff
endif
Até onde eu sei, o material condicional no GNU make não permite ORs e ANDS.Você sempre pode fazer algo como:
ifdef VERBOSE
DOVERBOSE = yes
endif
ifdef V
DOVERBOSE = yes
endif
ifeq( $DOVERBOSE, yes )
main verbose stuff here
endif
mas não vejo por que você precisa introduzir a definição (dificilmente autodocumentada) de V em primeiro lugar.
Gosto da abordagem de Neil Butterworth, mas se você realmente quiser fazer isso no estilo que descreve, isso lhe dará OR:
ifneq "$(strip $(VERBOSE) $(V))" ""
[be verbose]
endif
Ok, muito tarde para a festa, mas me deparei com isso e queria adicionar outra solução para outras pessoas que estavam procurando como adicionar lógica aos makefiles:basicamente, faça a lógica em um shell e obtenha a saída dessa forma.
ifneq ( $(shell ( [ $(VERBOSE) ] || [ $(V) ] ) && echo y ),)
parece mais complicado, mas se você tiver uma instrução if com muitos ands e ors, isso oferece muita flexibilidade e seria mais fácil de ler do que $(and .. aninhados).$(ou ...)) declarações.