2011-05-16 19 views
12

Me gustaría habilitar una compilación detallada en mi archivo MAKE, pero no puedo entender cómo hacer un OR condicional.O condicional en makefile

Me explico: yo quiero ser capaz de especificar una compilación verbosa ya sea mediante el establecimiento de V=1oVERBOSE=1. Quiero mantener VERBOSE=1 disponible porque tenemos algunos scripts que hacen uso de ella (y utilizan otros archivos make sólo es consciente de VERBOSE)

Así, el resultado debe ser que estos dos comandos son los mismos:

make all VERBOSE=1 # pain to write 
make all V=1 

ahora, mi makefile se parece a esto hoy:

ifdef VERBOSE 
[issue compilation commands with verbose mode] 
endif 

lo que me gustaría lograr es cerca del preprocesador en C:

if defined(VERBOSE) || defined(V) 
[issue compilation commands with verbose mode] 
endif 

¿Sabes cómo hacer eso?

+0

ifeq http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or –

Respuesta

11

hago así:

ifneq "$(or $(LINUX_TARGET),$(OSX_TARGET))" "" 

endif 

similares al $ (enfoque de la tira, pero utilizando los más intuitivos $ (o palabra clave

+1

Niiiiice, esta es la forma más clara. No sabía sobre el 'o'. – Gui13

+0

Cambié para aceptar su respuesta, porque es semánticamente la solución exacta de mi problema. – Gui13

4

Hasta donde yo sé, las cosas condicionales en GNU make no permiten ORs y ANDS. Siempre se puede hacer algo como:

ifdef VERBOSE 
DOVERBOSE = yes 
endif 
ifdef V 
DOVERBOSE = yes 
endif 

ifeq($DOVERBOSE, yes) 
    main verbose stuff here 
endif 

pero no veo por qué tiene que introducir el (casi autodocumentado) definen de V en el primer lugar.

+0

¿Qué tal 'ifdef V \ VERBOSE = v \ endif' y deja el resto tal como está? – Beta

+0

@Beta no está mal también! Pero me gusta tu respuesta mejor. – Gui13

3

me gusta el enfoque de Neil Butterworth, pero si realmente quiere hacerlo en el estilo que usted describe, esto le dará O:

ifneq "$(strip $(VERBOSE) $(V))" "" 
[be verbose] 
endif 
+0

Eso es perfecto :) – Gui13

3
VERBOSE := $(or $(VERBOSE),$(V)) 

... entonces ...

ifeq ($(VERBOSE),1) 
#Conditional stuff 
endif 
0

Ok, muy tarde a la fiesta, pero me encontré con esto, y quería añadir otra solución para otras personas que estaban buscando la manera de añadir lógica a los archivos make: básicamente, hacer la lógica en un shell, y obtener la salida de esa manera.

ifneq ($(shell ([ $(VERBOSE) ] || [ $(V) ]) && echo y),) 

parece más complicado, pero si usted tiene una sentencia if con muchas e Ys, esto ofrece una gran flexibilidad, y sería más fácil de leer que $ anidada (y .. $ (o .. .)) declaraciones.

+0

Ofrece "mucha flexibilidad", excepto que le limita el uso del shell específico al que lo codifica (en su caso, BASH) – villapx