是否可以让 make 自动完成使用“addsuffix”或“addprefix”创建的目标?

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

当然使用 GNU Make。
我有以下设置:

Makefile

subdir1
--- Makefile
--- source1.c
--- binary1

subdir2
--- Makefile
--- source2.c
--- binary2

子目录中的两个 makefile 都有一个运行目标,该目标执行其自身生成的二进制文件。 根 makefile 包含

all
目标,它运行
make -C subir1 && make -C subdir2
:

SUBDIRS = subdir1 subdir2

all:
    @for DIR in $(SUBDIRS); do \
        $(MAKE) -C $$DIR; \
    done

clean:
    @for DIR in $(SUBDIRS); do \
        $(MAKE) -C $$DIR clean; \
    done

$(SUBDIRS):
    $(MAKE) -C $@

底部位允许我对单个子目录执行

make all
。 我想要一个类似的
make run
目标,由
$(SUBDIRS)
生成。 我试过了

run-$(SUBDIRS):
   make -C $(subst run-,,$@) run

但是目标扩展为

run-subdir1 subdir2
,并且没有将前缀添加到
$(SUBDIRS)

中的第二项

如果我添加一个新的 var

RUN_TARGETS = $(addprefix run-, $(SUBDIRS)
,它可以工作,但是 make 无法识别自动完成的目标。是否有任何选项可以让 make 知道必须扩展 RUN_TARGETS 或任何其他方法来为项目列表添加前缀?

编辑

对我来说,问题是我的 shell、zsh,而不是 make 本身。 Bash 补全正确。

makefile gnu-make
2个回答
1
投票

您可以使用模式规则

run-%:
        $(MAKE) -C $* run

或者如果您希望更明确,可以使用静态模式规则

$(addprefix run-,$(SUBDIRS)): run-%:
        $(MAKE) -C $* run

0
投票

补充@MadScientist 的解决方案:

使用替换引用来简化代码(如果您熟悉这个概念)。

$(SUBDIRS:%=run-%): run-%:
    $(MAKE) -C $* run
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.