2008-11-27 26 views
17

我有几个来源目录的项目:自动工具:如何设置全局汇编标志

src/A 
    /B 
    /C 

在各中,Makefile.am包含

AM_CXXFLAGS = -fPIC -Wall -Wextra 

如何才能避免在每个源重复此文件夹?

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

在此先感谢

回答

23

你可以做几件事情:

(1)一种解决方案是包括所有Makefile.am一个普遍的makefile片段:在这种情况下

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

你会写

AM_CXXFLAGS = -fpic -Wall -Wextra 

common.mk并且将来只需编辑此文件,将更容易为所有Makefile.am s添加更多宏或规则。

(2)另一种解决办法是在你的configure.ac全局设置这些变量(名称configure.in早就已经不建议使用),如:

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

然后,你甚至不必说什么在你的Makefile.am中,它们会自动继承这个全局定义。缺点是你不能轻松退出(第一种解决方案很容易决定不包括common.mk),并且依赖关系对第三方人员并不明确(当他们阅读Makefile.am时,他们没有暗示关于哪里这些标志可能来自)。 (3)第三种解决方案是按照orsogufo的建议进行:覆盖用户变量CXXFLAGS configure.ac。我建议不要这样做,因为它违背了GNU构建系统的一个特点:允许用户在make时间覆盖这个变量。例如,您可能需要调试一段代码时,键入

make CXXFLAGS='-O0 -ggdb' 

,这将覆盖(而不是那些在AM_CXXFLAGS但 )的CXXFLAGS任何定义。说实话,大多数项目都没有正确支持这个,因为他们玩CXXFLAGS

最后,我应该提一下,-fpic,-Wall-Werror不是便携式选项。 根据您的项目范围,您可能需要为这些添加配置检查(gnulib最近获得的新宏以测试警告标志,libtool可用于构建共享库)。

+0

使用包括Makefile.am成语将造成的automake输出依赖关系的Makefile和Makefile.in,最终得到回包含文件和automake文件。所以改变它也会导致更新。 – johnny 2009-02-12 08:27:43

0

在configure中使用EXTRA_CFLAGS。AC

例如,对于您的情况会是这样:

EXTRA_CFLAGS=-fPIC -Wall -Wextra