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