Флаги компилятора по умолчанию с помощью Autotools - PullRequest
24 голосов
/ 25 июня 2010

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

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

./configure 'CXXFLAGS=-O0 -g'

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

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

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

Ответы [ 7 ]

19 голосов
/ 21 мая 2013

Согласно руководству 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 C ++, установите для переменной оболочки GXX значение «да». Если Выходная переменная CXXFLAGS еще не была установлена, установите ее в -g -O2 для Компилятор GNU C ++ (-O2 в системах, где G ++ не принимает -g) или -g для других компиляторов. Если ваш пакет не нравится этот по умолчанию, то допустимо вставить строку

: ${CXXFLAGS=""}

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

8 голосов
/ 30 июня 2010

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

6 голосов
/ 25 июня 2010

А пока я разобрался, как это сделать. Я объясню это.

Основным является то, что 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
3 голосов
/ 25 июня 2010

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

1 голос
/ 03 февраля 2018

Опираясь на ответы выше, я добавил это в configure.ac:

AC_ARG_WITH(debug, [  --with-debug            add the debugging module], [AC_DEFINE(WITH_DEBUG,1,0)
AC_SUBST(WITH_DEBUG,1)
CXXFLAGS="-O0 -ggdb"])

Он также определяет WITH_DEBUG в AC_CONFIG_HEADERS (config.h) и добавляет его в Makefile с помощью AC_SUBST ().

0 голосов
/ 17 февраля 2019

Пункты, касающиеся неудивительного пользователя, действительны, но некоторые флаги целесообразно включать по умолчанию (например, -Wall -Wextra), а другие флаги зависят от кода и иногда необходимы (например, -std=gnu99).

Тогда возникает вопрос, как сделать это переносимо.Я лично краду макросы проверки флагов из проекта libuv.Для этого я добавляю libuv-check-flags.m4 в каталог m4 моего проекта.Затем я могу сделать следующее в моем configure.ac:

m4_include([m4/libuv-check-flags.m4])
AM_INIT_AUTOMAKE([-Wall -Werror foreign 1.11.2])

# Checks for programs.
AC_PROG_CC
CC_CHECK_CFLAGS_APPEND([-std=gnu99])
CC_CHECK_CFLAGS_APPEND([-Wall])
CC_CHECK_CFLAGS_APPEND([-Wextra])
AC_PROG_LIBTOOL

Мой сгенерированный файл конфигурации создает командную строку компилятора:

gcc -g -O2 -std=gnu99 -Wall -Wextra

Я могупо-прежнему переопределяя значение по умолчанию -g -O2, используя приведенные выше решения, например:

./configure CFLAGS='-O0 -g'

Создает командную строку:

gcc -O0 -g -std=gnu99 -Wall -Wextra

И используя семантику gcc, я могупо-прежнему отключите базовые флаги, если это необходимо.Например, я могу отключить предупреждения, если я действительно хочу сделать это с помощью:

./configure CFLAGS='-Wno-all -Wno-extra'

Вы можете сказать: «Ну что, если компилятор не поддерживает эти флаги?»Вот почему эти макросы так полезны и хороши, так как они гарантируют, что функции компилятора проверяются первыми, поэтому -Wall и -Wextra не будут добавлены в первую очередь, если они не будут поддерживаться.

libuvявляется одной из наиболее переносимых и широко используемых библиотек C на планете, поэтому я думаю, что следовать их примеру разумно.И хотя эти макросы предназначены исключительно для C, адаптация их для использования с CXXFLAGS будет тривиальной.

Ссылки:

0 голосов
/ 25 июня 2010

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

programname_CXXFLAGS=-O0 -g

Обновлено: 20100628

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

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

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

...