2011-10-05 10 views
75

Come si esegue un operatore logico OR usando del make ifeq?Makefile ifeq logico o

esempio, ho (semplificato):

ifeq ($(GCC_MINOR), 4) 
    CFLAGS += -fno-strict-overflow 
endif 
ifeq ($(GCC_MINOR), 5) 
    CFLAGS += -fno-strict-overflow 
endif 

ma vorrebbe consolidare tali linee.

(sì, sì, autotools, configurare, ecc ecc; troppo mano pesante per l'attuale situazione, vorrebbe tenere tutto all'interno del Makefile qui)

[opposta logica di questa domanda: How to Use of Multiple condition in 'ifeq' statement]

+0

Possibile duplicato * [Condizioni controllo complesso in Makefile] (http://stackoverflow.com/questions/ 5584872/complessi-condizioni-check-in-makefile) *. –

+0

Non pensate che sia un errore, la domanda collegata si riferisce al concatenamento degli operatori 'ifdef', questa domanda è legata al concatenamento degli operatori' ifeq', simili, ma le risposte sono decisamente diverse. – Pat

+0

Simile a [Esiste un operatore logico 'OR' per' ifneq'?] (Http://stackoverflow.com/q/8296723/471376) – JamesThomasMoon1979

risposta

68

come si trova l'archivio mailing list,

si può usare la funzione di filtro .

Ad esempio

ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5)) 

filtro X, AB restituirà quelle di A, B che sono uguali X.

Una variante di questo è

ifneq (,$(filter $(GCC_MINOR),4 5)) 

cui un negativo viene invece utilizzato il confronto con una stringa vuota (il filtro restituirà una stringa vuota se GCC_MINOR d o non è in linea con gli argomenti)

Lo svantaggio di questi metodi è che gli argomenti devono essere parole singole.

+5

Una nota tardiva: nelle due varianti che hai sopra, la prima sarà vera se $ (GCC_MINOR) è vuota, mentre la seconda no (quindi la seconda è la soluzione migliore in generale). – John

+1

In realtà, dovrebbe essere "ifneq (, $ (filtro 4 5, $ (GCC_MINOR)))' :) – Tuxdude

+2

Forse è meglio partire così com'è per semplicità? – Jason

20

È possibile introdurre un'altra variabile. Esso non consolidare entrambi i controlli, ma almeno evita di dover mettere il corpo in due volte:

do_it = 
ifeq ($(GCC_MINOR), 4) 
    do_it = yes 
endif 
ifeq ($(GCC_MINOR), 5) 
    do_it = yes 
endif 
ifdef do_it 
    CFLAGS += -fno-strict-overflow 
endif 
+4

La manutenibilità di questo in scala non mi sembra molto buona:/ Quindi, una volta che iniziamo a parlare di scala, suppongo che stiamo parlando di autotools – Pat

+0

@Pat: Preferisco piuttosto questo approccio in cui posso separare il compito in un posto nel Makefile, possibilmente confrontandolo con altri valori usando ifeq/else ifeq/else, piuttosto che usare la funzione filtro che potrebbe semplicemente rendere le righe difficili da leggere e difficili da leggere. – jcarballo

12

Non credo ci sia un modo sensato conciso per farlo, ma ci sono verbosi, modi sensibili (come ad come Foo Bah di) e conciso, modi patologiche, come

ifneq (,$(findstring $(GCC_MINOR),4-5)) 
    CFLAGS += -fno-strict-overflow 
endif 

(che eseguirà il comando a condizione che la stringa $ (GCC_MINOR) appare all'interno della stringa 4-5).

+2

Nel bene o nel male (probabilmente peggio), solo il tipo di trucco sporco che stavo cercando; grazie – Pat

+1

Non penso che questo sia patologico, a parte il fatto che * tutto * in un Makefile è patologico. È davvero molto elegante. Ho letto quattro o cinque modi diversi per realizzare questo, e il tuo è di gran lunga il più facile da capire. –

0
ifeq ($(GCC_MINOR), 4) 
    CFLAGS += -fno-strict-overflow 
endif 
ifeq ($(GCC_MINOR), 5) 
    CFLAGS += -fno-strict-overflow 
endif 

Un altro si può considerare l'utilizzo in questo caso è:

GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])") 

# -Wstrict-overflow: http://www.airs.com/blog/archives/120 
ifeq ($(GCC42_OR_LATER),1) 
    CFLAGS += -Wstrict-overflow 
endif 

Io in realtà utilizzano lo stesso nel mio codice perché non voglio mantenere un separato config o Configure.

Ma è necessario utilizzare un portatile, non anemico make, come GNU make (gmake) e non Posix's make.

E non affronta il problema della logica AND e OR.

3

variante Qui più flessibile: utilizza guscio esterno, ma permette di verificare la presenza di condizioni arbitrarie:

ifeq ($(shell test ".$(GCC_MINOR)" = .4 -o \ 
        ".$(GCC_MINOR)" = .5 -o \ 
        ".$(TODAY)"  = .Friday && printf "true"), true) 
    CFLAGS += -fno-strict-overflow 
endif