【发布时间】:2014-01-11 16:22:33
【问题描述】:
我想要一组生成文件规则,用于在构建项目之前创建指向多个代码模块之一的符号链接。 make 目标的名称将确定符号链接指向的文件。例如:
- 用户调用“make R3000”
- Make 发现“data.asm”尚不存在,因此创建了一个从“data_R3000.asm”到“data.asm”的符号链接
- 使用 data.asm 继续构建过程
如何设置 make 规则来执行此操作?
【问题讨论】:
我想要一组生成文件规则,用于在构建项目之前创建指向多个代码模块之一的符号链接。 make 目标的名称将确定符号链接指向的文件。例如:
如何设置 make 规则来执行此操作?
【问题讨论】:
可能是这样的:
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 是否也恰好是一个元素。
【讨论】: