【发布时间】:2011-04-24 00:41:23
【问题描述】:
我正在尝试编写一个需要 ALSA 或 OSS 标头的应用程序。基本上,如果 /etc/oss.conf 不存在,我想将定义传递给编译器,因为这可能意味着 soundcard.h 标头不存在(请随时纠正我,我还是新手与 OSS 合作)。根据 OSS 文档,您可以像这样使用 include 指令:
include /etc/oss.conf
CFLAGS := -I$(OSSLIBDIR)/include/sys
一个问题。 OSS 支持是可选的,所以我想检查头文件是否存在,如果存在,将定义传递给编译器。问题是,AFAIK 无法检查文件是否存在于 makefile rule 之外。在规则内部,如果我使用 if 语句,出于某种原因,尝试设置 CFLAGS 不会改变它:
test: $(objects)
@if [ -f ${OSS_CONFIG} ]; then \
. ${OSS_CONFIG}; \
CFLAGS+=" -I${OSSLIBDIR} -DUSE_OSS"; \
fi
@echo ${CFLAGS}
(上面只是输出CFLAGS的原始值,即使${OSS_CONFIG}存在。)当然,这非常丑陋,我想知道是否有更清洁的方法来做到这一点。还是我打算这样做会引发一场涉及小猫种族灭绝的全球灾难性事件?
哦,请不要告诉我使用 autoconf。
【问题讨论】:
-
不幸的是,这种事情是最初创建被称为“autoconf”的可恶系统的原因。在 autoconf 之前,您将手工制作一个
config脚本,如果您精通/bin/sh的通用子集方言,这很容易做到,该方言适用于您的代码可能运行的每个类 unix 平台。很多人仍然发誓要手工制作自己的配置脚本……我还听说 CMAKE 是另一种出路,但对它的了解还不够,无法以此为基础。 -
我强烈推荐 CMake。好东西。
标签: c makefile alsa open-source