0

我在makefile中有以下代码块:

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

基本上,这是必要的,因为如果构建目录不存在,我的 makefile 不会崩溃和死亡——我希望它重新创建目录树的缺失部分。嵌套是因为我有一个构建目录,一个构建内部的测试目录(用于模块测试与完整程序),然后在该测试目录中用于测试的各个目录,每个目录都需要一个源代码、obj 和bin 目录。所以要创造很多东西!

这是我的问题。有没有办法利用makefile“魔法”来给它一些单一的变量,比如:

PATH=./build/tests/param_test/bin

并让它创建我需要的所有目录,比如一个或两个衬里,而不是那个巨大的 if 语句?

提前致谢!!

4

2 回答 2

3
mkdir -p build/tests/param_test/bin

mkdir 手册:-p,--parents,如果存在则没有错误,根据需要创建父目录

于 2010-07-08T19:15:08.100 回答
0

如果您需要编写一个可移植的 makefile(例如,它也可以在 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 one-liner的解决方案。我们系统中的其他构建步骤需要 Perl,所以这对我们来说是可移植的。YMMV。

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

请注意,使用 Perl,您也可以在 Windows 上使用正斜杠。

于 2010-12-21T11:20:00.017 回答