2010-10-11 21 views
7

Estoy tratando de escribir una aplicación que necesita encabezados ALSA o OSS. Básicamente, quiero pasar una definición al compilador si /etc/oss.conf no existe, ya que eso probablemente signifique que el encabezado soundcard.h no existe (no dude en corregirme en ese, sigo siendo nuevo para trabajar con OSS). De acuerdo con la documentación de OSS, usted usaría la directiva include de la siguiente manera:Makefile conditional include

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

Un problema. El soporte de OSS es opcional, por lo que me gustaría verificar si el encabezado existe, y si lo hace, pasarle una definición al compilador. El problema es que, AFAIK, no hay manera de comprobar si existe un archivo fuera de un archivo make regla. Dentro de la norma, si uso una declaración si, por alguna razón, tratando de establecer CFLAGS no altera que:

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

(Lo anterior simplemente devuelve el valor original de CFLAGS, incluso si existe ${OSS_CONFIG}.) Este es, por supuesto, extremadamente feo, y me pregunto si hay una forma más limpia de hacerlo. ¿O es que la forma en que voy sobre esto va a desencadenar un evento cataclísmico mundial que involucre el genocidio de los gatitos?

Ah, y por favor no me diga que use autoconf.

+2

Por desgracia, este tipo de cosas es por eso que el abominable sistema conocido como "autoconf" consiguió creado en el primer lugar. Antes de autoconf, crearías manualmente un script 'config' que es bastante fácil de hacer si dominas el dialecto de subconjuntos comunes de'/bin/sh' que funciona en cualquier plataforma unix donde se ejecute tu código. Muchas personas todavía juran por la mano crear tu propio script de configuración ... También he escuchado que CMAKE es otra salida, pero no sé lo suficiente como para basar una respuesta en eso. – RBerteig

+0

Puedo recomendar encarecidamente CMake. Buen material. – JesperE

Respuesta

8

Una sugerencia: use -include (entonces no avisará + salga en caso de fallo). Aunque no sé si alguna vez obtuve esta sintaxis para trabajar.

Otro truco podría ser algo así como: DUMMY_VAR := $(shell ...) para ejecutar código arbitrario. Creo que esto es incluso menos probable que funcione.

Aparte de eso, no creo que esto sea posible. Cuando analicé recientemente un problema similar, descubrí que no puedo hacer que make ejecute comandos de shell arbitrarios durante el proceso de creación de archivos.

+0

Guau, no estaba al tanto de '-include'. Muchas gracias por eso, eso prácticamente resolvió mi problema. Solo puedo usar un 'ifdef OSSLIBDIR' después del include y luego asignar' CFLAGS' en consecuencia. Prestigio. – dav

5

Sí, hay una manera más limpia. Puede probar la existencia de un archivo con la función wildcard y luego usar ifeq/endif para configurar el CFLAGS apropiado. Si pegas las banderas relacionadas con el audio en algo como AUDIO_CFLAGS, entonces puedes incluir automáticamente el conjunto correcto de banderas en todo el Makefile.

Se verá algo como esto:

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

Eso también funciona, aunque creo que me quedaré con '-include' y usar' ifdef' solo por el bien de la claridad. Un buen punto sobre el uso de una variable separada para el CFLAGS específico de la biblioteca, creo que usaré eso. – dav

+0

Eso es bueno, eso casi resuelve mi problema también. Por curiosidad, ¿sabes si hay una forma de usar un ciclo 'foreach' en los makefiles? Específicamente, estoy buscando hacer algo como: 'foreach DIR in (ls) -include DIR/Rules.mk' –

+0

' include' tomará varios archivos y expandirá comodines. ¿'-include */Rules.mk' no funciona para usted? –