GNU Make:具有类似通配符功能的多个PHONY目标? (将不同的预处理器指令传递给编译器)

时间:2013-12-12 17:26:21

标签: makefile wildcard

这里的标题可能有点混乱,因为我很难用一句话来解释这个问题。我知道通配符不能与虚假目标一起使用。这个问题是询问是否有任何一种解决方法可以通过make的PHONY目标将不同的预处理器指令传递给编译器。

例如,如果定义了MODEL_A,MODEL_B或MODEL_C,我的软件编译方式会有所不同。因此,如果我将-DMODEL_A传递给编译器,它将以不同于我传递-DMODEL_B的方式进行编译。在我的makefile中,我有以下内容:

AVAILABLE_MODELS=MODEL_A MODEL_B MODEL_C
SELECTED_MODEL=
...
.PHONY: $(AVAILABLE_MODELS)
MODEL_A: SELECTED_MODEL=MODEL_A
MODEL_B: SELECTED_MODEL=MODEL_B
MODEL_C: SELECTED_MODEL=MODEL_C
$(AVAILABLE_MODELS): Build_Image
...
#Build image for selected model (pass "-D$(SELECTED_MODEL)" to compiler)
Build_Image:
...

如果我可以在添加新模型后将任何新模型添加到AVAILABLE_MODELS变量,那将是最理想的。在上面的设计中,我还需要确保我使用适当的选定模型名称定义目标。如果我能做到以下情况会很好。

MODEL_%: SELECTED_MODEL=MODEL_%

当然,由于它使用通配符,因此被忽略为虚假目标候选者。是否有任何“技巧”我缺少这个?有什么方法可以优化上述内容吗?

1 个答案:

答案 0 :(得分:1)

您可以使用eval执行此操作:

$(foreach M,$(AVAILABLE_MODELS),$(eval $M: SELECTED_MODEL=$M))

应该有用。