关于用户不足为奇的观点是有效的,但是默认情况下某些标志是合理的(例如-Wall -Wextra
),而其他标志是代码库特定的并且有时是需要的(例如-std=gnu99
)。
那么问题就变成了如何便携地做到这一点。我个人从 libuv 项目中窃取了标志检查宏。为此,我添加libuv-check-flags.m4
到m4
我的项目目录中。然后我可以在我的configure.ac
:
m4_include([m4/libuv-check-flags.m4])
AM_INIT_AUTOMAKE([-Wall -Werror foreign 1.11.2])
# Checks for programs.
AC_PROG_CC
CC_CHECK_CFLAGS_APPEND([-std=gnu99])
CC_CHECK_CFLAGS_APPEND([-Wall])
CC_CHECK_CFLAGS_APPEND([-Wextra])
AC_PROG_LIBTOOL
我生成的配置文件然后生成一个编译器命令行:
gcc -g -O2 -std=gnu99 -Wall -Wextra
我仍然可以-g -O2
使用上面的解决方案覆盖默认值,例如:
./configure CFLAGS='-O0 -g'
产生一个命令行:
gcc -O0 -g -std=gnu99 -Wall -Wextra
如果需要,我仍然可以利用 gcc 语义禁用基本标志。例如,如果我真的很想禁用警告:
./configure CFLAGS='-Wno-all -Wno-extra'
你可能会说,“如果编译器不支持这些标志怎么办?” 这就是为什么这些宏如此有用和伟大的原因,因为它们确保首先检查编译器功能,因此-Wall
如果-Wextra
不支持它们就不会首先添加。
libuv 是地球上最便携和使用最广泛的 C 库之一,所以我认为跟随他们的领导是合理的。虽然这些宏是纯 C 特定的,但将它们与 CXXFLAGS 一起使用将是微不足道的。
参考: