Подтвердить что ты не робот

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

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

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

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

./configure
make debug

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

./configure
make

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

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

4b9b3361

Ответ 1

Добавить предложение в файл 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, чтобы включить отладочную информацию.

Ответ 2

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

Это установит сборку debug в /dbg/bin и установку "release" в /usr/local/bin

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

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

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

Если в качестве поддерживающего пакета вы хотите предоставить пользователю простой способ создания "отладочной версии", вполне приемлемо включить в дистрибутив script script, который вызывает configure script с помощью соответствующие аргументы и вызывает make && make install, но нет абсолютно никакой необходимости мутировать ваши метафайлы с автотрепом с таким крутым. Он просто не принадлежит. И будьте осторожны, многие пакеты пытались добавить --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, переданный компоновщику, или... что угодно. Как сопровождающий, у вас просто нет информации, необходимой даже для того, чтобы фраза "сборка отладки" была значимой для всех пользователей. Поэтому не пытайтесь, потому что вы можете сделать программное обеспечение нестрогим для определенного набора пользователей.

Ответ 3

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

Ответ 4

Другой пример настройки 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