在Python中访问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 个回答
补充一下被接受的答案:如果你想使用自定义变量,一定要用到 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/'''
pyparsing wiki的示例页面上有一个关于宏扩展器的例子,具体可以查看这个链接。这里有一段它处理的示例代码:
#def A 100
#def ALEN A+1
char Astring[ALEN];
char AA[A];
typedef char[ALEN] Acharbuf;
这个宏扩展器还可以处理那些是基于其他宏定义的宏。把'#def'改成'#define'应该也不难。
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@'''
使用三重引号是个明智的选择,因为你永远不知道输出变量里会不会有引号。