2010-10-11 14 views
7

Sto provando a scrivere un'applicazione che necessita di intestazioni ALSA o OSS. Fondamentalmente, voglio passare un define al compilatore se /etc/oss.conf non esiste, dal momento che probabilmente l'intestazione soundcard.h non esiste (sentiti libero di correggermi su quello, sono ancora nuovo lavorare con l'OSS). Per la documentazione OSS, si dovrebbe usare la direttiva include in questo modo:Il condizionale del makefile include

include /etc/oss.conf 
CFLAGS := -I$(OSSLIBDIR)/include/sys 

Un problema. Il supporto OSS è facoltativo, quindi vorrei verificare se l'intestazione esiste e, in caso affermativo, passare una definizione al compilatore. Il problema è, AFAIK non c'è modo di verificare se un file esiste al di fuori di un makefile regola. All'interno della regola, se uso un'istruzione if, per qualche ragione, cercando di impostare CFLAGS non altera esso:

test: $(objects) 
    @if [ -f ${OSS_CONFIG} ]; then \ 
    . ${OSS_CONFIG}; \ 
    CFLAGS+=" -I${OSSLIBDIR} -DUSE_OSS"; \ 
    fi 
    @echo ${CFLAGS} 

(Quanto sopra solo emette il valore originale di CFLAGS, anche se ${OSS_CONFIG} esiste). Questa è, ovviamente, estremamente brutto, e mi chiedo se c'è un modo più pulito per farlo. O è il modo in cui sto andando per innescare un evento catastrofico in tutto il mondo che coinvolge il genocidio dei gattini?

Oh, e per favore non dirmi di usare autoconf.

+2

Purtroppo, questo genere di cose è il motivo per cui il sistema abominevole noto come "autoconf" ha ottenuto creato in primo luogo. Prima di autoconf, dovresti creare uno script 'config' che è abbastanza facile da fare se sei fluente nel dialetto di sottoinsieme comune di'/bin/sh' che funziona su ogni piattaforma unix in cui il tuo codice potrebbe essere eseguito. Un sacco di persone ancora imprecano a mano costruendo il proprio script di configurazione ... Ho anche sentito che CMAKE è un'altra via d'uscita, ma non ne so abbastanza per basare una risposta su questo. – RBerteig

+0

Posso consigliare vivamente CMake. Roba buona. – JesperE

risposta

8

Un suggerimento: utilizzare -include (quindi non avviserà + esci in caso di errore). Non so se ho mai avuto questa sintassi per lavorare da solo, però.

Un'altra modifica potrebbe essere qualcosa del tipo: DUMMY_VAR := $(shell ...) per eseguire codice arbitrario. Penso che sia ancora meno probabile che funzioni.

Oltre a ciò, non credo sia possibile. Di recente, quando ho esaminato un problema simile, ho scoperto che non riesco a eseguire make per eseguire comandi shell arbitrari durante il processo di creazione del makefile.

+0

Wow, ero completamente inconsapevole di '-include'. Grazie mille per questo, questo ha praticamente risolto il mio problema. Posso solo usare un 'ifdef OSSLIBDIR' dopo l'inclusione e quindi assegnare' CFLAGS' di conseguenza. Complimenti. – dav

5

Sì, c'è un modo più pulito. È possibile verificare l'esistenza di un file con la funzione wildcard e quindi utilizzare ifeq/endif per impostare l'appropriato CFLAGS. Se si attaccano i flag relativi all'audio in qualcosa come AUDIO_CFLAGS, allora è possibile includere automaticamente il set di flag corretto in tutto il Makefile.

sembrerà qualcosa di simile:

OSS_CONF_FILE := $(strip $(wildcard /etc/oss.conf)) 

ifeq ($OSS_CONF,) 
    AUDIO_CFLAGS = "-I$(ALSALIBDIR) -DUSE_ALSA" 
else 
    AUDIO_CFLAGS = "-I${OSSLIBDIR} -DUSE_OSS" 
endif 


sample_build_rule: 
    $(CC) $(CFLAGS) $(AUDIO_CFLAGS) ... 
+0

Funziona bene, anche se penso che rimarrò con '-include' e usando' ifdef' solo per motivi di chiarezza. Buon punto sull'utilizzo di una variabile separata per i CFLAGS specifici della libreria, penso che la userò. – dav

+0

Questo è pulito, che risolve quasi anche il mio problema. Per curiosità, sai se esiste un modo per usare un ciclo 'foreach' nei makefile? In particolare, sto cercando di fare qualcosa del tipo: 'foreach DIR in (ls) -include DIR/Rules.mk' –

+0

' include' prenderà più file e espanderà i caratteri jolly. '-include */Rules.mk' non funziona per te? –

Problemi correlati