我假设:
-
-
你只有“
合理的
“文件名和目录名没有空格、特殊字符甚至更糟。如果你命名你的makefile“
my favorite make file
-
/
文件系统或
不 像话
“文件名和目录名。把它放在Makefile的开头,在任何
include
DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
BASE := $(notdir $(patsubst %/,%,$(DIR)))
DIRNAME := $(DIR)$(BASE)
接下来,您需要创建子目录而不出错,即使它已经存在:
$(DIRNAME):
mkdir -p $@
$@
$(DIRNAME)
在这种情况下,强烈建议尽可能使用这些自动变量。别忘了
-p
选项,否则如果子目录存在,则配方将失败。
最后,必须确保在实际需要子目录之前执行命令。例如,假设你有一个
all
但您希望子目录在构建
目标。您可以编写一个简单的依赖关系:
all: $(DIRNAME)
<all-recipe>
$(DIRNAME):
mkdir -p $@
但在这种情况下,每次修改子目录的内容时,都将重建
全部的
目标,可能是无用的。这就是
order-only prerequisites
是有用的。它们必须存在,但make不考虑它们的最后修改日期。
DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
BASE := $(notdir $(patsubst %/,%,$(DIR)))
DIRNAME := $(DIR)$(BASE)
all: | $(DIRNAME)
<all-recipe>
$(DIRNAME):
mkdir -p $@
注意
|
有关生成要创建的子目录的名称的说明:
-
可以从其他目录调用make:
make -C <path-to-project>
make -f <path-to-project>/Makefile
所以,
$(shell basename "$$PWD")
$(notdir $(PWD))
)只有在从Makefile所在的目录调用make时,它才起作用。获取Makefile的绝对路径的正确方法是
$(abspath $(lastword $(MAKEFILE_LIST)))
. 记得把它放在任何
包括
指令。扩展结果示例:
/home/john/project1/Makefile
.
-
$(dir <some-path>)
只保留目录部分,删除文件部分。例子:
/home/john/project1/
.
-
$(patsubst %/,%,<some-path>)
/
/home/john/project1
.
-
$(notdir <some-path>)
/
. 例子:
project1
.
/主页/john/project1/Makefile
/主页/约翰/项目1
具有
make -C
或
make -f
,的
DIR
BASE
和
DIRNAME
变量将展开为:
DIR: /home/john/project1/
BASE: project1
DIRNAME: /home/john/project1/project1