【发布时间】:2014-01-23 06:08:31
【问题描述】:
我有一个项目,其源代码位于src/ 目录及其子目录(例如src/foo/ 和src/bar/),以及obj 目录和匹配的子目录中的对象(例如obj/foo/ 和@987654328 @)。
我使用以下(简化的)Makefile:
SOURCES=$(shell find src/ -type f -name '*.c')
OBJECTS=$(patsubst src/%.c,obj/%.o,$(SOURCES))
all: $(OBJECTS)
obj/%.o: src/%.c
gcc -c $< -o $@
问题
问题是,如果obj/ 或其子目录之一不存在,我会收到以下错误:
Fatal error: can't create obj/foo/f1.o: No such file or directory
我如何告诉 make %.o 文件依赖于其包含目录的创建?
我尝试了什么
One solution没有子目录的时候是使用“order only 先决条件”:
$(OBJECTS): | obj
obj:
mkdir $@
但这仅解决了obj/ 的问题,而不是obj/foo 和obj/bar/。我考虑过使用$(@D),但我不知道如何将所有这些放在一起。
我还在每个目录中使用了隐藏的标记文件,但这只是一个 hack,我还在 GCC 命令之前放了一个mkdir -p,但这也让人觉得很hacky。如果这是一个潜在的解决方案,我宁愿避免使用递归 makefile。
小例子
要创建一个类似于我的最小项目,您可以运行:
mkdir /tmp/makefile-test
cd /tmp/makefile-test
mkdir src/ src/foo/ src/bar/
echo "int main() { return 0; }" > src/main.c
touch src/foo/f1.c src/bar/b1.c src/bar/b2.c
【问题讨论】:
标签: makefile directory dependencies subdirectory