2010-10-11 13 views
7

Próbuję napisać aplikację, która potrzebuje nagłówków ALSA lub OSS. Zasadniczo chcę przekazać definicję do kompilatora, jeśli plik /etc/oss.conf nie istnieje, ponieważ prawdopodobnie oznacza to, że nagłówek soundcard.h nie istnieje (nie krępuj się poprawić mnie na tym, wciąż jestem nowy do pracy z OSS). Zgodnie z dokumentacją OSS użyjesz dyrektywy include tak:Warunek Makefile:

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

Jeden problem. Obsługa OSS jest opcjonalna, więc chciałbym sprawdzić, czy nagłówek istnieje, a jeśli tak, przekazać definicję do kompilatora. Problem polega na tym, że AFAIK nie ma możliwości sprawdzenia, czy plik istnieje poza plikiem Makefile Reguła. Wewnątrz reguły, jeśli używam if, z jakiegoś powodu, starając się ustawić CFLAGS nie zmienia go:

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

(Powyższy prostu wyprowadza oryginalny wartość flagami, nawet jeśli ${OSS_CONFIG} istnieje). To jest oczywiście wyjątkowo brzydka i zastanawiam się, czy jest na to czystszy sposób. A może tak zamierzam wywołać ogólnoświatowe kataklizmystyczne wydarzenie z udziałem ludobójstwa kociąt?

Aha, i proszę nie mów mi, żebym używał autoconf.

+2

Niestety, tego typu rzeczy to dlaczego system znany jako „wstrętny” został stworzony autoconf w pierwszej kolejności. Przed autoconfem możesz ręcznie napisać skrypt 'config', który jest dość łatwy do zrobienia, jeśli płynnie posługujesz się dialektem common-podzbioru'/bin/sh', który działa na każdej uniksowej platformie, na której może działać Twój kod. Wiele osób wciąż przysięga na ręczne tworzenie własnego skryptu konfiguracyjnego ... Słyszałem też, że CMAKE to kolejna droga wyjścia, ale nie wiem wystarczająco dużo, aby znaleźć na to odpowiedź. – RBerteig

+0

Mogę zdecydowanie polecić CMake. Dobry towar. – JesperE

Odpowiedz

8

Jedna z propozycji: użyj -include (wtedy nie będzie ostrzegać + zakończyć po awarii). Nie wiem jednak, czy kiedykolwiek mam taką składnię do wykonania.

Kolejny hack może być czymś w rodzaju: DUMMY_VAR := $(shell ...) do wykonania dowolnego kodu. Myślę, że to jeszcze mniej prawdopodobne, że zadziała.

Poza tym nie sądzę, że jest to możliwe. Kiedy ostatnio zaglądałem do podobnego problemu, odkryłem, że nie mogę zrobić, aby uruchamiać dowolne polecenia powłoki podczas procesu tworzenia pliku Makefile.

+0

Wow, byłem całkowicie nieświadomy '-include'. Dziękuję bardzo za to, że prawie rozwiązałem mój problem. Mogę po prostu użyć 'ifdef OSSLIBDIR' po uwzględnieniu, a następnie odpowiednio przypisać' CFLAGS'. Sława. – dav

5

Tak, istnieje czystszy sposób. Możesz przetestować istnienie pliku z funkcją wildcard, a następnie użyć ifeq/endif, aby skonfigurować odpowiednie CFLAGS. Jeśli przykleisz flagę związaną z dźwiękiem do czegoś podobnego do AUDIO_CFLAGS, możesz automatycznie włączyć poprawny zestaw flag w pliku Makefile.

To będzie wyglądać mniej więcej tak:

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

To również działa, chociaż myślę, że będę trzymać się '-include' i używając' ifdef' tylko ze względu na jasność. Dobra uwaga dotycząca używania oddzielnej zmiennej dla CFLAGS specyficznych dla biblioteki, myślę, że wykorzystam to. – dav

+0

To jest schludne, to prawie rozwiązuje mój problem. Czy z ciekawości wiesz, czy istnieje sposób na wykorzystanie pętli 'foreach' w plikach Makefile? W szczególności, zamierzam zrobić coś takiego: 'foreach DIR in (ls) -include DIR/Rules.mk' –

+0

' include' zajmie wiele plików i rozwinie symbole wieloznaczne. Czy '-include */Rules.mk' nie działa dla ciebie? –