Компилятор по умолчанию отмечает с помощью Автоинструментов

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

Например, флаг компилятора по умолчанию является "-O2-g", если я ничего не устанавливаю. Я могу просто переопределить его с чем-то еще, например, если я хочу отладить:

./configure 'CXXFLAGS=-O0 -g'

Но я нахожу конфигурацию по умолчанию глупой, потому что, если я включаю оптимизацию, отладка станет невозможной. Таким образом, флаги по умолчанию должны или быть "-O2" или "-O0-g", если я работаю configure без аргументов. Как я делаю это?

Править: Я попробовал следующие решения:

  • Поместить progname_CXXFLAGS=whatever к Makefile.am. Это не работает, потому что это добавляет флаги к флагам по умолчанию вместо того, чтобы заменить их.
  • Поместить CXXFLAGS=whatever в configure.ac. Это работает, но затем я не могу переопределить его позже.
24
задан petersohn 25 June 2010 в 10:43
поделиться

4 ответа

Тем временем я понял, как это сделать. Я дам этому объяснение.

Суть в том, что 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
6
ответ дан 28 November 2019 в 23:44
поделиться

В вашем Makefile.am вы можете определить их с помощью

programname_CXXFLAGS=-O0 -g

Обновлено: 20100628

Вы должны попробовать добавить CXXFLAGS в configure.in перед вызовом AC_PROG_CXX. Я не тестировал это, но ваш configure.in должен выглядеть примерно так

AC_INIT
...
CXXFLAGS=-MY -FLAGS
...
AC_PROG_CXX

Пожалуйста, дайте мне знать, если это работает, так как мне интересно :-)

0
ответ дан 28 November 2019 в 23:44
поделиться

Вы можете установить специфические для цели значения по умолчанию в Makefile.am, или вы можете установить значение по умолчанию в configure.ac, и оно будет применяться ко всему, что вы собираете в проекте.

См. раздел 4.8.1 (и 5.10.4) в руководстве autoconf.

Обратите внимание на замечания в разделе 4.8.1 о том, что не следует угадывать возможного пользователя пакета: если вы хотите установить флаги, которые не должны волновать пользователя, то установите их с помощью AM_CXXFLAGS, флаги вроде этого, которые пользователь должен иметь возможность отменить, должны быть установлены в CXXFLAGS.

Но... вы действительно хотите это сделать?

  1. Вы говорите "отладка станет невозможной". Вы пробовали это сделать и видели, что что-то пошло не так? Возможно, компилятор/отладчик умнее, чем вы ему приписываете.
  2. То, что хорошо по умолчанию для вас во время разработки, не обязательно хорошо по умолчанию для конечного пользователя во время сборки. Если действительно необходимо отключить оптимизацию во время разработки, то просто настройте вашу систему разработки с помощью ./configure CXXFLAGS='-O0 -g', точно так, как вы описали. Если ваш configure.ac написан правильно, это настроит вашу сборку без оптимизации, оставив неизменным (хорошее) значение по умолчанию.

Краткая версия: то, что вы делаете сейчас - правильный путь.

Отредактировано для добавления:

В общем, если переменная оболочки появляется как аргумент AC_SUBST (явно или, как в случае с такими вещами, как CXXFLAGS, неявно в какой-то другой команде), то она подставляется в выходные файлы. То есть, после AC_SUBST(foo) значение переменной $foo в сценарии ./configure будет подставлено в @foo@ экземпляры.

3
ответ дан 28 November 2019 в 23:44
поделиться

Если вы просто хотите, чтобы флаги по умолчанию устанавливались для себя при каждом запуске 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)

9
ответ дан 28 November 2019 в 23:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: