我在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“magic”来为它提供一些单变量,如:
PATH=./build/tests/param_test/bin
让它创建我需要的所有目录,如一个或两个班轮,而不是那个庞大的if语句?
提前致谢!!
答案 0 :(得分:3)
mkdir -p build/tests/param_test/bin
mkdir manual: - p, - 父母, 如果存在则没有错误,根据需要创建父目录
答案 1 :(得分: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上使用正斜杠。