【问题标题】:Need Help Creating Multiple Directories in Makefile需要帮助在 Makefile 中创建多个目录
【发布时间】:2011-03-13 12:47:14
【问题描述】:

我在 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 语句?

提前致谢!!

【问题讨论】:

    标签: c++ shell makefile directory gnu-make


    【解决方案1】:
    mkdir -p build/tests/param_test/bin
    

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

    【讨论】:

    • 啊。多么明显的答案...谢谢...抱歉这个愚蠢的问题...提醒自己多阅读手册(尤其是因为我整天告诉我的UG研究人员这样做)... '_'
    • 红利问题@Sjoerd ...你可以在变量名中使用通配符吗,例如如果我有文件parameter_manager.cpp、parameter_manager_simple.cpp、parameter_manager_namd.cpp等...我可以做类似@ 987654323@??
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 2014-06-16
      • 2020-03-06
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-08-31
      • 2021-06-22
      • 1970-01-01
      相关资源
      最近更新 更多