我知道当我从源代码安装Linux应用程序时,执行./configure --sysconfdir=/etc
,然后此应用程序的conf文件(例如httpd.conf
)将转到/etc
。
但从源代码的角度来看,源代码在解析时如何知道conf文件在/etc
下。我的意思是像fopen("/../../app.conf", "r");
这样的代码在我们安装之前确定,配置文件是否会改变源代码或其他机制?
答案 0 :(得分:5)
configure
脚本将生成必要的Makefile
,它将使用C编译器的-DMACRO=content
功能基本上将C预处理器#define MACRO content
语句注入编译单元。因此,sysconfdir
可以通过制定规则使用:
foo.o: foo.c
$(CC) -DCONFDIR=$(sysconfdir) -o $@ $<
(这表示在foo.o
更新时构建foo.c
目标文件;要构建它,使用$(CC)
变量运行C编译器,定义CONFDIR
$(sysconfdir)
的内容(通过./configure
脚本提供),将输出放入目标文件($@
)并将源文件($<
)作为单独输入编译器。))
然后foo.c
中的C代码可以像这样使用它:
FILE *conf;
if (conf = fopen(CONFDIR "/foo", "r")) {
/* read config file */
} else {
/* unable to open config, either error and die or supply defaults */
}
注意在编译程序之前执行C string concatenation - 非常方便这种用途。
答案 1 :(得分:1)
执行./configure
时,它通常会生成一个包含C编译器命令选项的makefile。这些选项将包括-D...
选项(实际上)“#define”各种CPP符号。其中一个将具有您在运行./configure --sysconfdir=/etc
时提供的“/ etc”值。
从那里,“/ etc”字符串被编译到源代码使用#defined符号的任何地方的代码中。