Autotools:如何设置全局编译标志

时间:2008-11-27 13:36:49

标签: c++ autotools autoconf flags automake

我有一个包含多个源目录的项目:

src/A
   /B
   /C

在每个中,Makefile.am包含

AM_CXXFLAGS = -fPIC -Wall -Wextra

如何避免在每个源文件夹中重复此操作?

我尝试修改src / Makefile.am和configure.in,但没有成功。我以为我可以使用AC_PROG_CXX全局设置编译标志,但是找不到关于如何使用这些宏的文档(你有指向这样的文档的指针吗?)。

提前致谢

2 个答案:

答案 0 :(得分:25)

你可以做几件事:

(1)一种解决方案是在所有Makefile.am上包含一个通用的makefile片段:

include $(top_srcdir)/common.mk
...
bin_PROGRAMS = foo
foo_SOURCES = ...

在这种情况下你会写

AM_CXXFLAGS = -fpic -Wall -Wextra

common.mk,将来只需编辑此文件,就可以更轻松地向所有Makefile.am添加更多宏或规则。

(2)另一个解决方案是在configure.ac(名称configure.in很久以前已弃用)中全局设置这些变量,如:

...
AC_SUBST([AM_CXXFLAGS], [-fpic -Wall -Wextra])
...

然后你甚至不必在Makefile.am中说任何话,它们会自动继承这个全局定义。缺点是您不能轻易选择退出(使用第一个解决方案很容易决定不包含common.mk)并且依赖关系对第三方人员来说并不明确(当他们阅读{{1他们没有提示标志可能来自哪里。)

(3)第三个解决方案是建议orsogufo:覆盖Makefile.am中的用户变量CXXFLAGS。我建议反对它,因为它击败了GNU Build System的一个功能:允许用户在configure.ac - 时间覆盖此变量。例如,您可能想要输入

make

调试一段代码时,这将覆盖make CXXFLAGS='-O0 -ggdb' 的任何定义(但是 而不是那些CXXFLAGS)。说实话,大多数项目都无法正确支持,因为他们使用AM_CXXFLAGS

最后,我应该提到CXXFLAGS-fpic-Wall不是便携式选项。 根据项目的范围,您可能希望为这些(gnulib最近获取的新宏添加配置检查以检测警告标志,并且libtool可用于构建共享库。

答案 1 :(得分:0)

在configure.ac中使用EXTRA_CFLAGS

例如,对于您的情况,它将是:

EXTRA_CFLAGS=-fPIC -Wall -Wextra