似乎GNU make解释的basename函数与bash的basename不同。前者剥去后缀,而后者也剥离路径。如何在makefile中获取文件夹的基本名称?
另外,为什么他们改变了呢? (我花了20分钟才找到错误的来源)
答案 0 :(得分:3)
是的,这很奇怪。您可以通过链接notdir and basename来获得所需的行为:
$(notdir names...)
Extracts all but the directory-part of each file name in names... For example,
$(notdir src/foo.c hacks)
produces the result ‘foo.c hacks’.
...
$(basename names...)
Extracts all but the suffix of each file name in names. If the file name
contains a period, the basename is everything starting up to (and not
including) the last period... For example,
$(basename src/foo.c src-1.0/bar hacks)
produces the result ‘src/foo src-1.0/bar hacks’.
因此,举例来说,您可以通过链接这样的函数将/home/ari/src/helloworld.c
转换为helloworld.html
:
SRC=/home/ari/src/helloworld.c
TARGET=$(addsuffix .html, $(notdir $(basename $(SRC))))
答案 1 :(得分:2)
你仍然可以使用bash的版本:
SHELL := /bin/bash
basename := $(shell basename /why/in/gods/name)
答案 2 :(得分:2)
我想basename(1)
命令有两个正交的功能 - 剥离足够的东西,剥离前导目录部分 - 而GNU make作者希望能够分别调用每个功能。当然,只有一个概念可以获得名称 basename 。
当然在makefile中,能够将 foo / bar / baz.c 转换为 foo / bar / baz 是有用的,这样你就可以添加新的后缀了最后在与源文件相同的目录中构造相关的文件名。
对@ire_and_curses的评论回答说明$(notdir $(CURDIR))
不足以满足您的目的,因为(作为目录)CURDIR可能被指定为
CURDIR = /foo/bar/
和notdir
由于尾部斜杠而剥离整个事物。为了允许这种编写目录路径的方式,您需要使用以下方法显式地删除尾部斜杠。 $(notdir $(CURDIR:%/=%))
。
答案 3 :(得分:2)
$(dir /path/to/file.txt)
怎么样?
https://www.gnu.org/software/make/manual/html_node/File-Name-Functions.html