Нужна помощь в создании нескольких каталогов в Makefile - PullRequest
0 голосов
/ 08 июля 2010

У меня есть следующий блок кода в make-файле:

param_test_dir:

    @if test -d $(BUILD_DIR); then \
        echo Build exists...; \
    else \
    echo Build directory does not exist, making build dir...; \
mkdir $(BUILD_DIR); \
fi
@if test -d $(TEST_DIR); then \
    echo Tests exists...; \
else \
    echo Tests directory does not exist, making tests dir...; \
mkdir $(TEST_DIR); \
fi
@if test -d $(TEST_DIR)/param_unit_test; then \
    echo Param unit test directory exists...; \
else \
    echo Param unit test directory does \
    not exist, making build dir...; \
    mkdir $(TEST_DIR)/param_unit_test; \
fi
@if test -d $(TEST_DIR)/param_unit_test/source; then \
    echo Param unit test source directory exists...; \
else \
    echo Param unit test source directory does \
    not exist, making build dir...; \
    mkdir $(TEST_DIR)/param_unit_test/source; \
fi
@if test -d $(TEST_DIR)/param_unit_test/obj; then \
    echo Param unit test object directory exists...; \
else \
    echo Param unit test object directory does \
    not exist, making object dir...; \
    mkdir $(TEST_DIR)/param_unit_test/obj; \
fi
@if test -d $(TEST_DIR)/param_unit_test/bin; then \
    echo Param unit test executable directory exists...; \
else \
    echo Param unit test executable directory does \
    not exist, making executable dir...; \
    mkdir $(TEST_DIR)/param_unit_test/bin; \
fi

По сути, это необходимо, так как я не могу потерять мой make-файл и умереть, если каталог сборки не существует - яхочу, чтобы он воссоздал недостающие части дерева каталогов.Вложенность происходит из-за того, что у меня есть каталог сборки, каталог тестов внутри сборки (для тестов модулей и полных программ), а затем в этом каталоге тестов отдельные каталоги для тестов, каждый из которых нуждается в исходном коде, объекте obj икаталог bin.Так много вещей для создания!

Вот мой вопрос.Есть ли способ воспользоваться преимуществом makefile "magic", чтобы передать ему какую-то одну переменную, такую ​​как:

PATH=./build/tests/param_test/bin

, и заставить ее создавать все нужные мне каталоги, как один или два лайнера, а не как огромныеСкажите?

Заранее спасибо !!

Ответы [ 2 ]

3 голосов
/ 08 июля 2010
mkdir -p build/tests/param_test/bin

инструкция mkdir : -p, --parents, ошибки не существует, если необходимо, создайте родительские каталоги

0 голосов
/ 21 декабря 2010

Если вам нужно написать переносной make-файл (например, который работает также в Windows), вы можете рассмотреть решение, в котором вы можете использовать одну и ту же команду для всех платформ. Решение @Sjoerd отлично работает на unixish машинах, но есть небольшая разница для Windows (я пробовал на XP, Vista и Windows 7):

# Unix solution
mkdir -p build/tests/param_test/bin
# Windows solution
mkdir build\tests\param_test\bin

Нет -p опция, и вам нужны обратные слеши.

Он рекурсивно создает каталоги, но жалуется, если каталог уже существует. Не существует «тихой» опции для подавления жалобы.

То, что я использую, - это решение, использующее однострочный Perl . Другие этапы сборки в нашей системе требуют Perl, так что это переносимо для нас. YMMV.

perl "-MFile::Path" -e "mkpath 'build/tests/param_test/bin'"

Обратите внимание, что в Perl вы можете использовать косую черту и в Windows.

...