GNU autotools: цели отладки / выпуска? - PullRequest
57 голосов
/ 29 декабря 2010

Я давно искал это: в настоящее время я конвертирую программу среднего размера в автоинструментальные средства, основанные на Eclipse-методе (с make-файлами)

Я всегда привык иметь «отладочную» сборку со всеми символами отладки и без оптимизаций, а также «выпускную» сборку без отладочных символов и лучших оптимизаций.

Теперь я пытаюсь каким-то образом повторить это с помощью autotools, поэтому я могу (возможно) сделать что-то вроде:

./configure
make debug

Который будет иметь все символы отладки и без оптимизации, и где:

./configure
make

Результатом будет версия "release" (по умолчанию)

PS: я читал о флаге / функции -enable-debug, но в моей текущей (простой) настройке, использование которого не распознается configure

Ответы [ 4 ]

129 голосов
/ 13 января 2011

Решение ismail является распространенным подходом, но оно страдает от некоторых серьезных проблем. Если пользователь пытается получить отладочную сборку, выполнив «./configure --enable-debug», сценарий конфигурации установит CFLAGS в «-g -O2», а Makefile будет использовать «-g3 -O0 ... -g». -O2 'при сборке любых исполняемых файлов. В этом случае gcc будет использовать -O2, а некоторые компиляторы прервутся из-за конфликтующих опций -O. Любой сценарий не является ожидаемым поведением.

Сборка с отладочными символами или нет - это НЕ то, о чем должен беспокоиться сопровождающий проекта. Это проблема для пользователя. Если у вас есть проект, и вы хотите сделать отладочную сборку или сборку выпуска, вы должны использовать разные опции во время настройки. Например,

$ mkdir debug
$ mkdir release
$ cd debug && /path/to/configure --prefix=/dbg \
   CPPFLAGS=-DDEBUG CXXFLAGS="-g -O0" && make && make install
$ cd ../release && /path/to/configure CPPFLAGS=-DNDEBUG && make && make install

Это установит отладочную сборку в / dbg / bin и 'release' установит в / usr / local / bin

Кроме того, вы можете значительно сократить скуку при наборе текста, используя файл CONFIG_SITE. Например, вы можете сделать:

echo 'CPPFLAGS=-DDEBUG CFLAGS="-g -O0"' >> /dbg/share/config.site

и все последующие вызовы 'configure --prefix = / dbg' будут автоматически наследовать параметры CPPFLAGS и CFLAGS без необходимости указания в командной строке.

Если, как сопровождающий пакета, вы хотите предоставить пользователю простой способ создания «отладочной версии», вполне допустимо включить в дистрибутив скрипт, который вызывает скрипт конфигурации с соответствующими аргументами и вызывает make && make install, но совершенно не нужно засорять ваши мета-файлы автоинструмента таким мошенничеством. Это просто не принадлежит там. И будьте осторожны, многие пакеты предпринимали попытки добавить --enable-debug, что просто неправильно. Если пользователь вызывает configure CFLAGS="-g -O0", но получает сборку, которая применяет неожиданные флаги, то у вас есть ошибка, и ваш пакет сломан . Это слишком распространенный опыт, и если вы поддерживаете пакет (в настоящее время думающий о tmux и curl), в котором пользователь не получает то, что любой разумный человек назвал бы «отладочной сборкой» после вызова configure CFLAGS="-g -O0", тогда ваш пакет сломан .

Важным моментом, который всегда следует помнить при обслуживании пакета с автоинструментами, является то, что пользователь может использовать совершенно другую цепочку инструментов, чем вы. Вполне возможно, что цепочка инструментов пользователя потребует -DMAKE_IT_A_DEBUG или -DUSE_DEBUG или -I/usr/banana-split/debug/build/with/georges/headers. Возможно, потребуется -O145 или -Q, переданные компилятору, или -debug, переданные компоновщику, или ... что-нибудь еще. Как сопровождающий, вы просто не обладаете информацией, необходимой даже для того, чтобы сделать фразу «сборка отладки» значимой для всех пользователей. Так что не пытайтесь, потому что вы можете сделать программное обеспечение не подлежащим сборке для определенного набора пользователей.

18 голосов
/ 29 декабря 2010

Добавьте предложение к вашему configure.in или configure.ac файлу;

AC_ARG_ENABLE(debug,
AS_HELP_STRING([--enable-debug],
               [enable debugging, default: no]),
[case "${enableval}" in
             yes) debug=true ;;
             no)  debug=false ;;
             *)   AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
esac],
[debug=false])

AM_CONDITIONAL(DEBUG, test x"$debug" = x"true")

Теперь в вашем Makefile.in или Makefile.am;

if DEBUG
AM_CFLAGS = -g3 -O0
AM_CXXFLAGS = -g3 -O0
else
AM_CFLAGS = -O2
AM_CXXFLAGS = -O2
endif

Так что когда debug включен, вы можете изменить {C/CXX}FLAGS, чтобы включить отладочную информацию.

5 голосов
/ 04 января 2012

Стандартный Makefile, созданный с помощью autotools, создает двоичные файлы с символами отладки.Используйте make install-strip для создания цели выпуска.

1 голос
/ 14 ноября 2017

Другой пример настройки CFLAGS / CXXFLAGS без редактирования Makefile.in или Makefile.am.Добавьте этот код в файл configure.in или configure.ac:

test -z "$SED" && SED=sed

AC_ARG_ENABLE([debug],
  [AS_HELP_STRING([--enable-debug],
                  [whether to include debug symbols (default is no)])],
  [enable_debug=$enableval],
  [enable_debug=no]
)

if test "x$enable_debug" = xyes; then
  dnl Remove all optimization flags from CFLAGS
  changequote({,})
  CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9s]*//g'`
  CXXFLAGS=`echo "$CXXFLAGS" | $SED -e 's/-O[0-9s]*//g'`

  CFLAGS=`echo "$CFLAGS" | $SED -e 's/-g[0-9]*//g'`
  CXXFLAGS=`echo "$CXXFLAGS" | $SED -e 's/-g[0-9]*//g'`
  changequote([,])

  CFLAGS="$CFLAGS -g -O0"
  CXXFLAGS="$CXXFLAGS -g -O0"
fi

echo "CFLAGS=$CFLAGS"

Проверьте его:

$ ./configure --enable-debug | grep CFLAGS
...