【问题标题】:Autoconf: How to get installation paths into config.hAutoconf:如何将安装路径放入 config.h
【发布时间】:2011-08-17 13:13:21
【问题描述】:

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

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

我目前正在通过修改编译器标志来做到这一点:

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

但是,由于配置脚本已经生成了一个包含许多其他内容的 config.h 文件,我希望将符号显示在其中。

这可能吗?

【问题讨论】:

    标签: autoconf


    【解决方案1】:

    您的答案是首选方式。 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】:
      AC_DEFINE_UNQUOTED([DATA_PATH], ["$pkgdatadir"])
      

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

      【讨论】:

      • 谢谢!以“通常”的方式进行操作有什么好处吗?我完全赞成遵守标准,但它看起来更混乱。
      • 优点是可以在配置时通过./configure CPPFLAGS=-DDATA_PATH=/path/to/alternate/data覆盖CPPFLAGS;使用 config.h 执行此操作需要 ./configure --prefix=/alternate/prefix,这样您就可以较少控制各种目录的位置。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如果您的源代码必须知道一系列此类路径,并且您希望避免编译中出现过多的噪音(例如 -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])
        

        【讨论】:

          猜你喜欢
          • 2010-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-30
          • 1970-01-01
          • 2011-11-21
          • 2012-08-11
          • 1970-01-01
          相关资源
          最近更新 更多