我需要从路径中捕获测试名称并使用它来使用 makefile 创建目录。以下是我到目前为止尝试过的代码。下面的代码适用于固定的“test_path”长度。
%cat 生成文件
test_path := /dir1/dir2/dir3/test.sv
test_split := $(subst /, ,$(test_path:v%=%))
test_a := $(word 1,$(test_split))
test_b := $(word 2,$(test_split))
test_c := $(word 3,$(test_split))
test_d := $(word 4,$(test_split))
test_d_split := $(subst ., ,$(test_d:v%=%))
test_d_1 := $(word 1,$(test_d_split))
all:
echo test_split = $(test_split)
echo test_a = $(test_a)
echo test_b = $(test_b)
echo test_c = $(test_c)
echo test_d = $(test_d)
echo test_d = $(test_d)
echo test_d_1 = $(test_d_1)
mkdir $(test_d_1)
我们使用上面的代码成功创建了一个测试目录,但是我们需要处理不同长度的路径。我们该怎么做?
结果:
使用固定长度的 test_path := /dir1/dir2/dir3/test.sv -> 工作正常
如果 test_path 更新了 test_path := /dir1/dir2/dir3/dir4/test.sv % mkdir dir4 -> 将 dir4 创建为目录。
你想要达到的目标并不是100%清楚。如果您要创建的测试目录是删除所有后缀的文件名(例如,
test
当test_path = a/b/c/test.1.2.3
)并且如果您使用GNU make,您可以尝试:
all:
mkdir -p $(word 1,$(subst ., ,$(notdir $(test_path))))
注意
-p
的mkdir
选项,当目录已经存在时忽略错误
如果我正确解释你的问题,你会想做:
testdir := /dir1/dir2/dir3/dir_n/foo.bar
all:
mkdir -p $(basename $(notdir $(testdir)))
这将为上面的 testdir 值创建目录
foo
。有关这些的更多信息,请参阅文件名函数
注意,如果你想去除所有后缀(即你的名字是
/dirs/test.foo.bar
,而你只想要test
,你可以这样做:
all:
mkdir -p $(firstword $(subst ., ,$(notdir $(testdir))))
看起来您想选择路径的最后一个元素,并使用它(减去任何文件扩展名)作为目录的名称。我什至不会像示例代码那样remotely。
shell 比
make
本身更适合这个,你可以在你的 makefile 中使用它。例如,
test_path = /dir1/dir2/dir3/test.sv
all:
file=$$(basename '$(test_path)'); mkdir "$${file/.*}"
basename
命令从路径中提取最后一个组件。 ${file/.*}
被(由 shell)扩展为(shell)变量 file
的值,减去以 .
字符开头的最长子字符串。要将 $
传递给 shell,它必须加倍以防止 make
解释它。
如果您出于某种原因被迫使用特定于 GNU 的
make
函数来进行文本操作,那么它具有 $(notdir)
用于提取路径的文件名部分,以及 $(basename)
用于删除文件扩展名(注意不幸的是这个 basename
函数和同名 shell 命令的动作之间的区别)。你可以像这样使用它们:
test_path := /dir1/dir2/dir3/test.sv
dirname := $(notdir $(basename $(test_path)))
all:
mkdir '$(dirname)'