基于活动makefile目标的变量(外部规则)

时间:2016-06-27 23:37:08

标签: makefile gnu-make

我的构建配置看起来像这样:

生成文件:

build-for-x: X := yes
build-for-x: all

build-for-y: Y := yes
build-for-y: all

SRC :=
include foo.mk
include bar.mk

all: # ... some targets which use SRC eventually

foo.mk:

ifeq ($(X),yes)
    SRC += foo_x.c
endif
ifeq ($(Y),yes)
    SRC += foo_y.c
endif

bar.mk:

ifeq ($(X),yes)
    SRC += bar_x.c
endif
ifeq ($(Y),yes)
    SRC += bar_y.c
endif

这显然是高度简化的。我实际上在做的是为两个不同的嵌入式平台构建相同的代码库,其中包含许多不同的模块化部分(foo和bar)以及源,包含,测试等的几个变量。

上述方法不起作用,因为X或Y仅在build-for-x / build-for-y作为先决条件的目标中设置。 foo.mk / bar.mk中的代码在未设置任何变量时预先进行评估。

有没有办法处理这样的情况?我可以将构建配置重构为:

,这是一种理智的方式
  • 保留模块性(foo.mk/bar.mk是单独的文件)
  • 允许其中一位运行make build-for-x / make build-for-y来构建单独的实现

我想避免让foo.mk看起来像:

build-for-x: SRC += foo_x.c
build-for-y: SRC += foo_y.c

除非我绝对不得不这样做,因为这会迫使我依赖某个特定的目标。我宁愿将所有依赖目标的作业保持在最高级别。

1 个答案:

答案 0 :(得分:2)

这个怎么样:

生成文件:

build-for-x: SRC := SRC_X
build-for-x: all

build-for-y: SRC := SRC_Y
build-for-y: all

foo.mk:

SRC_X += foo.x_c
SRC_Y += foo.y_c

bar.mk:

SRC_X += bar.x_c
SRC_Y += bar.y_c