我正在尝试编写需要ALSA或OSS标头的应用程序。基本上,如果/etc/oss.conf不存在,我想将一个定义传递给编译器,因为这可能意味着soundcard.h头不存在(随意在那个上纠正我,我还是新的与OSS合作)。根据OSS文档,您将使用include指令,如:
include /etc/oss.conf
CFLAGS := -I$(OSSLIBDIR)/include/sys
一个问题。 OSS支持是可选的,所以我想检查标头是否存在,如果存在,则将定义传递给编译器。问题是,AFAIK无法检查文件是否存在于makefile 规则之外。在规则内部,如果我使用if语句,由于某种原因,尝试设置CFLAGS不会改变它:
test: $(objects)
@if [ -f ${OSS_CONFIG} ]; then \
. ${OSS_CONFIG}; \
CFLAGS+=" -I${OSSLIBDIR} -DUSE_OSS"; \
fi
@echo ${CFLAGS}
(上面只输出CFLAGS的原始值,即使存在${OSS_CONFIG}
。)这当然非常难看,我想知道是否有更清洁的方法。或者我正在采取的方式引发一场涉及小猫种族灭绝的全球性灾难性事件?
哦,请不要告诉我使用autoconf。
答案 0 :(得分:11)
一个建议:使用-include
(然后它不会发出警告+失败时退出)。不过,我不知道自己是否能够使用这种语法。
另一个hack可能是:DUMMY_VAR := $(shell ... )
执行任意代码。我认为这更不可能奏效。
除此之外,我认为这是可能的。当我最近查看类似的问题时,我发现在makefile创建过程中我无法运行任意shell命令。
答案 1 :(得分:10)
是的,有一种更清洁的方式。您可以使用wildcard
函数测试文件是否存在,然后使用ifeq
/ endif
设置相应的CFLAGS
。如果您将与音频相关的标记粘贴到AUDIO_CFLAGS
之类的内容,那么您可以在整个Makefile中自动包含正确的标记集。
它看起来像这样:
OSS_CONF_FILE := $(strip $(wildcard /etc/oss.conf))
ifeq ($OSS_CONF_FILE,)
AUDIO_CFLAGS = "-I$(ALSALIBDIR) -DUSE_ALSA"
else
AUDIO_CFLAGS = "-I${OSSLIBDIR} -DUSE_OSS"
endif
sample_build_rule:
$(CC) $(CFLAGS) $(AUDIO_CFLAGS) ...