GNU autotools: цели отладки / выпуска?
Я искал это некоторое время: в настоящее время я конвертирую программу среднего размера в autotools, исходя из метода на основе Eclipse (с makefiles)
Я всегда привык иметь" отладочную "сборку со всеми отладочными символами и без оптимизаций, а также" релизную " сборку без отладочных символов и лучших оптимизаций.
Теперь я пытаюсь воспроизвести это каким-то образом с autotools, поэтому я могу (возможно) сделать что-то вроде:
./configure
make debug
что бы есть все отладочные символы и никаких оптимизаций, и где:
./configure
make
приведет к версии "release" (по умолчанию)
PS: Я читал о флаге /функции -- enable-debug, но в моей текущей (простой) настройке использование этого не распознается configure
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"