文章目录
Makefile 多层依赖
在 Makefile 中,通常定义一系列的目标(targets)来指定如何构建和管理项目。每个目标后面可以跟上它依赖的其他目标或文件,然后是一系列命令来实际执行构建动作。我们在Makefile 中可以看到类似如下代码:
default: prebuild all
default
是一个目标,而 prebuild
和 all
是它的依赖项。下面将详细解释这个示例。
default 目标
default
是一个通常用于指定默认行为的目标名称。在许多 Makefiles 中,all
是用作默认目标的传统名称,但使用 default
也是可以的。当在命令行上直接运行 make
命令,没有指定任何目标时,make 将尝试构建 Makefile 中的第一个目标。因此,如果你想让 default
成为默认行为,它应该是 Makefile 中的第一个目标。
prebuild 依赖
prebuild
是 default
目标的一个依赖项。这意味着,在开始构建 default
目标之前,make 将先尝试构建 prebuild
目标。通常,prebuild
会执行一些预处理步骤,比如生成必需的配置文件、检查依赖性、清理上一次的构建产物、或者执行其他任何为主要构建阶段准备的任务。
all 依赖
all
同样是 default
目标的一个依赖项,并且通常是用来构建项目中所有最终目标(比如可执行文件和库文件)的目标。在执行 all
目标的规则时,通常会调用编译器和链接器命令来构建整个项目或者是项目的主要部分。
示例 Makefile
default: prebuild all
prebuild:
@echo "Running pre-build steps..."
# 在这里执行任何必要的预处理命令
all: main.o other.o
gcc -o myprogram main.o other.o
@echo "Build complete!"
main.o: main.c
gcc -c main.c
other.o: other.c
gcc -c other.c
在这个示例中:
- 如果你只输入
make
并执行,make 会首先尝试构建default
目标。 default
目标依赖于prebuild
和all
。make 首先执行prebuild
,然后执行all
。prebuild
目标可能包含一些预备命令。all
目标依赖于main.o
和other.o
,make 会检查这些目标文件是否最新,如果不是,会先构建它们。- 在完成
prebuild
和所有依赖目标之后,all
目标的命令被执行,通常这会链接所有对象文件生成最终的可执行文件。
记住,prebuild
和 all
是用户定义的目标,它们的具体命令和动作将取决于你的具体需求和项目的结构。在实际的 Makefile 中,它们可以是任何你需要的预处理和构建步骤。
示例 Makefile:
all: subdirs-build
find . -name '*.o' -exec cp {} objs/ \;
.PHONY: all subdirs-build
在这个示例中,find
命令用于在当前目录及其所有子目录中查找扩展名为 .o
的文件,并使用 -exec
动作将找到的文件复制到 objs/
目录中。
示例二
我们再看个比较复杂一点的例子:
DIRS := device driver
OBJS :=
TOTAL_OBJS :=
FILES_CLEAN := $(TARGET