Доступ к определенным символам autoconf в python - PullRequest
0 голосов
/ 05 февраля 2010

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

AC_INIT(MILHOUSE, 0.3.6)

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

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

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

Ответы [ 3 ]

3 голосов
/ 06 февраля 2010

AC_INIT не только определяет символы препроцессора, но также определяет выходные переменные. Когда вы перечисляете файл, давайте назовем его somefile, в вашем макросе AC_CONFIG_FILES ваш скрипт 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@'''

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

0 голосов
/ 04 февраля 2013

Добавление к принятому ответу : если вас интересует пользовательская переменная, обязательно используйте 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 голосов
/ 05 февраля 2010

Страница примеров pyparsing wiki включает этот пример макроэкспандера. Вот пример кода, который он обрабатывает:

#def A 100
#def ALEN A+1

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

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

...