2010-07-08 28 views
0

在命令行中,你可以做多个目录,如下所示:如何从Makefile中将逗号分隔的目录列表传递给mkdir?

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 

我怀疑这个问题可能与花括号/围绕着...我做错了什么?

编辑:它似乎是壳使用。顶部的示例是bash,但是sh失败:

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

当我运行makefile时,它会正确创建目录。我正在使用GNUMake(3.81)。你呢? – Beta 2010-07-08 01:30:04

+2

问题不在于make,而在于调用的shell。 drtwox的make是(可能)使用不支持{}语法的shell。 – 2010-07-08 01:58:10

回答

4

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

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

谢谢。比我奇怪的尝试更简单! – 2010-07-08 02:19:49

相关问题