ALL_BUILD、ZERO_CHECK等详解

一般由CMAKE构建的解决方案(Solution)中包含三工程(Project),分别是ALL_BUILD、ZERO_CHECK、INSTALL

ALL_BUILD只要编译这个工程,所有的工程均会编译;

ZERO_CHECK监视CMakeLists.txt文件的变化,一旦发生变化,它会告诉编译器重新构建整个工程环境。

INSTALL:将工程编译后生成的dll和exe等安装到指定目录中,具体安装位置和安装内容详见该工程的Build Event->Post-Build Event->Command Line。

学习CMake的文档:

http://blog.youkuaiyun.com/Bowater/article/details/2456732

 

<think>我们正在分析Makefile中的目标(targets)及其依赖关系。用户提供的Makefile片段是通过`grep`命令提取的目标行。我们将解析这些目标行,理解每个目标及其依赖关系,并构建一个依赖关系图。 提供的Makefile目标行: ``` default_target: all cmake_force: edit_cache: rebuild_cache: all: cmake_check_build_system clean: preinstall: all depend: so_test: cmake_check_build_system IsaEngine: cmake_check_build_system help: cmake_check_build_system: ``` 步骤: 1. 解析每个目标行,提取目标名和依赖项(冒号后面的部分)。 2. 注意:有些目标没有依赖项(冒号后面为空),例如`clean`,`help`等。 3. 构建目标依赖关系图。 根据以上内容,我们可以得到以下依赖关系: - default_target 依赖于 all - all 依赖于 cmake_check_build_system - preinstall 依赖于 all - so_test 依赖于 cmake_check_build_system - IsaEngine 依赖于 cmake_check_build_system 注意:没有依赖的目标(如`clean`, `help`等)是独立的目标。 另外,我们注意到`cmake_check_build_system`是多个目标的依赖项,但它的定义没有写依赖(即没有冒号后面的内容),所以它是一个没有依赖的目标(或者说依赖为空)。 因此,我们可以构建一个依赖关系图(有向图): ``` default_target -> all all -> cmake_check_build_system preinstall -> all -> cmake_check_build_system so_test -> cmake_check_build_system IsaEngine -> cmake_check_build_system ``` 独立目标:cmake_force, edit_cache, rebuild_cache, clean, depend, help, cmake_check_build_system(虽然它是其他目标的依赖,但它本身没有依赖) 注意:在Makefile中,一个目标可以多次出现,但通常我们会合并它们的依赖(或者以最后一次出现的为准)。但在这个片段中,每个目标只出现一次。 现在,我们可以用文字描述每个目标的直接依赖: - default_target: 依赖 all - cmake_force: 无依赖 - edit_cache: 无依赖 - rebuild_cache: 无依赖 - all: 依赖 cmake_check_build_system - clean: 无依赖 - preinstall: 依赖 all - depend: 无依赖 - so_test: 依赖 cmake_check_build_system - IsaEngine: 依赖 cmake_check_build_system - help: 无依赖 - cmake_check_build_system: 无依赖 另外,由于`all`是`preinstall`和`default_target`的依赖,而`all`又依赖于`cmake_check_build_system`,因此`default_target`和`preinstall`间接依赖于`cmake_check_build_system`。 我们可以通过一个表格来展示: | 目标 (Target) | 直接依赖 (Direct Dependencies) | |------------------------|--------------------------------| | default_target | all | | cmake_force | (无) | | edit_cache | (无) | | rebuild_cache | (无) | | all | cmake_check_build_system | | clean | (无) | | preinstall | all | | depend | (无) | | so_test | cmake_check_build_system | | IsaEngine | cmake_check_build_system | | help | (无) | | cmake_check_build_system | (无) | 注意:在Makefile中,一个目标可能还有命令(recipe),即目标下面的以Tab开头的命令。但这里我们没有提取命令,所以只分析依赖关系。 此外,我们还可以分析依赖链(例如从default_target开始的依赖链): default_target -> all -> cmake_check_build_system 同样,preinstall的依赖链: preinstall -> all -> cmake_check_build_system 而so_test和IsaEngine则直接依赖于cmake_check_build_system。 最后,我们可以推断: - 当执行`make default_target`时,会依次构建`cmake_check_build_system`,然后`all`,最后`default_target`。 - 执行`make all`会构建`cmake_check_build_system`然后执行`all`的命令(如果有的话)。 - 执行`make preinstall`会先构建`all`(进而构建`cmake_check_build_system`),然后执行`preinstall`的命令。 但是,由于我们只看到了目标行,没有看到具体的命令,所以无法知道每个目标具体做什么。 为了更深入分析,我们可以建议用户查看每个目标下面的命令(如果有的话),或者使用`make -n <target>`来查看具体执行的命令序列。 生成相关问题: 1. 如何查看Makefile中每个目标的具体命令? 2. 如何理解cmake生成的Makefile中的cmake_check_build_system目标? 3. 在Makefile中,default_target有什么特殊含义? 4. 如何强制重新构建某个目标(例如cmake_force)? 5. 如何添加一个新的目标到Makefile中? 注意:由于用户提供的Makefile片段是通过CMake生成的,因此这些目标的行为是由CMake脚本决定的。</think>### 解析 Makefile 中的目标及其依赖关系 #### 一、目标依赖关系解析(基于提供的 Makefile 片段) 通过分析 `grep` 输出,可构建以下依赖关系图: ```mermaid graph TD A[default_target] --> B[all] B[all] --> K[cmake_check_build_system] C[preinstall] --> B[all] D[so_test] --> K[cmake_check_build_system] E[IsaEngine] --> K[cmake_check_build_system] F[cmake_force] --> 独立目标 G[edit_cache] --> 独立目标 H[rebuild_cache] --> 独立目标 I[clean] --> 独立目标 J[depend] --> 独立目标 L[help] --> 独立目标 ``` #### 二、关键目标解析 1. **核心构建目标** - `all`:主构建目标,依赖 `cmake_check_build_system` ```makefile all: cmake_check_build_system # 必须先完成系统检查 ``` - `default_target`:默认入口点,指向 `all` ```makefile default_target: all # 用户直接运行make时触发 ``` 2. **项目特定目标** - `IsaEngine`:可执行文件目标 ```makefile IsaEngine: cmake_check_build_system # 依赖构建系统验证 ``` - `so_test`:共享库测试目标 ```makefile so_test: cmake_check_build_system # 同样需要系统检查 ``` 3. **系统维护目标** - `cmake_check_build_system`:核心验证目标 ```makefile cmake_check_build_system: # 无显式依赖,但被多个目标引用 ``` - `clean`:清理构建产物 ```makefile clean: # 独立操作,无依赖 ``` 4. **辅助目标** ```makefile edit_cache: # 编辑CMake缓存 rebuild_cache: # 重建CMake缓存 depend: # 处理头文件依赖 help: # 显示帮助信息 ``` #### 三、依赖关系特征分析 1. **依赖集中化** `cmake_check_build_system` 被 4 个目标依赖(`all`, `so_test`, `IsaEngine`),形成**星型依赖结构**,这是 CMake 生成 Makefile 的典型模式[^1]。 2. **构建阶段分离** $$ \text{配置检查} \rightarrow \text{主构建} \rightarrow \text{安装} $$ - 配置检查:`cmake_check_build_system` - 主构建:`all` - 安装:`preinstall`(依赖 `all`) 3. **并行构建潜力** 独立目标(如 `clean`, `help`)可随时执行,不依赖构建链: ```bash make clean # 随时可执行 make help # 不依赖构建状态 ``` #### 四、典型工作流示例 ```mermaid sequenceDiagram participant 用户 participant Makefile participant CMake 用户->>Makefile: make Makefile->>default_target: 触发 default_target->>all: 执行依赖 all->>cmake_check_build_system: 调用 cmake_check_build_system->>CMake: 验证构建系统 CMake-->>cmake_check_build_system: 返回状态 alt 验证成功 cmake_check_build_system->>all: 继续构建 else 验证失败 cmake_check_build_system->>用户: 报错终止 end ``` #### 五、深度解析建议 1. **查看完整规则** 使用 `make -n` 空运行查看实际命令序列: ```bash make -n all # 显示all目标的实际执行命令 ``` 2. **分析隐式依赖** CMake 常添加隐藏依赖,查看生成文件: ```bash grep .depend Makefile # 查找自动生成的依赖 ``` 3. **可视化依赖图** 安装 Graphviz 生成依赖图: ```bash sudo apt install graphviz make -Bnd | grep -v Considering | dot -Tpng > deps.png ``` --- ### 相关问题 1. CMake 生成的 Makefile 中 `cmake_check_build_system` 的具体作用是什么? 2. 如何向 CMake 生成的 Makefile 添加自定义目标? 3. 在复杂项目中如何优化 Makefile 的依赖检查性能? 4. Makefile 中的 `.PHONY` 目标在此类构建系统中起什么作用? 5. 当 `cmake_check_build_system` 失败时如何进行故障诊断? [^1]: 在 CMake 中,依赖关系管理是通过一系列的命令和配置来实现的。find_package 和 target_link_libraries 是其中的关键命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值