gnu autotools:debugging/发布目标?

我一直在寻找这一段时间:我目前正在转换一个中等大小的程序autotools,来自一个基于eclipse的方法(使用makefiles)

我总是习惯于有一个“debugging”的版本,所有的debugging符号,没有优化,和“释放”生成,没有debugging符号和最佳优化。

现在我试图用autotools以某种方式复制这个,所以我可以(可能)做这样的事情:

./configure make debug 

其中将有所有debugging符号和优化,并在哪里:

 ./configure make 

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

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

在你的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以启用debugging信息。

伊斯梅尔的解决scheme是一种常见的方法,但它遭受了一些严重的问题。 如果用户试图通过“./configure –enable-debug”来获得debugging版本,configuration脚本将把CFLAGS设置为“-g -O2”,Makefile将使用“-g3 -O0 … -g -O2“时构build任何可执行文件。 在这种情况下,gcc将使用-O2,并且一些编译器会因为-O选项的冲突而中止。 这两种情况都不是预期的行为。

使用debugging符号进行构build不是项目维护者应该担心的事情。 这是用户的问题。 如果您有一个项目,并且想要进行debugging构build或发布构build,则应该在configuration时使用不同的选项。 例如,

 $ mkdirdebugging
 $ mkdir发布
 $ 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中安装一个debugging版本,并在/ usr / local / bin中安装一个“release”安装

另外,通过使用CONFIG_SITE文件,您可以大大减less必要的input的繁琐操作。 例如,你可以这样做:

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

然后所有将来的调用“configure –prefix = / dbg”将自动inheritance设置到CPPFLAGS和CFLAGS,而不需要在命令行中指定。

如果作为软件包维护者,您希望为用户提供一种构build“debugging版本”的简单方法,那么在发行版中包含一个脚本并使用适当的参数调用configure脚本并调用make && make install ,但是绝对没有必要用这样的垃圾来清理你的自动工具元文件。 它根本不属于那里。 而且要注意的是,很多软件包都试图添加 – --enable-debug ,这些都是错误的。 如果用户调用configure CFLAGS="-g -O0"但得到一个构build应用意外的标志,那么你有一个错误,你的包被打破 。 这是一个非常常见的经验,如果你维护一个包(当前正考虑tmuxcurl ),在调用configure CFLAGS="-g -O0"之后用户不会得到任何合理的人称之为“debugging版”的configure CFLAGS="-g -O0" ,那么你的包裹坏了

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

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

另一个例子是configurationCFLAGS / 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" 

testing它:

 $ ./configure --enable-debug | grep CFLAGS