Makefile 结构分析
### Makefile 结构分析 #### 一、源代码文件及目录构成 在深入解析 `Makefile` 的结构之前,我们先来了解一个具体的例子:基于 uClinux (2.6.x 内核) 的系统映像构建过程。这将帮助我们更好地理解 `Makefile` 在实际项目中的应用。 解压 `uClinux-dist-20070130.tar.gz` 压缩包后,可以看到目录结构如下: - **config**:包含系统配置相关的文件和子目录。 - `config.in` - `configure.help` - `Fixconfig` - `Makefile` - `Mkconfig` - `Setconfig` - `Scripts` - **Bin**:二进制文件目录。 - **linux-2.4.x**:内核 2.4.x 相关目录。 - **linux-2.6.x**:内核 2.6.x 相关目录,这是我们的主要关注点。 - `arch`:架构相关的文件。 - `include`:头文件目录。 - `init`:初始化脚本和配置。 - `drivers`:驱动程序目录。 - `fs`:文件系统相关代码。 - `ipc`:进程间通信。 - `kernel`:内核基础模块。 - `lib`:库文件目录。 - `mm`:内存管理。 - `scripts`:脚本文件。 - **关键文件**: - `Makefile`:控制文件,用于构建内核。 - `rules.make`:构建规则。 - **编译后生成文件**: - `romfs.o` - `linux` - `system.map` - **lib**:提供改进的函数库支持。 - **tools**:工具目录。 - **Include**:包含文件。 - **user**:用户级驱动程序文件。 - **vendors**:特定硬件平台相关目录。 此外,还存在以下文件和目录: - **Makefile**:根目录下的 `Makefile` 文件。 - **images**:编译后生成的映像文件目录。 - **romfs**:只读文件系统的映像。 - **autoconfig.h** - **config.in** - **.config**:配置文件。 - **.depend** #### 二、编译过程简介 编译过程主要包括以下几个步骤: 1. **准备环境**:将 `uClinux-dist-20070130.tar.gz` 放入 `/usr` 目录中。 2. **解压源码**:使用命令 `tar –zxvf uClinux-dist-20070130.tar.gz` 解压文件。 3. **进入源码目录**:使用 `cd uClinux-dist` 进入解压后的目录。 4. **清理编译环境**:执行 `make clean` 清除之前的编译产物。 5. **配置内核**:运行 `make config` 来配置内核。 6. **构建依赖关系**:通过 `make dep` 构建依赖关系。 7. **编译内核**:最终执行 `make` 命令完成内核的编译。 完成以上步骤后,终端会提示在 `/image` 目录下成功生成映像文件。 #### 三、核心 Make 文件运行分析 ##### 3.1 `make clean` 执行情况分析 **3.1.1 uClinux-dist/Makefile 中的 clean 命令** 在根目录 `Makefile` 中,`clean` 命令的相关实现如下: ```makefile LINUXDIR = $(CONFIG_LINUXDIR) modules_clean: [ ! -d modules ] || $(MAKE) ARCH=$(ARCH) -C $(LINUXDIR)/modules clean ``` 这里首先调用了 `modulesclean` 命令,如果 `modules` 目录存在,则进入该目录并执行 `clean` 命令。接着,继续执行删除 `/linux-2.6.x/` 目录下的编译产物,如 `linux`, `asm`, `perlasm` 等文件。 **3.1.2 uClinux-dist/linux-2.6.x/Makefile 中的 clean 命令** 在 `/linux-2.6.x/Makefile` 文件中,`make clean` 命令的相关实现如下: ```makefile clean: rm -rf $(obj) $(subdir_arch) $(subdir_arch_objs) $(subdir_arch_dep) $(subdir_arch_mod) $(subdir_arch_hdr) $(subdir_arch_sym) $(subdir_arch_ver) $(subdir_arch_lic) $(subdir_arch_cpy) $(subdir_arch_cfg) $(subdir_arch_mak) $(subdir_arch_scr) $(subdir_arch_src) $(subdir_arch_doc) $(subdir_arch_obj) $(subdir_arch_mods) $(subdir_arch_lib) $(subdir_arch_inc) $(subdir_arch_elf) $(subdir_arch_exe) $(subdir_arch_asm) $(subdir_arch_perlasm) $(subdir_arch_perlasm_hdr) $(subdir_arch_perlasm_obj) $(subdir_arch_perlasm_mod) $(subdir_arch_perlasm_src) $(subdir_arch_perlasm_inc) $(subdir_arch_perlasm_elf) $(subdir_arch_perlasm_exe) $(subdir_arch_perlasm_sym) $(subdir_arch_perlasm_ver) $(subdir_arch_perlasm_lic) $(subdir_arch_perlasm_cpy) $(subdir_arch_perlasm_cfg) $(subdir_arch_perlasm_mak) $(subdir_arch_perlasm_scr) $(subdir_arch_perlasm_doc) ``` 这段代码的作用是删除与编译相关的绝大多数临时文件和编译产物,确保下一次编译能够从干净的状态开始。这样做的目的是避免因为旧的编译产物导致新的编译出现问题。 通过以上分析可以看出,`Makefile` 在 uClinux 系统映像构建过程中起到了核心的控制作用。它不仅定义了编译流程,还负责管理源文件、目标文件以及中间产物的生成和清理工作,确保构建过程高效且可靠地进行。
- 粉丝: 0
- 资源: 20
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助