我的构建配置看起来像这样:
生成文件:
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中的代码在未设置任何变量时预先进行评估。
有没有办法处理这样的情况?我可以将构建配置重构为:
,这是一种理智的方式make build-for-x
/ make build-for-y
来构建单独的实现我想避免让foo.mk看起来像:
build-for-x: SRC += foo_x.c
build-for-y: SRC += foo_y.c
除非我绝对不得不这样做,因为这会迫使我依赖某个特定的目标。我宁愿将所有依赖目标的作业保持在最高级别。
答案 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