21

我正在尝试编写一个需要 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。

4

2 回答 2

26

一个建议:使用-include(然后它不会警告+失败时退出)。不过,我不知道我是否已经完全掌握了这种语法来自己工作。

另一个 hack 可能是:DUMMY_VAR := $(shell ... )执行任意代码。我认为这更不可能奏效。

除此之外,我认为这是可能的。当我最近研究一个类似的问题时,我发现在 makefile 创建过程中我无法让 make 运行任意 shell 命令。

于 2010-10-11T21:27:27.270 回答
14

是的,有一种更清洁的方法。您可以使用该功能测试文件是否存在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) ...
于 2010-10-11T21:41:22.263 回答