2010-02-05 2 views
0

Я работаю над проектом, написанным как на C++, так и на python. У меня есть следующие строки в моем configure.ac:Доступ к определенным символам autoconf в python

AC_INIT(MILHOUSE, 0.3.6) 

, что означает, что в config.h генерируемого конфигурирования, я следующая строку: определить

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

Я просто хотел бы знать если существовал существующий модуль для синтаксического анализа таких символов конфигурации, как это, или, по крайней мере, стандартный способ доступа к этим параметрам в python.

ответ

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 = '''@[email protected]''' 

Тройные кавычки, вероятно, мудры, потому что вы никогда не знаете, когда выходная переменная может содержать цитату.

+0

отлично! отличный ответ, именно то, что я искал и применил в других контекстах (т. е. не-питон). Благодарю. – tmatth

0

На странице примеров pyparsing wiki содержится this example расширителя макросов. Вот пример кода, который он обрабатывает:

#def A 100 
#def ALEN A+1 

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

Таким образом, он также будет обрабатывать макросы, определенные в терминах других макросов. Не должно быть трудно изменить «#def» на «#define».

+0

, который будет работать, но я ищу более общее решение для доступа к символам конфигурации времени из python, вместо того, чтобы явно читать файл config.h во время выполнения. – tmatth

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 = '''@[email protected]''' 

в config.py

output_directory = '''/some/directory/''' 
Смежные вопросы