我拥有可以为我创建平台的工具。我的目标取决于这些生成的来源。此目标必须是通用的(通用的方式,它使用模式:.build_bsp_%
)-这样我就不能使用$(shell find...)
。
因此,当预先创建平台时,一切正常:
$ make platform
mkdir -p platform/a53/AFS/bsp/
touch platform/a53/AFS/bsp/generated.c
mkdir -p platform/r5/MMO/bsp/
touch platform/r5/MMO/bsp/generated.c
$ make .build_bsp_AFS
-> make -C platform/a53/AFS/bsp
$
但是当源不存在时-因为平台不存在-它不起作用:
$ make .build_bsp_AFS
make: *** No rule to make target '.build_bsp_AFS'. Stop.
$
这是我的问题的精简版本:
GENERATE_PLATFORM=platform/a53/AFS/bsp/generated.c platform/r5/MMO/bsp/generated.c
platform: $(GENERATE_PLATFORM)
$(GENERATE_PLATFORM):
mkdir -p $(dir $@)
touch $@
.build_bsp_%: platform/*/%/bsp/*.[chS] $(GENERATE_PLATFORM)
@echo " -> $(MAKE) -C $(dir $^)"
@touch $@
恐怕我必须采取完全不同的方式...
这不是一个很好的解决方案,但是在问这个问题时,我发现了一个可能的“解决方法”:不要在先决条件中使用正则表达式,并且对(尚未生成的)源文件使用空规则:
GENERATE_PLATFORM=platform/a53/AFS/bsp/generated.c platform/r5/MMO/bsp/generated.c
%.c: ;
%.h: ;
%.S: ;
platform: $(GENERATE_PLATFORM)
$(GENERATE_PLATFORM):
mkdir -p $(dir $@)
touch $@
.build_bsp_%: platform/*/%/bsp/*.c platform/*/%/bsp/*.h platform/*/%/bsp/*.S $(GENERATE_PLATFORM)
@echo " -> $(MAKE) $(dir $<)"
@touch $@
可惜的是,您不能将“最后一种资源来源”限制为例如仅bsp文件夹...但是它正在工作:
$ make .build_bsp_MMO
mkdir -p platform/a53/AFS/bsp/
touch platform/a53/AFS/bsp/generated.c
mkdir -p platform/r5/MMO/bsp/
touch platform/r5/MMO/bsp/generated.c
-> make platform/*/MMO/bsp/
$