如何拆分动态字符串并为每个单词分配变量?

问题描述 投票:0回答:3

我需要从路径中捕获测试名称并使用它来使用 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 创建为目录。

makefile
3个回答
1
投票

你想要达到的目标并不是100%清楚。如果您要创建的测试目录是删除所有后缀的文件名(例如,

test
test_path = a/b/c/test.1.2.3
)并且如果您使用GNU make,您可以尝试:

all:
    mkdir -p $(word 1,$(subst ., ,$(notdir $(test_path))))

注意

-p
mkdir
选项,当目录已经存在时忽略错误


0
投票

如果我正确解释你的问题,你会想做:

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

0
投票

看起来您想选择路径的最后一个元素,并使用它(减去任何文件扩展名)作为目录的名称。我什至不会像示例代码那样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)'
© www.soinside.com 2019 - 2024. All rights reserved.