使用通配符的Makefile目标使用目标字符串创建符号链接

时间:2014-01-11 16:22:33

标签: makefile wildcard

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

  • 用户调用'make R3000'
  • 让我们看到'data.asm'还不存在,所以从'data_R3000.asm'到'data.asm'创建一个符号链接
  • 使用data.asm
  • 继续构建过程

如何设置make规则来执行此操作?

2 个答案:

答案 0 :(得分:4)

可能是这样的:

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被列为相应规则中的先决条件。

答案 1 :(得分:0)

我会做这样的事情:

.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也是一个元素。