【发布时间】:2012-05-16 01:43:49
【问题描述】:
我有以下目录结构:
./
|- obj/
|--- debug/
|--- release/
|- bin/
|--- debug/
|--- release/
|- src/
|--- main.c
|--- libb/
|----- foo.c
|- include/
|--- libb/
|----- foo.h
此外,我在Makefile 中手动指定各个对象的依赖关系,格式如下(示例):
main_DEPS = libb/foo
现在我希望能够输入make bin/debug/main,这会生成必要的依赖项和目标文件:
obj/debug/libb/foo.oobj/debug/main.obin/debug/main
我该怎么做?我目前的方法非常复杂且不完整:
-
以下创建目标文件。但是,如果它们尚不存在,则无法创建任何必要的子文件夹 (
libb)。它也不跟踪任何更改的头文件。 Makefile tutorial trick to generate prerequisites automatically 可以改编吗?CFLAGS+=-I include obj/*/%.o: src/%.cpp $(CC) $(CFLAGS) $< -c -o $@ -
以下尝试解决二进制文件的依赖关系并从所有必需的目标文件构建它。但我不知道如何从
*_DEPS变量中检索这些目标文件。.SECONDEXPANSION: bin/debug/%: obj/debug/%.o $(patsubst %,obj/debug/%.o,$($(patsubst bin/debug/%,%,$@)_DEPS)) $(LD) $(LDFLAGS) $< $(patsubst %,obj/debug/%.o,$($(patsubst bin/debug/%,%,$@)_DEPS)) -o $@ bin/release/%: obj/release/%.o $(patsubst %,obj/release/%.o,$($(patsubst bin/release/%,%,$@)_DEPS)) $(CXX) $(LDFLAGS) $< $(patsubst %,obj/release/%.o,$($(patsubst bin/release/%,%,$@)_DEPS)) -o $@不幸的是,这不会自动构建依赖关系:它只是抱怨“obj/debug/libb/foo.o:没有这样的文件或目录”——但如果我使用
mkdir obj/debug/libb; make obj/debug/libb/foo.o手动构建这个文件,它的工作方式就够奇怪了。它也非常复杂,并且使用了无缘无故的代码重复(如果不让它变得更加复杂,我就无法摆脱它)。
对此最简单的解决方案是什么?原则上我不反对使用 make 以外的其他东西,如果它可以广泛使用(autoconf ...),但我更喜欢将努力(和所需的新学习)保持在最低限度,并且从我迄今为止看到的所有其他构建系统似乎比 make 复杂得多。
【问题讨论】:
标签: dependencies makefile build-automation