GNU autotools:调试/发布目标?

时间:2010-12-29 11:37:31

标签: c++ autotools autoconf automake

我一直在寻找这个:我目前正在将一个中型程序转换为autotools,来自基于Eclipse的方法(带有makefile)

我总是习惯于进行“调试”构建,包含所有调试符号,没有优化,以及“发布”版本,没有调试符号和最佳优化。

现在我试图用autotools以某种方式复制它,所以我可以(或许)做类似的事情:

./configure
make debug

哪个会有所有调试符号而没有优化,以及:

./configure
make

会导致“发布”版本(默认)

PS:我已经阅读了关于--enable-debug标志/功能的内容,但是在我目前的(简单)设置​​中,使用configure无法识别

4 个答案:

答案 0 :(得分:129)

ismail的解决方案是一种常见的方法,但它遇到了一些严重的问题。如果用户通过执行'./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中安装调试版本,在/ usr / local / bin中安装“release”安装

此外,您可以使用CONFIG_SITE文件大大减少必要输入的繁琐。例如,你可以这样做:

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

然后'configure --prefix = / dbg'的所有未来调用都将自动继承CPPFLAGS和CFLAGS的设置,而无需在命令行中指定。

如果作为软件包维护者,您希望为用户提供一种构建“调试版本”的简便方法,那么在分发中包含一个脚本是完全可以接受的,该脚本使用适当的参数调用configure脚本并调用make && make install,但绝对没有必要乱丢你的autotool元文件。它根本不属于那里。并且要注意,许多软件包都试图添加--enable-debug,这是完全错误的。如果用户调用configure CFLAGS="-g -O0"但是获得了应用意外标记的构建,那么您就会遇到错误并且您的软件包已损坏。这是一个非常常见的体验,如果您维护一个包(当前正在考虑tmuxcurl),其中用户没有得到任何合理的人在调用后称为“调试版本”的内容configure CFLAGS="-g -O0",然后您的包已损坏

使用autotools维护包时必须始终记住的一个重点是用户可能正在使用与您完全不同的工具链。用户的工具链完全有可能需要-DMAKE_IT_A_DEBUG-DUSE_DEBUG-I/usr/banana-split/debug/build/with/georges/headers。也许它需要传递给编译器的-O145-Q或传递给链接器的-debug,或者......任何东西。作为维护者,您根本没有必要的信息来使“调试构建”这一短语对所有用户都有意义。所以不要尝试,因为你可能会使某些用户无法构建软件。

答案 1 :(得分:18)

configure.inconfigure.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.inMakefile.am;

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

因此,当启用debug时,您可以修改{C/CXX}FLAGS以启用调试信息。

答案 2 :(得分:5)

使用autotools创建的默认Makefile会生成带有调试符号的二进制文件。使用make install-strip生成发布目标。

答案 3 :(得分:1)

配置CFLAGS / CXXFLAGS而不编辑Makefile.inMakefile.am的另一个示例。将此代码添加到您的configure.inconfigure.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