19

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

src/A
   /B
   /C

在每个中,Makefile.am 包含

AM_CXXFLAGS = -fPIC -Wall -Wextra

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

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

提前致谢

4

2 回答 2

26

你可以做几件事:

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

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的 s 中说什么,它们会自动继承这个全局定义。缺点是您不能轻易选择退出(使用第一个解决方案很容易决定不包含common.mk)并且依赖项对第三方人员来说并不是真正明确的(当他们阅读时,Makefile.am他们没有关于标志位置的提示可能来自)。

(3)第三种解决方案是按照orsogufo的建议:覆盖用户变量 CXXFLAGS in configure.ac。我建议不要这样做,因为它破坏了 GNU 构建系统的一个特性:允许用户在make-time 覆盖这个变量。例如,您可能想要输入

make CXXFLAGS='-O0 -ggdb' 

在调试一段代码时,这将覆盖CXXFLAGS(但不会覆盖AM_CXXFLAGS)的任何定义。老实说,大多数项目都无法正确支持这一点,因为它们玩弄CXXFLAGS.

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

于 2008-11-28T10:17:32.193 回答
0

在 configure.ac 中使用 EXTRA_CFLAGS

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

EXTRA_CFLAGS=-fPIC -Wall -Wextra

于 2016-03-17T12:21:09.803 回答