Makefile 使用通配符生成文件目标,以使用目标字符串创建符号链接

Makefile 使用通配符生成文件目标,以使用目标字符串创建符号链接,makefile,wildcard,Makefile,Wildcard,我想要一组makefile规则,在构建项目之前创建到几个代码模块之一的符号链接。生成目标的名称将确定符号链接指向的文件。例如: 用户调用“make R3000” Make看到“data.asm”还不存在,因此创建了从“data_R3000.asm”到“data.asm”的符号链接 使用data.asm继续构建过程 我如何设置并制定规则来执行此操作?可能类似于: MODULES := $(patsubst data_%.asm,%,$(wildcard data_*.asm)) all:

我想要一组makefile规则,在构建项目之前创建到几个代码模块之一的符号链接。生成目标的名称将确定符号链接指向的文件。例如:

  • 用户调用“make R3000”
  • Make看到“data.asm”还不存在,因此创建了从“data_R3000.asm”到“data.asm”的符号链接
  • 使用data.asm继续构建过程
我如何设置并制定规则来执行此操作?

可能类似于:

MODULES := $(patsubst data_%.asm,%,$(wildcard data_*.asm))

all:
    ...

data.asm:
        [ -n "$(filter $(MAKECMDGOALS),$(MODULES))" ] || { echo unknown module: $(MAKECMDGOALS) ; exit 1; }
        ln -s $(filter $(MAKECMDGOALS),$(MODULES)) $@

然后确保
data.asm
被列为相应规则中的先决条件。

我会这样做:

.PHONY mklink

mklink:
    test -e data_$(MAKECMDGOALS).asm || exit 1
    ln -s data_$(MAKECMDGOALS).asm data.asm

然后使所有(和其他目标)依赖于mklink。您不应该将data.asm作为规则中的目标的原因是,如果您运行
make R3000
,则将创建data.asm,然后如果您运行
make L2000
,data.asm文件将指向错误的目录,并且不会被覆盖(我假设这不是您想要的)。测试行检查链接目标是否存在,如果不存在,则以1退出,导致目标失败。您还应该添加一个检查,确保MAKECMDGOALS也是一个元素。

类似这样的内容正是我要寻找的。非常感谢。