【问题标题】:Accessing autoconf defined symbols in python在python中访问autoconf定义的符号
【发布时间】:2011-01-13 14:50:01
【问题描述】:

我正在开发一个用 C++ 和 python 编写的项目。我的 configure.ac 中有以下行:

AC_INIT(MILHOUSE, 0.3.6)

这意味着在运行configure生成的config.h中,我有如下定义行:

/* Define to the version of this package. */
#define PACKAGE_VERSION "0.3.6"  

我只是想知道是否存在用于解析这样的配置符号的现有模块,或者至少是在 python 中访问这些定义的标准方法。

【问题讨论】:

    标签: python c autotools autoconf


    【解决方案1】:

    添加到accepted answer:如果您对自定义变量感兴趣,请务必在AC_DEFINE[_UNQUOTED] 之外使用AC_SUBST,否则配置文件中不会替换任何内容。使用来自this other answer 的提示,我将此添加到我的configure.ac

    AC_DEFUN([AX_DEFINE_SUBST], [
    AC_DEFINE_UNQUOTED([$1], [$2], [$3])
    AC_SUBST([$1], [$2])
    ])
    ...
    AX_DEFINE_SUBST([OUTPUT_DIRECTORY], "$with_output", [output directory])
    

    所以在config.h 我明白了

    /* output directory */
    #define OUTPUT_DIRECTORY "/some/directory/"
    

    config.py.in是从

    output_directory = '''@OUTPUT_DIRECTORY@'''
    

    config.py

    output_directory = '''/some/directory/'''
    

    【讨论】:

      【解决方案2】:

      AC_INIT 不仅定义了预处理器符号,还定义了输出变量。当您列出一个文件时,我们称它为somefile,在您的AC_CONFIG_FILES 宏中,您的configure 脚本会查找一个名为somefile.in 的文件,并将@ 符号之间的任何输出变量的名称替换为它们的值,调用结果somefile

      因此,要在 Python 文件 somescript.py 中访问这些定义,请在您的 configure.ac 中添加类似这样的内容:

      AC_INIT(MILHOUSE, 0.3.6)
      ...blah blah...
      AC_CONFIG_FILES([
        some/Makefile
        some/other/Makefile
        somescript.py
      ])
      

      然后将您的 Python 文件命名为 somescript.py.in 并访问 PACKAGE_VERSION 输出变量,如下所示:

      version = '''@PACKAGE_VERSION@'''
      

      三重引号可能是明智的,因为您永远不知道输出变量何时可能包含引号。

      【讨论】:

      • 完美!很好的答案,正是我正在寻找的并且适用于其他环境(即非python)的内容。谢谢。
      【解决方案3】:

      pyparsing wiki 的示例页面包含宏扩展器的this example。这是它处理的示例代码:

      #def A 100
      #def ALEN A+1
      
      char Astring[ALEN];
      char AA[A];
      typedef char[ALEN] Acharbuf;
      

      因此它还将处理根据其他宏定义的宏。将 '#def' 更改为 '#define' 应该不难。

      【讨论】:

      • 这会起作用,但我正在寻找一种更通用的解决方案来从 python 访问配置时符号,而不是在运行时显式读取 config.h 文件。
      猜你喜欢
      • 1970-01-01
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多