automake: изменить неявное правило make, чтобы включить дополнительные флаги

Как я могу добавить дополнительные переменные-флаги (например, CPPFLAGS), которые будут применяться ко всем make-файлам? В настоящее время мы используем CPPFLAGS, но предполагается, что он зарезервирован как пользовательская переменная, и я хотел бы зарезервировать его. Я бы предпочел не использовать AM_CPPFLAGS, потому что хотел бы зарезервировать его для конкретного Makefile.amS. Я хочу что-то вроде GLOBAL_CPPFLAGS, которое я мог бы установить в configure.ac и применить ко всему. Также было бы неплохо, если бы существовал способ явного игнорирования флага.

Я думаю, что мне нужно написать собственное правило make, но как мне сделать его доступным во всех подпапках, не копируя его в каждый Makefile.am?


person deuberger    schedule 11.10.2010    source источник


Ответы (3)


Вы правы, не используя CPPFLAGS. Это пользовательская переменная. Я бы сделал что-то вроде этого:

В корне вашего исходного каталога создайте файл с именем common.am и определите там все, что вам нужно:

## common.am
AM_CPPFLAGS = -DFOO

Я знаю, вы сказали, что не хотите использовать AM_CPPFLAGS, но выслушайте меня. В ваших отдельных подкаталогах include $(top_srcdir)/common.am и расширить или переопределить AM_CPPFLAGS по мере необходимости:

## bar/Makefile.am
include $(top_srcdir)/common.am
AM_CPPFLAGS += -DBAR

Если вы хотите переопределить, используйте = вместо +=:

## baz/Makefile.am
include $(top_srcdir)/common.am
AM_CPPFLAGS = -DBAZ
person Jack Kelly    schedule 11.10.2010
comment
Вместо include вы также можете AC_SUBST([AM_CPPFLAGS], ["-Whatever"]) из configure.ac, а затем просто обновить += в тех Makefile.am, которым это нужно. - person adl; 12.10.2010
comment
Спасибо, я сделал что-то похожее на это, но решил использовать свои собственные переменные (например, GLOBAL_CPPFLAGS) и AC_SUBST из файла configigure.ac. Затем я включил эти флаги в эквивалентные AM_CPPFLAGS во всех make-файлах и включил AM_CPPFLAGS в target_CPPFLAGS. Я думаю, что это дает максимальный общий контроль, и то, что происходит, очень явно. - person deuberger; 12.10.2010
comment
@deuberger: Если вы имеете в виду, что написали target_CPPFLAGS = $(AM_CPPFLAGS), вам не нужно этого делать, поскольку оно используется по умолчанию, если не установлено. Если вы имеете в виду, что написали target_CPPFLAGS = $(AM_CPPFLAGS) -DFOO, я вижу в этом смысл. - person Jack Kelly; 13.10.2010
comment
да, я имел в виду последнее. Чтобы быть конкретным, везде, где было установлено значение target_CPPFLAGS, я включал $(AM_CPPFLAGS) в определение. В тех случаях, когда для target_CPPFLAGS не было установлено ничего, я часто просто удалял его, чтобы AM_CPPFLAGS использовался, как вы сказали. - person deuberger; 13.10.2010

Думаю, вы сами ответили на свой вопрос: вам придется копировать новое правило в каждый make-файл.

person Steve Emmerson    schedule 11.10.2010
comment
Ложь. automake поддерживает include: gnu.org/software/hello/manual/ automake/Include.html#Include - person Jack Kelly; 12.10.2010
comment
Джек, это фактически копирует правило, о котором и был его вопрос. - person Steve Emmerson; 12.10.2010
comment
Я полагаю, что да, но копирование не выполняется вручную, и есть центральное место для обновления правила или переменной. - person Jack Kelly; 13.10.2010

CPPFLAGS — это механизм, который вам, вероятно, следует использовать. Просто соедините нужные флаги где-нибудь в configure.ac:

GLOBAL_CPPFLAGS="-DSOMETHING"

...

CPPFLAGS="$CPPFLAGS $GLOBAL_CPPFLAGS"

и вы должны быть настроены.

person ldav1s    schedule 11.10.2010
comment
Нет, это не так. CPPFLAGS — это пользовательская переменная. gnu.org/software/hello/manual/ автоматизировать/ . Однако AC_SUBST использовать общие флаги — не такая уж плохая идея. - person Jack Kelly; 12.10.2010