Question

I'm working on a project that is written in both C++ and python. I have the following line in my configure.ac:

AC_INIT(MILHOUSE, 0.3.6)

which means that in the config.h generated by running configure, i have the following define line:

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

I just wanted to know if there was an existing module for parsing configure symbols like this or at least a standard way of accessing these defines in python.

Was it helpful?

Solution

AC_INIT not only defines preprocessor symbols, it also defines output variables. When you list a file, let's call it somefile, in your AC_CONFIG_FILES macro, your configure script looks for a file called somefile.in, and replaces the names of any output variables between @-signs with their values, calling the result somefile.

So, to access these definitions in a Python file somescript.py, put something like this in your configure.ac:

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

Then name your Python file somescript.py.in and access the PACKAGE_VERSION output variable like this:

version = '''@PACKAGE_VERSION@'''

The triple quotes are probably wise, because you never know when an output variable might contain a quote.

OTHER TIPS

The examples page of the pyparsing wiki includes this example of a macro expander. Here is the sample code that it processes:

#def A 100
#def ALEN A+1

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

So it will also handle macros that are defined in terms of other macros. Should not be difficult to change '#def' to '#define'.

Adding to the accepted answer: if you are interested in a custom defined variable, be sure to use AC_SUBST in addition to AC_DEFINE[_UNQUOTED] else nothing is replaced in your config files. Using the hints from this other answer, I added this to my 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])

so in config.h I get

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

and config.py.in is converted from

output_directory = '''@OUTPUT_DIRECTORY@'''

to config.py

output_directory = '''/some/directory/'''
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top