在GNU Make中加入列表的元素

Max*_*yko 23 makefile

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

DIRS = /usr /usr/share/ /lib
Run Code Online (Sandbox Code Playgroud)

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

PATH = /usr:/usr/share/:/lib
Run Code Online (Sandbox Code Playgroud)

我怎么做?我的意思是,我如何用分号而不是空格加入DIRS列表的元素?

Eri*_*ski 36

您可以使用该$(subst)命令,结合一个小技巧来获取具有单个空间值的变量:

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

all:
        @echo $(subst $(space),:,$(p))
Run Code Online (Sandbox Code Playgroud)

希望有所帮助,

埃里克·梅尔斯基

  • 您也可以在此处使用$(eval)而不是$(noop),从而无需定义noop。 (2认同)
  • 看起来像黑魔法,但在[手册]中进行了描述(http://www.gnu.org/software/make/manual/make.html#Syntax-of-Functions) (2认同)

Dav*_*son 10

最干净的表格(我能找到):

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
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 将其转换为伪函数使得意图比在线内进行一堆神秘的字符串操作更清晰.
  • 我包含了$(通配符)函数,因为在指定类路径时,您几乎总是将这两个一起使用
  • 确保不要在逗号后添加任何多余的空格,否则你会得到类似":: a:b:c:d:e"的内容.

  • 一个更通用的形式:joinwith = $(subst $(eval),$ 1,$ 2)$(调用joinwith,-o,$(list_of_files_separated_by_spaces)) (2认同)