如何从Makefile中将逗号分隔的目录列表传递给mkdir?

时间:2010-07-08 00:55:54

标签: shell makefile

从命令行可以创建多个目录,如下所示:

mkdir -p build/linux/{src,test,debug}

如何从Makefile中实现同样的目标?我想出了这个:

# The architecture/OS to compile for
ARCH        := linux

# Object files go here, under the architecture/OS directory
BUILD_DIR   := build/$(ARCH)

# List of source code directories
SOURCES     := src test debug

# e.g. The object files for 
# src/foo.c  test/bar.c  debug/bort.c
# will be in
# build/$(ARCH)/src/foo.o
# build/$(ARCH)/test/bar.o
# build/$(ARCH)/debug/bort.o

# Make a comma separated list of the source directories
# Is there a more concise way of doing this?
comma       :=,
empty       :=
space       := $(empty) $(empty)
DIRECTORIES := $(subst $(space),$(comma),$(SOURCES))

default:
    mkdir -p $(BUILD_DIR)/{$(DIRECTORIES)}

clean:
    rm -fr $(BUILD_DIR)

只创建一个名为“{src,test,debug}”的目录,而不是三个不同的目录。

$ make
mkdir -p build/linux/{src,test,debug}
$ ls build/linux/
{src,test,debug}
$ make clean
rm -fr build/linux
$ mkdir -p build/linux/{src,test,debug}
$ ls build/linux/
debug  src  test

我怀疑问题可能在大括号内/周围......我做错了什么?

编辑:它似乎确实是shell使用。顶部的例子是bash,但sh失败了:

$ sh
$ mkdir -p build/linux/{src,test,debug}
$ ls build/linux
{src,test,debug}

1 个答案:

答案 0 :(得分:4)

我认为问题是make调用的shell不支持{}语法。您可以使用更简单,更便携的规则替换规则:

        for p in $(SOURCES); do mkdir -p $(BUILD_DIR)/$$p; done