Как мне передать список разделенных запятыми каталогов в mkdir из Makefile? - PullRequest
1 голос
/ 08 июля 2010

Из командной строки вы можете создать несколько каталогов, например:

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}

1 Ответ

4 голосов
/ 08 июля 2010

Я считаю, что проблема в том, что make вызывает оболочку, которая не поддерживает синтаксис {}.Вы можете заменить свое правило более простым, более переносимым правилом:

        for p in $(SOURCES); do mkdir -p $(BUILD_DIR)/$$p; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...