在python中访问autoconf定义的符号

时间:2010-02-05 17:14:59

标签: python c autotools autoconf

我正在开发一个用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中访问这些定义的标准方法。

3 个答案:

答案 0 :(得分:3)

AC_INIT不仅定义了预处理程序符号,还定义了输出变量。当您列出文件时,我们称之为somefile,在AC_CONFIG_FILES宏中,您的configure脚本会查找名为somefile.in的文件,并替换任何输出变量的名称@ -signs与其值之间,调用结果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@'''

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

答案 1 :(得分:0)

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

#def A 100
#def ALEN A+1

char Astring[ALEN];
char AA[A];
typedef char[ALEN] Acharbuf;

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

答案 2 :(得分:0)

添加到accepted answer:如果您对自定义变量感兴趣,请确保在AC_SUBST之外使用AC_DEFINE[_UNQUOTED],否则配置文件中不会替换任何内容。使用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/'''