Подтвердить что ты не робот

Флаги компилятора по умолчанию с помощью Autotools

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

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

./configure 'CXXFLAGS=-O0 -g'

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

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

  • Поместите progname_CXXFLAGS=whatever в Makefile.am. Он не работает, потому что он добавляет флаги к флагам по умолчанию вместо их замены.
  • Поместите CXXFLAGS=whatever в configure.ac. Это работает, но потом я не могу переопределить его позже.
4b9b3361

Ответ 1

Между тем я понял, как это сделать. Я объясню это.

Самое главное, что 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

Ответ 2

Согласно руководству autoconf (около AC_PROG_CC):

Если вы используете компилятор GNU C, установите для переменной оболочки GCC значение "да". Если выходная переменная CFLAGS еще не была установлена, установите ее на -g -O2 для Компилятор GNU C (-O2 в системах, где GCC не принимает -g), или -g для других компиляторов. Если вашему пакету не нравится это значение по умолчанию, тогда допустимо вставить строку

: ${CFLAGS=""}

после AC_INIT и перед AC_PROG_CC выберите пустой по умолчанию вместо этого.

Аналогично, в соответствии с руководством autoconf (около AC_PROG_CXX):

Если вы используете компилятор GNU С++, установите для переменной оболочки GXX значение "да". Если выходная переменная CXXFLAGS еще не была установлена, установите ее на -g -O2 для Компилятор GNU С++ (-O2 в системах, где g++ не принимает -g), или -g для других компиляторов. Если вашему пакету не нравится это значение по умолчанию, тогда допустимо вставить строку

: ${CXXFLAGS=""}

после AC_INIT и до AC_PROG_CXX, чтобы выбрать пустой по умолчанию вместо этого.

Ответ 3

Если вы просто хотите, чтобы флаги по умолчанию устанавливались для вас всякий раз, когда вы запускаете configure, есть (по крайней мере) 3 полезных способа сделать это. Либо установите CXXFLAGS в вашей среде (например, в .login или .bashrc), используйте переменную среды CONFIG_SITE, чтобы указать файл конфигурации, или установите значение, которое вы хотите для CXXFLAGS в $prefix/share/config.site. Если вы хотите установить флаги по умолчанию для чего-то другого, кроме "-O2 -g" для всех пользователей вашего пакета, то вам нужно изменить то, что вы хотите, потому что это нарушает принцип наименьшего удивления. Любой, кто знаком с autoconf, ожидает, что флаги по умолчанию будут -O2 -g, и вы не должны изменять это.

Перейдите с 3-ей опцией, приведенной выше, и просто сделайте

$ echo 'CXXFLAGS="-O0 -g"' > /usr/local/share/config.site

(или перенаправить туда, где вы обычно устанавливаете префикс $, например $HOME/share/config.site) В качестве дополнительного бонуса это установит CXXFLAGS для всех сконфигурированных проектов, которые вы конфигурируете, а не только самостоятельно. (Предположим, что вы правильно настроили префикс.Если вы хотите, чтобы config.site был действительным для всех проектов, независимо от префикса, используйте параметр CONFIG_SITE)

Ответ 4

Вы можете установить целевые значения по умолчанию в 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 script будет заменено на экземпляры @[email protected].

Ответ 5

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

programname_CXXFLAGS=-O0 -g

Обновлено: 20100628

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

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

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