【问题标题】:Makefile target with wildcard to create symlink using target string带有通配符的 Makefile 目标以使用目标字符串创建符号链接
【发布时间】:2014-01-11 16:22:33
【问题描述】:

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

  • 用户调用“make R3000”
  • Make 发现“data.asm”尚不存在,因此创建了一个从“data_R3000.asm”到“data.asm”的符号链接
  • 使用 data.asm 继续构建过程

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

【问题讨论】:

    标签: makefile wildcard


    【解决方案1】:

    可能是这样的:

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

    【讨论】:

    • 我正在寻找这样的东西。谢谢!
    【解决方案2】:

    我会这样做:

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

    【讨论】:

      猜你喜欢
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      相关资源
      最近更新 更多