代码之家  ›  专栏  ›  技术社区  ›  101010

如何在Makefile中的路径上执行字符串替换?

  •  0
  • 101010  · 技术社区  · 6 年前

    我正在尝试删除路径前缀。下面是一个小例子,说明了这个问题。

    生成文件

    dist_directory = ./dist
    
    default: build
    
    build: $(patsubst %.md, $(dist_directory)/%.html, $(wildcard *.md))
    
    $(dist_directory)/%.html: %.md
        @echo start
        @echo $@
        @echo ${$@//$(dist_directory)/}
        @echo end
    

    创建一个文件: touch stuff.md

    然后构建: make

    start
    dist/stuff.html
    
    end
    

    预期产出为:

    start
    dist/stuff.html
    /stuff.html
    end
    

    堆栈交换上也有类似的帖子。然而,由于某些原因,它们并没有在Makefile中为我工作。我可能做错了什么。

    https://unix.stackexchange.com/questions/311758/remove-specific-word-in-variable

    Remove a fixed prefix/suffix from a string in Bash

    Remove substring matching pattern both in the beginning and the end of the variable

    1 回复  |  直到 6 年前
        1
  •  0
  •   MadScientist    6 年前

    你这里有很多问题。最基本的一点是,如果你想使用shell变量,你必须避开美元符号,这样make就不会解释它。并且,您只能对shell变量使用shell变量替换,而 $@ 是一个make变量,因此您需要:

    @foo='$@' ; echo $${foo//$(dist_directory)/}
    

    更微妙的是make总是使用 /bin/sh SHELL := /bin/bash 在makefile中强制make使用bash。幸运的是,这不是必需的,因为POSIX sh也可以做到这一点,正如Reda在另一个答案中提到的:

    @foo='$@' ; echo $${@##*/}
    

    但更重要的是,你不需要 任何 这是因为make设置了 automatic variable $* 与杆匹配的目标部分 %

    @echo $*.html
    

    它还设置了 $(@F) 文件的文件名部分 $@ 变量:

    @echo $(@F)
    

    希腊字母表的第7个字母

    如果您想使用GNU make执行与shell变量扩展非常类似的操作,您可以使用:

    @echo $(patsubst $(dist_directory)/%,%,$@)