JNH官网

【ARM】Ubuntu系统下如何自动生成工程各目录下的Makefile文件

一、文档背景

在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 文件可以简化项目的构建过程,大大提高了项目的开发效率。

jnh官网 jnh官网 jnh官网 jnh官网 金年会 金年会 金年会 金年会