获取GNU make中文件夹的基本名称

时间:2012-09-14 05:09:36

标签: makefile gnu-make

似乎GNU make解释的basename函数与bash的basename不同。前者剥去后缀,而后者也剥离路径。如何在makefile中获取文件夹的基本名称?

另外,为什么他们改变了呢? (我花了20分钟才找到错误的来源)

4 个答案:

答案 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)