自动化构建:修改隐式构建规则以包含额外标志

3
如何添加额外的标志变量(如CPPFLAGS),以便应用于所有makefile?目前,我们正在使用CPPFLAGS,但那应该是保留给用户变量的,我想保留它。我不想使用AM_CPPFLAGS,因为我想保留它用于特定的Makefile.amS。我想要的是像GLOBAL_CPPFLAGS这样的东西,我可以在configure.ac中设置它并将其应用于所有内容。如果有一种明确忽略标志的方法,那就更好了。
我认为我需要做的是编写自己的make规则,但是如何使其在所有子文件夹中可用而不必将其复制到每个Makefile.am中?
3个回答

4
您没有使用CPPFLAGS是正确的。那是一个用户变量。我会这样做:

在您的源目录根目录中,创建一个名为common.am的文件,并在其中定义您需要的任何内容:

## common.am
AM_CPPFLAGS = -DFOO

我知道你说过不想使用AM_CPPFLAGS,但请听我解释。在你的各个子目录中,使用include $(top_srcdir)/common.am并根据需要扩展或覆盖AM_CPPFLAGS

## bar/Makefile.am
include $(top_srcdir)/common.am
AM_CPPFLAGS += -DBAR

如果你想要覆盖原有内容,使用=替代+=:
## baz/Makefile.am
include $(top_srcdir)/common.am
AM_CPPFLAGS = -DBAZ

6
configure.ac 中,你可以使用 AC_SUBST([AM_CPPFLAGS], ["-Whatever"]) 替换 include,然后在需要使用它的 Makefile.am 中简单地使用 += 进行更新。请注意,这不会改变原来的意思。 - adl
谢谢,我做了类似的事情,但选择使用自己的变量(例如GLOBAL_CPPFLAGS),并从configure.ac中的AC_SUBST进行替换。然后我在所有makefile中将这些标志包含在等效的AM_CPPFLAGS中,并在target_CPPFLAGS中包含AM_CPPFLAGS。我认为这可以提供最大的整体控制,并且正在发生的事情非常明确。 - deuberger
如果你的意思是你写了 target_CPPFLAGS = $(AM_CPPFLAGS),那么你不必这样做,因为它作为默认值使用。如果你的意思是你写了 target_CPPFLAGS = $(AM_CPPFLAGS) -DFOO,我能理解这样做的意义。 - Jack Kelly
1
是的,我指的是后者。具体来说,在任何设置了target_CPPFLAGS的地方,我都在定义中包含了$(AM_CPPFLAGS)。在target_CPPFLAGS被设置为空的情况下,我通常会将其删除,以便像你所说的那样使用AM_CPPFLAGS。 - deuberger

1

我认为你已经回答了自己的问题:你将不得不将新规则复制到每个 makefile 中。


1
错误。automake 支持 include:http://www.gnu.org/software/hello/manual/automake/Include.html#Include - Jack Kelly
杰克,这有效地复制了规则,这正是他的问题所在。 - Steve Emmerson
我想它确实可以,但复制不是手动完成的,而且有一个中央位置来更新规则或变量。 - Jack Kelly

0

CPPFLAGS 是您应该使用的机制。只需在 configure.ac 中的某个位置连接您想要的标志:

GLOBAL_CPPFLAGS="-DSOMETHING"

...

CPPFLAGS="$CPPFLAGS $GLOBAL_CPPFLAGS"

这样就可以了。


2
不,不是这样的。CPPFLAGS 是一个用户变量。http://www.gnu.org/software/hello/manual/automake/User-Variables.html#User-Variables 。然而,在常见的标志中使用 AC_SUBST 也不是一个坏主意。 - Jack Kelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接