带有模式和通配符的Makefile:无规则可作为目标

问题描述 投票:0回答:1

我拥有可以为我创建平台的工具。我的目标取决于这些生成的来源。此目标必须是通用的(通用的方式,它使用模式:.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 $@

恐怕我必须采取完全不同的方式...

makefile gnu-make
1个回答
0
投票

这不是一个很好的解决方案,但是在问这个问题时,我发现了一个可能的“解决方法”:不要在先决条件中使用正则表达式,并且对(尚未生成的)源文件使用空规则:

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/
$ 
© www.soinside.com 2019 - 2024. All rights reserved.