【ARM 嵌入式 编译 Makefile 系列 19 - Makefile 多层依赖使用的详细介绍】

文章目录

    • Makefile 多层依赖
      • default 目标
      • prebuild 依赖
      • all 依赖
      • 示例 Makefile
    • 示例二
      • subdirs-build
      • search-all-objs
      • 子目录中的Makefile

Makefile 多层依赖

在 Makefile 中,通常定义一系列的目标(targets)来指定如何构建和管理项目。每个目标后面可以跟上它依赖的其他目标或文件,然后是一系列命令来实际执行构建动作。我们在Makefile 中可以看到类似如下代码:

default: prebuild all

default 是一个目标,而 prebuildall 是它的依赖项。下面将详细解释这个示例。

default 目标

default 是一个通常用于指定默认行为的目标名称。在许多 Makefiles 中,all 是用作默认目标的传统名称,但使用 default 也是可以的。当在命令行上直接运行 make 命令,没有指定任何目标时,make 将尝试构建 Makefile 中的第一个目标。因此,如果你想让 default 成为默认行为,它应该是 Makefile 中的第一个目标。

prebuild 依赖

prebuilddefault 目标的一个依赖项。这意味着,在开始构建 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 

在这个示例中:

  1. 如果你只输入 make 并执行,make 会首先尝试构建 default 目标。
  2. default 目标依赖于 prebuildall。make 首先执行 prebuild,然后执行 all
  3. prebuild 目标可能包含一些预备命令。
  4. all 目标依赖于 main.oother.o,make 会检查这些目标文件是否最新,如果不是,会先构建它们。
  5. 在完成 prebuild 和所有依赖目标之后,all 目标的命令被执行,通常这会链接所有对象文件生成最终的可执行文件。

记住,prebuildall 是用户定义的目标,它们的具体命令和动作将取决于你的具体需求和项目的结构。在实际的 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) $(OBJS) *.sym *

你可能感兴趣的:(#,Makefile,GCC,系列文章,arm开发)