Autoconf:如何将安装路径导入config.h

时间:2011-05-03 08:47:26

标签: autoconf

我的程序需要在运行时加载一些文件,这些文件将被安装到./configure --datadir=/somewhere

的任何文件夹中

由于我的程序需要知道此文件夹在运行时的位置,我需要在某处#define一个符号,以便C代码可以作为字符串访问路径。

我目前正在修改编译器标志:

AM_CPPFLAGS = -DDATA_PATH=\"$(pkgdatadir)\"

然而,由于配置脚本已经生成了一个包含其他内容的config.h文件,我希望在那里出现符号。

这可能吗?

4 个答案:

答案 0 :(得分:6)

您的解决方案是正确的。 Autoconf / Automake不支持(轻松)支持将安装路径放入config.h的原因是理论上你应该能够在构建时覆盖路径,如make prefix=/else/where。这种可能性现在有些神秘,但这就是原因。 (请注意,这与[{1}}不同,尽管有make install prefix=/else/where/,但它仍然有用。)

答案 1 :(得分:6)

您的回答是首选方式。 autoconf手册解释了如何在“make install”时覆盖各种变量(例如,这对包装非常有用)。这样做(在“安装目录变量”部分中):

   A corollary is that you should not use these variables except in
makefiles.  For instance, instead of trying to evaluate `datadir' in
`configure' and hard-coding it in makefiles using e.g.,
`AC_DEFINE_UNQUOTED([DATADIR], ["$datadir"], [Data directory.])', you
should add `-DDATADIR='$(datadir)'' to your makefile's definition of
`CPPFLAGS' (`AM_CPPFLAGS' if you are also using Automake).

autotools和一般的构建系统是一个令人费解的事业,没有人能够提出一些很好的方法来做一般性的事情,这意味着我们必须阅读像这样的部分并完全解决。无论如何,你的直觉是正确的!

答案 2 :(得分:5)

AC_DEFINE_UNQUOTED([DATA_PATH], ["$pkgdatadir"])

虽然修改编译器标志实际上是更常用的方法。

答案 3 :(得分:1)

如果您的源代码必须知道一系列此类路径,并且您希望避免编译中的过多噪音(例如-DPATH1 = / path / to / something -DPATH2 = / path2 / to / something2 -DPATH3 = / path3 / to / something3 ... ad infinitum),对某些人来说可能需要的另一种选择是用行创建一个新的“mynewheader.h.in”

#define PATH1 "@PATH1@"
#define PATH2 "@PATH2@"
#define PATH3 "@PATH3@"

并将其添加到您的configure.ac的AC_CONFIG_FILES行,例如:

AC_CONFIG_FILES([Makefile mynewheader.h])