Makefile conditionnel include

J’essaie d’écrire une application qui nécessite des en-têtes ALSA ou OSS. En gros, je veux passer une définition au compilateur si /etc/oss.conf n’existe pas, car cela signifie probablement que l’en-tête soundcard.h n’existe pas (n’hésitez pas à me corriger, je suis toujours nouveau) travailler avec des logiciels libres). Selon la documentation OSS, vous utiliseriez la directive include comme suit:

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

Un problème. Le support OSS est facultatif, je voudrais donc vérifier si l’en-tête existe, et si c’est le cas, passez une définition au compilateur. Le problème est, autant que je sache, il n’existe aucun moyen de vérifier si un fichier existe en dehors d’une règle de makefile. Dans la règle, si j’utilise une instruction if, pour une raison quelconque, essayer de définir CFLAGS ne la modifie pas:

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

(Ce qui précède ne donne que la valeur originale de CFLAGS, même si ${OSS_CONFIG} existe.) C’est, bien sûr, extrêmement moche, et je me demande s’il existe une méthode plus propre pour le faire. Ou est-ce que ma façon de procéder va déclencher un cataclysme mondial impliquant le génocide des chatons?

Oh, et s’il te plait ne me dis pas d’utiliser autoconf.

Une suggestion: utilisez -include (alors il ne sera pas averti + quitter en cas d’échec). Cependant, je ne sais pas si cette syntaxe a déjà fonctionné moi-même.

Un autre hack pourrait être quelque chose du DUMMY_VAR := $(shell ... ) : DUMMY_VAR := $(shell ... ) pour exécuter du code arbitraire. Je pense que cela est encore moins susceptible de fonctionner.

En dehors de cela, je ne pense pas que cela soit possible. Récemment, lorsque je me suis penché sur un problème similaire, j’ai constaté que je ne pouvais pas utiliser make pour exécuter des commandes de shell arbitraires lors du processus de création du fichier makefile.

Oui, il y a un moyen plus propre. Vous pouvez tester l’existence d’un fichier avec la fonction wildcard , puis utiliser ifeq / endif pour configurer les CFLAGS appropriés. Si vous collez les indicateurs liés à l’audio dans quelque chose comme AUDIO_CFLAGS vous pouvez automatiquement inclure le jeu correct d’indicateurs dans l’ensemble du fichier Makefile.

Ça va ressembler à quelque chose comme ça:

 OSS_CONF_FILE := $(ssortingp $(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) ...