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

时间:2018-11-30 16:01:40

标签: bash makefile

我正在尝试删除路径前缀。这是一个仅显示问题的小示例。

制作文件

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

Stack Exchange上有类似的帖子。但是,由于某种原因,它们没有在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 个答案:

答案 0 :(得分:0)

您在这里遇到很多问题。最基本的是,如果要使用shell变量,则必须转义美元符号,以使make不能对其进行解释。而且,您只能在shell变量上使用shell变量替换,而$@是一个make变量,因此您需要:

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

更微妙的是,make在调用配方时始终使用/bin/sh(POSIX标准外壳程序),并且以上语法特定于bash。一种解决方法是在makefile中显式设置SHELL := /bin/bash,以强制make使用bash。幸运的是,这不是必需的,因为POSIX sh也可以做到这一点,就像Reda在另一个答案中提到的那样:

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

但是,您甚至不需要任何,因为make将automatic variable $*设置为与词干匹配的目标部分({{ 1}}):

%

还将@echo $*.html 设置为$(@F)变量的文件名部分:

$@

ETA

如果您想使用GNU做与shell变量扩展非常相似的操作,则可以使用:

@echo $(@F)