gnu autotools:debugging/发布目标?
我一直在寻找这一段时间:我目前正在转换一个中等大小的程序autotools,来自一个基于eclipse的方法(使用makefiles)
我总是习惯于有一个“debugging”的版本,所有的debugging符号,没有优化,和“释放”生成,没有debugging符号和最佳优化。
现在我试图用autotools以某种方式复制这个,所以我可以(可能)做这样的事情:
./configure make debug
其中将有所有debugging符号和优化,并在哪里:
./configure make
会导致“发行”版本(默认)
PS:我已经阅读了关于–enable-debug标志/特性,但是在我目前的(简单)设置中,使用它是无法识别的
在你的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
以启用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应用意外的标志,那么你有一个错误,你的包被打破 。 这是一个非常常见的经验,如果你维护一个包(当前正考虑tmux
和curl
),在调用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.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"
testing它:
$ ./configure --enable-debug | grep CFLAGS