2010-07-08 3 views
0

partir de la ligne de commande, vous pouvez faire plusieurs répertoires comme ceci:Comment puis-je passer une liste de répertoires séparés par des virgules à mkdir à partir d'un Makefile?

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

Comment la même chose peut être réalisée à partir d'un Makefile? Je suis venu avec ceci:

# 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) 

Ce qui fait juste un répertoire appelé « {src, test, débogage} » au lieu de trois répertoires distincts. Je soupçonne que le problème pourrait être avec/autour des accolades ... Qu'est-ce que je fais mal?

Éditer: Il semble que ce soit le shell qui soit utilisé. L'exemple en haut était en bash, mais sh échoue:

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

Lorsque j'exécute votre fichier makefile, il crée les répertoires correctement. J'utilise GNUMake (3.81). Et vous? – Beta

+2

Le problème n'est pas make, mais le shell que make appelle. Le make de drtwox utilise (probablement) un shell qui ne supporte pas la syntaxe {}. –

Répondre

4

Je crois que le problème est que faire invoque une coquille qui ne supporte pas la syntaxe {}. Vous pouvez remplacer votre règle par une règle plus simple et plus portable:

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

Merci. Beaucoup plus simple que ma tentative bizarre! –

Questions connexes