Makefile条件包括

dav*_*dav 13 c open-source makefile alsa

我正在尝试编写一个需要ALSA或OSS标头的应用程序.基本上,如果/etc/oss.conf不存在,我想将一个定义传递给编译器,因为这可能意味着soundcard.h头不存在(随意在那个上纠正我,我还是新的与OSS合作).根据OSS文档,您将使用include指令,如下所示:

include /etc/oss.conf
CFLAGS := -I$(OSSLIBDIR)/include/sys
Run Code Online (Sandbox Code Playgroud)

一个问题.OSS支持是可选的,所以我想检查标头是否存在,如果存在,则将定义传递给编译器.问题是,AFAIK无法检查文件是否存在于makefile 规则之外.在规则内部,如果我使用if语句,由于某种原因,尝试设置CFLAGS不会改变它:

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

(上面只输出CFLAGS的原始值,即使${OSS_CONFIG}存在.)这当然是非常难看的,我想知道是否有更清洁的方法来做到这一点.或者我正在采取的方式引发一场涉及小猫种族灭绝的全球性灾难性事件?

哦,请不要告诉我使用autoconf.

Ale*_*ece 12

一个建议:使用-include(然后它不会警告+退出失败).不过,我不知道自己是否能够使用这种语法.

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

除此之外,我认为这是可能的.当我最近查看类似的问题时,我发现在makefile创建过程中我无法运行任意shell命令.


Joh*_*lin 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) ...
Run Code Online (Sandbox Code Playgroud)