Я хочу знать, как установить компилятор/компоновщика/и т.д. по умолчанию. флаги, если я использую комбинацию Autoconf/Automake.
Например, флаг компилятора по умолчанию является "-O2-g", если я ничего не устанавливаю. Я могу просто переопределить его с чем-то еще, например, если я хочу отладить:
./configure 'CXXFLAGS=-O0 -g'
Но я нахожу конфигурацию по умолчанию глупой, потому что, если я включаю оптимизацию, отладка станет невозможной. Таким образом, флаги по умолчанию должны или быть "-O2" или "-O0-g", если я работаю configure
без аргументов. Как я делаю это?
Править: Я попробовал следующие решения:
progname_CXXFLAGS=whatever
к Makefile.am. Это не работает, потому что это добавляет флаги к флагам по умолчанию вместо того, чтобы заменить их.CXXFLAGS=whatever
в configure.ac. Это работает, но затем я не могу переопределить его позже.Тем временем я понял, как это сделать. Я дам этому объяснение.
Суть в том, что Autoconf заменяет переменные оболочки в Makefile.in. Вопрос в том, как мне получить значение этих переменных? Ответ заключается в том, что команда инициализации заменяет переменные, которые сообщаются им в командной строке (например, ./ configure 'CXXFLAGS = -O0 -g'
), а в противном случае они заменяются любой командой, определяющей значение по умолчанию (для Например, CXXFLAGS устанавливается параметром AC_PROG_CXX
), если они не пусты. Таким образом, решение состоит в том, чтобы установить наше новое значение по умолчанию до AC_PROG_CXX
, но после того, как будут сделаны замены из командной строки. Например:
if test -z $CXXFLAGS; then
CXXFLAGS='-O2'
fi
AC_PROG_CXX
В вашем Makefile.am вы можете определить их с помощью
programname_CXXFLAGS=-O0 -g
Обновлено: 20100628
Вы должны попробовать добавить CXXFLAGS в configure.in перед вызовом AC_PROG_CXX. Я не тестировал это, но ваш configure.in должен выглядеть примерно так
AC_INIT
...
CXXFLAGS=-MY -FLAGS
...
AC_PROG_CXX
Пожалуйста, дайте мне знать, если это работает, так как мне интересно :-)
Вы можете установить специфические для цели значения по умолчанию в Makefile.am, или вы можете установить значение по умолчанию в configure.ac
, и оно будет применяться ко всему, что вы собираете в проекте.
См. раздел 4.8.1 (и 5.10.4) в руководстве autoconf.
Обратите внимание на замечания в разделе 4.8.1 о том, что не следует угадывать возможного пользователя пакета: если вы хотите установить флаги, которые не должны волновать пользователя, то установите их с помощью AM_CXXFLAGS
, флаги вроде этого, которые пользователь должен иметь возможность отменить, должны быть установлены в CXXFLAGS
.
Но... вы действительно хотите это сделать?
./configure CXXFLAGS='-O0 -g'
, точно так, как вы описали. Если ваш configure.ac написан правильно, это настроит вашу сборку без оптимизации, оставив неизменным (хорошее) значение по умолчанию. Краткая версия: то, что вы делаете сейчас - правильный путь.
Отредактировано для добавления:
В общем, если переменная оболочки появляется как аргумент AC_SUBST
(явно или, как в случае с такими вещами, как CXXFLAGS
, неявно в какой-то другой команде), то она подставляется в выходные файлы. То есть, после AC_SUBST(foo)
значение переменной $foo
в сценарии ./configure
будет подставлено в @foo@
экземпляры.
Если вы просто хотите, чтобы флаги по умолчанию устанавливались для себя при каждом запуске configure, есть (по крайней мере) 3 хороших способа сделать это. Либо установите CXXFLAGS в своей среде (например, в .login или .bashrc), используйте переменную среды CONFIG_SITE, чтобы указать файл конфигурации, либо установите желаемое значение для CXXFLAGS в $ prefix / share / config.site. Если вы хотите установить флаги по умолчанию на что-то другое, кроме «-O2 -g» для всех пользователей вашего пакета, вам нужно изменить то, что вы хотите, потому что это нарушает принцип наименьшего удивления. Любой, кто знаком с autoconf, ожидает, что флагами по умолчанию будут -O2 -g, и вы не должны это менять.
Используйте третий вариант, указанный выше, и просто выполните
$ echo 'CXXFLAGS="-O0 -g"' > /usr/local/share/config.site
(или перенаправьте туда, где вы обычно устанавливаете префикс $, например, $ HOME / share / config.site) В качестве дополнительного бонуса это установит CXXFLAGS для всех автоконфискованных проектов, которые вы настраиваете, а не только для своих собственных. (Предполагая, что вы правильно установили префикс. Если вы хотите, чтобы config.site был действителен для всех проектов независимо от префикса, используйте параметр CONFIG_SITE)