在 GNU Make 中连接列表的元素

发布于 2024-08-08 02:27:47 字数 242 浏览 1 评论 0原文

在我的 makefile 中,我有一个带有目录列表的变量,如下所示:

DIRS = /usr /usr/share/ /lib

现在,我需要从中创建 PATH 变量,它基本上相同,但使用分号作为分隔符:

PATH = /usr:/usr/share/:/lib

我该如何做?我的意思是,如何用分号而不是空格连接 DIRS 列表的元素?

In my makefile I have a variable with a list of directories, like this:

DIRS = /usr /usr/share/ /lib

Now, I need to create PATH variable from it, which is basically the same, but uses semicolon as a separator:

PATH = /usr:/usr/share/:/lib

How do I do that? I mean, how do I join elements of DIRS list with semicolons, instead of spaces?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

小矜持 2024-08-15 02:27:48

您使用“:”作为分隔符,因此您使用的是 Linux。考虑使用bash工具链用单个冒号替换连续空格

PATH := $(shell echo $(DIRS) | sed "s/ \+/:/g")

You use ':' as separator, so you are on Linux. Consider using bash tool chain to replace continuous spaces by single colon

PATH := $(shell echo $(DIRS) | sed "s/ \+/:/g")
卷耳 2024-08-15 02:27:47

您可以使用 $(subst) 命令并结合一些小技巧来获取值为单个空格的变量:

p = /usr /usr/share /lib
noop=
space = $(noop) $(noop)

all:
        @echo $(subst $(space),:,$(p))

You can use the $(subst) command, combined with a little trick to get a variable that has a value of a single space:

p = /usr /usr/share /lib
noop=
space = $(noop) $(noop)

all:
        @echo $(subst $(space),:,$(p))
无言温柔 2024-08-15 02:27:47

最干净的形式(我能找到的):

classpathify = $(subst $(eval ) ,:,$(wildcard $1))
cp = a b c d/*.jar

target:
    echo $(call classpathify,$(cp))
# prints a:b:c:d/1.jar:d/2.jar

注释:

  • 将其转换为伪函数使得意图比内联进行一堆神秘的字符串操作更清晰。
  • 请注意 eval 后的尾随空格:$(eval )。如果没有这个,make 会将 $(eval) 解释为变量,而不是调用 eval 函数。如果省略尾随空格,您可以将 eval 替换为 some_undefined_variable,文本替换仍然会发生。但是,如果您使用 --warn-undefined-variable 标志运行 make,您将收到一条警告,指出 evalsome_undefined_variable 未定义。
  • 我包含了 $(wildcard) 函数,因为在指定类路径时,您几乎总是一起使用这两个函数。
  • 请确保不要在逗号后面添加任何额外的空格,否则您将得到类似“::a:b:c:d:e”的内容”。

Cleanest Form (that I can find):

classpathify = $(subst $(eval ) ,:,$(wildcard $1))
cp = a b c d/*.jar

target:
    echo $(call classpathify,$(cp))
# prints a:b:c:d/1.jar:d/2.jar

Notes:

  • Turning it into a pseudo-function makes the intention clearer than doing a bunch of arcane string manipulation inline.
  • Note the trailing space after eval: $(eval ). Without this, make interprets $(eval) as a variable rather than calling the eval function. If the trailing space is omitted, you could replace eval with some_undefined_variable and the text replacement will still happen. However, if you run make with the --warn-undefined-variable flag, you'll get a warning that eval or some_undefined_variable is undefined.
  • I included the $(wildcard) function because you almost always use these two together when specifying a classpath
  • Make sure not to put any extra spaces in after the commas or you will get something like "::a:b:c:d:e".
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文