一、文档背景
在Linux系统下开发一个较大型的项目时,涉及到许多目录与文件,如果每个目录下的Makefile都手动去编写,效率会非常低,同时,也容易出错。
自动生成 Makefile 文件可以简化项目的构建过程,提高开发效率,并增加项目的可维护性。
二、 解决的问题或者进行问题分析
Makefile 文件的自动生成通常是通过使用构建工具或生成工具来实现的。有几个工具可以帮助自动生成 Makefile 文件,其中一些常见的包括:
● CMake: CMake 是一个跨平台的构建系统生成工具,它可以自动生成针对不同构建系统(包括 Makefile)的配置文件。通过编写 CMakeLists.txt 文件,你可以使用 CMake 生成相应的 Makefile,并用于构建你的项目。
● Autotools: Autotools 是一套用于自动化软件构建、配置和安装的工具集。它包括 Autoconf、Automake 和 Libtool。Autoconf 可以根据 configure.ac 文件生成 configure 脚本,而 Automake 可以根据 Makefile.am 文件生成 Makefile。
● qmake: qmake 是 Qt 库附带的一个构建系统生成工具。通过编写 .pro 文件,你可以使用 qmake 自动生成适用于不同平台的 Makefile 文件。
● GNU Automake: GNU Automake 是 Autoconf 的一部分,它用于生成 Makefile.in 文件,从而使 Autoconf 自动生成最终的 Makefile。
本文将通过CMake工具来实现Makefile文件的自动生成。
三、 如何应用CMake来自动生成Makefile文件
实例工程的目录与文件情况如图3-1所示:

图3-1
1. 在“math”目录下,创建一个CMakeLists.txt文件,内容如图3-2所示:

图3-2
2. 在“mathlib”目录下,创建一个CMakeLists.txt文件,内容如图3-3所示:

图3-3
3. 在“Add”目录下,创建一个CMakeLists.txt文件,内容如图3-4所示:

图3-4
4. 在“Sub、Mul、Div”目录下,参照“Add”目录的CMakeLists.txt文件创建类似的CMakeLists.txt文件。
5. 在“math”目录下,运行“cmake -S . -B build”,开始生成Makefile文件,如图3-5所示:

图3-5
6. 进入“build”目录下,可以看到Makefile文件已生成,同时也创建工程的目录镜象,相应的目录下都生成了Makefile文件,如图3-6所示:

图3-6
四、验证自动生成的Makefile的正确性
进入在“build”目录下,运行make,并运行执行文件:main,如图4-1所示:

图4-1
五、讨论分析
1. CMakeLists.txt的基本结构是什么?
# Set the minimum required version of CMake
cmake_minimum_required(VERSION 3.10)
# Define the project name
project(MyProject)
# Add build rules for an executable or library
add_executable(my_executable main.cpp)
# Set the source file directory
add_subdirectory(src)
# Set the library file directory
add_subdirectory(lib)
# Add linking libraries
target_link_libraries(my_executable my_library)
# Add include directories
target_include_directories(my_executable PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
上述代码包含了以下主要元素:
● cmake_minimum_required: 设置 CMake 的最低版本要求。
● project: 定义项目名称。
● add_executable 或 add_library: 添加可执行文件或库的构建规则。
● add_subdirectory: 设置源文件目录或子项目的构建规则。
● target_link_libraries: 添加链接库的规则。
● target_include_directories: 添加包含目录的规则。
2. cmake,Bazel及buck等构建工具的差异?
CMake:
特点:
● 语言支持: CMake 是一种构建工具和构建系统生成工具,支持多种编程语言,包括 C++、C、Java、Python 等。
● 平台支持: CMake 是跨平台的,可以生成针对不同平台(Windows、Linux、macOS 等)的构建系统。
● 生成器: CMake 支持生成多种构建系统,如 Makefile、Ninja、Visual Studio 等。
● 易学易用: CMake 的语法相对简单,易于学习和使用。
● 社区支持: 有广泛的社区支持和文档资源。
Bazel:(google)
特点:
● 多语言支持: Bazel 支持多种编程语言,包括 C++, Java, Python, Go, JavaScript。
● 高度可重现: 通过准确的依赖分析和缓存机制,Bazel 确保构建是可重现的,即使在分布式环境中也能保持一致。
● 多平台支持: 能够构建适用于多个平台的软件,包括 Linux、macOS、Windows 等。
● 分布式构建: 支持将构建任务分发到多台计算机上,以加速构建过程。
● 增量构建: 只重新构建发生变化的部分,提高构建效率。
● 支持多仓库: 能够处理大规模代码库,支持多仓库构建。
Buck:
特点:
● Android/iOS 构建: Buck 最初是为 Facebook 的 Android 和 iOS 项目开发的,因此在处理移动应用构建方面非常强大。
● 增量构建: 与 Bazel 一样,Buck 也支持增量构建,只重新构建发生变化的部分。
● 可配置性: 提供灵活的配置选项,允许开发者根据项目需求进行定制。
● 并行构建: 能够并行构建项目,提高构建效率。
● 缓存机制: 使用缓存来存储中间和最终构建产物,以减少不必要的重新构建。
共同点:
● 都支持分布式构建,可以将构建任务分发到多个机器上。
● 都注重构建速度和可重现性。
● 都采用声明式的构建规则,使用 BUILD 文件来描述构建过程。
六、结论
应用CMake工具自动生成 Makefile 文件可以简化项目的构建过程,大大提高了项目的开发效率。