在Python中访问autoconf定义的符号

1 投票
3 回答
575 浏览
提问于 2025-04-15 18:56

我正在做一个项目,这个项目是用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

补充一下被接受的答案:如果你想使用自定义变量,一定要用到 AC_SUBST,而不仅仅是 AC_DEFINE[_UNQUOTED],否则你的配置文件里什么都不会被替换。根据另一个答案的提示,我在我的 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/'''
0

pyparsing wiki的示例页面上有一个关于宏扩展器的例子,具体可以查看这个链接。这里有一段它处理的示例代码:

#def A 100
#def ALEN A+1

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

这个宏扩展器还可以处理那些是基于其他宏定义的宏。把'#def'改成'#define'应该也不难。

4

AC_INIT 不仅定义了一些预处理符号,还定义了一些输出变量。当你在 AC_CONFIG_FILES 宏中列出一个文件,比如叫 somefile,你的 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@'''

使用三重引号是个明智的选择,因为你永远不知道输出变量里会不会有引号。

撰写回答