Makefile 在GNU Make中连接列表元素

Makefile 在GNU Make中连接列表元素,makefile,Makefile,在makefile中,我有一个带有目录列表的变量,如下所示: DIRS = /usr /usr/share/ /lib 现在,我需要从中创建PATH变量,它基本相同,但使用分号作为分隔符: PATH = /usr:/usr/share/:/lib 我该怎么做?我的意思是,如何用分号而不是空格连接DIRS列表的元素?您可以使用$(subst)命令,结合一些小技巧来获得一个值为单个空格的变量: p = /usr /usr/share /lib noop= space = $(noop) $(no

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

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

PATH = /usr:/usr/share/:/lib
我该怎么做?我的意思是,如何用分号而不是空格连接DIRS列表的元素?

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

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

all:
        @echo $(subst $(space),:,$(p))
最干净的表格(我能找到):

注:

  • 将其转换为伪函数比内联执行一系列神秘的字符串操作更清楚
  • 我包括$(通配符)函数,因为在指定类路径时,几乎总是同时使用这两个函数
  • 请确保不要在逗号后添加任何额外的空格,否则会得到类似“::a:b:c:d:e”的结果

您使用“:”作为分隔符,因此您使用的是Linux。考虑使用BASH工具链代替单结点

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

你也可以使用
$(eval)
而不是
$(noop)
,这样就不需要定义noop了。看起来像是一个黑魔法,但实际上,中描述的改变了我的想法。我认为Dave的$(eval)解决方案更好。它不仅避免了使用$(noop)而且还使用$(space)污染变量名空间。我要补充一点:既然java支持“-cp lib/*”语法,那么就可以避免使用$(通配符$1),这可能是一件好事,因为Java项目使用大量JAR的趋势可能会导致在某些平台上超过长度限制的情况
PATH := $(shell echo $(DIRS) | sed "s/ \+/:/g")