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 CFLAGS="-g -O0" && make && make install
$ cd ../release && /path/to/configure CPPFLAGS=-DNDEBUG && make && make install
这将在 /dbg/bin 中安装带有 `-DDEBUG' 和 '-g -O0' 的构建(“调试构建”),并在 /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" 后没有得到任何合理的人所说的“调试构建”,那么你的包裹损坏了。
在使用 autotools 维护包时必须始终记住的重要一点是,用户可能使用与您完全不同的工具链。用户的工具链完全有可能需要-DMAKE_IT_A_DEBUG 或-DUSE_DEBUG 或-I/non/standard/path/to/headers。也许它需要-O145 或-Q 传递给编译器或-debug 传递给链接器,或者......任何东西。作为维护者,您根本没有必要的信息来使“调试构建”这个短语对所有用户都有意义。所以不要尝试,因为您可能会使特定用户无法构建该软件。