Autotools: как установить глобальный флаг компиляции

У меня есть проект с несколькими каталогами источников:

src/A
   /B
   /C

В каждом Makefile.am содержится

AM_CXXFLAGS = -fPIC -Wall -Wextra

Как избежать повторения этого в каждой исходной папке?

Я пытался изменить src/Makefile.am и configure.in, но безуспешно. Я думал, что могу использовать AC_PROG_CXX для глобальной установки флагов компиляции, но не могу найти много документации о том, как использовать этот макрос (у вас есть какой-нибудь указатель на такую ​​​​документацию?).

заранее спасибо


person Barth    schedule 27.11.2008    source источник


Ответы (2)


Вы можете сделать несколько вещей:

(1) Одним из решений является включение общего фрагмента файла makefile во все ваши Makefile.am:

include $(top_srcdir)/common.mk
...
bin_PROGRAMS = foo
foo_SOURCES = ...

в таком случае вы бы написали

AM_CXXFLAGS = -fpic -Wall -Wextra

на common.mk, и в будущем будет проще добавлять дополнительные макросы или правила ко всем Makefile.am, просто редактируя этот файл.

(2) Другим решением было бы установить эти переменные глобально в вашем configure.ac (имя configure.in давно устарело), ​​как в:

...
AC_SUBST([AM_CXXFLAGS], [-fpic -Wall -Wextra])
...

Тогда вам даже не нужно ничего говорить в ваших Makefile.am, они автоматически наследуют это глобальное определение. Недостатком является то, что вы не можете легко отказаться (с первым решением легко решить не включать common.mk), и зависимость на самом деле не является явной для сторонних людей (когда они читают Makefile.am, у них нет намека на то, где флаги могут исходить).

(3) Третье решение — сделать так, как предложил orsogufo: перезаписать пользовательскую переменную CXXFLAGS в configure.ac. Я бы не советовал этого делать, потому что это противоречит одной из особенностей системы сборки GNU: пользователям разрешено переопределять эту переменную в make-время. Например, вы можете ввести

make CXXFLAGS='-O0 -ggdb' 

при отладке фрагмента кода, и это перезапишет любое определение CXXFLAGS (но не AM_CXXFLAGS). Честно говоря, большинство проектов не поддерживают это правильно, потому что они шутят с CXXFLAGS.

Наконец, я должен упомянуть, что -fpic, -Wall и -Werror не являются переносимыми параметрами. В зависимости от масштаба вашего проекта вы можете добавить проверку конфигурации для них (gnulib недавно приобрел новые макросы для проверки флагов предупреждений, а libtool можно использовать для создания общих библиотек) .

person adl    schedule 28.11.2008
comment
Использование идиомы include в Makefile.am приведет к тому, что automake выведет зависимости для Makefile и Makefile.in, которые в конечном итоге вернутся к включенному файлу и файлу automake. Таким образом, изменение этого приведет к обновлениям позже. - person johnny; 12.02.2009
comment
На самом деле очень легко отказаться, если вы AC_SUBST флаги. В Makefile.am, если вы назначаете AM_CPPFLAGS, они переопределяют. Вы можете подписаться, ничего не делая, или выполнив AM_CPPFLAGS = @AM_CPPFLAGS@ ..., или отказаться, не указывая @AM_CPPFLAGS@ в задании. - person William Pursell; 10.02.2012
comment
Флаги предупреждений не относятся к CPPFLAGS, как вы утверждаете, поскольку они используются компилятором, а не препроцессором. - person kusma; 27.06.2012
comment
Я что-то упустил, или AC_SUBST не нужны кавычки '' вокруг нескольких флагов, чтобы избежать ошибки оболочки при запуске configure? - person underscore_d; 17.07.2017

Используйте EXTRA_CFLAGS в configure.ac

Например, для вашего случая это будет так:

EXTRA_CFLAGS=-fPIC -Wall -Wextra

person Serg    schedule 17.03.2016