GNU autotools: цели отладки / выпуска?


Я искал это некоторое время: в настоящее время я конвертирую программу среднего размера в autotools, исходя из метода на основе Eclipse (с makefiles)

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

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

./configure
make debug

что бы есть все отладочные символы и никаких оптимизаций, и где:

./configure
make

приведет к версии "release" (по умолчанию)

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

4 55

4 ответа:

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

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для включения отладочной информации.

решение Исмаила является общим подходом, но он страдает от некоторых серьезных проблем. Если пользователь пытается получить отладочную сборку делать './configure --enable-debug', сценарий configure установит 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 без необходимости указывать в командной строке.

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

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

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

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

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"