SAP HANA 是为许多 SAP 产品提供支持的内部数据库。它是用 C++ 编写的,并带有 Python 测试,整个代码库位于单个 git 存储库中。来自世界各地的数百名开发人员正在开发约 1000 万行 C++ 代码和 1500 万行 Python 测试。
由于 HANA 专门部署在 Linux 上,因此许多开发人员也在他们的工作站上使用 Linux。到 2019 年为止,Windows 仍被支持作为开发环境,但 2019 年之后,Linux 成为唯一的选择。
编译 HANA 并不是一件容易的事。在本地机器上从头开始构建它预计需要大约 2 小时(如下所示),大约一半的 HANA 开发人员选择将工作站移至数据中心并远程访问,而不是在本地工作。
使用编译集群,构建时间减少到 16 分钟,而现在链接只需要一半的时间。现在我们仍在使用 gold 链接器,但在错误修复后 lld 应该会显着减少链接时间。
对于 HANA 开发,我们目前使用 C++14。唯一不寻常的事情是我们不使用 STL,而是有我们自己的实现 LTT,它强制使用分配器。
我们的构建系统围绕 cmake,因此使用起来相当合理。将 cpp 文件添加到 CMakeLists.txt 后,我们可以在本地运行单元测试并验证到目前为止没有任何问题。
更多细节可以查看这篇博客。
另外关于 cmake 的介绍:
在深入探讨 CMake 的世界之前,我们需要明确一个事实:CMake 并不是一个构建系统,而是一个构建系统的生成器。它为多种平台和 IDE 编写统一的构建脚本,通过这些脚本生成特定于平台的构建文件。这意味着,无论您是在 Windows 上使用 Visual Studio,还是在 Linux 或 macOS 上使用 Make 或者其他构建工具,CMake 都能够帮助您简化构建过程。
CMake 通过使用名为 CMakeLists.txt
的文件来指导构建过程。在这个文件中,开发者可以指定项目的源文件、目标(可执行文件或库)、依赖关系以及其他构建参数。CMake 的设计哲学致力于支持跨平台构建,使得开发者能够使用相同的构建脚本在不同的系统上编译项目。
为了更好地理解 CMake 的强大功能,让我们通过一个简单的例子来展示如何使用 CMake 来构建一个简单的 C 语言项目。假设我们有一个项目,项目结构如下:
MyProject/
├── CMakeLists.txt
├── include/
│ └── mylib.h
└── src/
├── main.c
└── mylib.c
在这个项目中,main.c
是主程序文件,mylib.c
和 mylib.h
分别是一个简单的库的实现文件和头文件。我们希望构建一个可执行文件 myapp
。
CMakeLists.txt 的内容
要使用 CMake 构建这个项目,我们首先需要在 CMakeLists.txt
文件中定义构建规则:
cmake_minimum_required(VERSION 3.10) # 指定 CMake 的最低版本要求
project(MyProject VERSION 1.0) # 定义项目名称和版本
# 指定 C 语言标准
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED True)
# 添加 include 目录
include_directories(include)
# 定义要构建的可执行文件和相关的源文件
add_executable(myapp src/main.c src/mylib.c)
这段 CMakeLists.txt
做了几件事情:
- 指定了项目所需的最低 CMake 版本。
- 定义了项目的名称和版本号。
- 设置了 C 语言的标准版本。
- 将
include
目录添加到了包含路径中,这样编译器就可以找到我们的头文件了。 - 最后,定义了一个目标可执行文件
myapp
,并指定了它依赖的源文件。
构建项目
有了 CMakeLists.txt
文件后,我们可以使用 CMake 来生成构建文件,并构建我们的项目了。在命令行中,我们首先需要创建一个用于存放构建输出的目录(通常称为 build
目录),然后切换到这个目录中,使用 CMake 生成构建系统,最后编译项目:
mkdir build && cd build
cmake ..
make
这里,cmake ..
命令告诉 CMake 读取上级目录中的 CMakeLists.txt
文件,并基于这个文件生成 Makefile(如果您在使用 Windows 并选择了 Visual Studio 作为构建工具,这个命令将生成一个 .sln
解决方案文件)。make
命令则开始编译过程,最终生成 myapp
可执行文件。
CMake 的强大之处不仅仅在于它能够自动处理不同平台的构建系统差异,还在于它提供了丰富的命令和模块来支持复杂项目的构建。例如,通过使用 find_package
命令,CMake 可以定位并使用系统上已安装的库,而 target_link_libraries
命令可以用来指定构建目标需要链接的库。这些功能使得 CMake 成为一个非常强大且灵活的构建系统生成器,被广泛应用于各种大小的项目中。
在实际的项目开发中,CMake 的使用远远不止这些。高级特性,如导入和导出目标、生成导出配置文件、编写安装脚本等,都是 CMake 支持的功能,这些功能使得 CMake 不仅能够管理项目的构建过程,还能够帮助开发者打包和分发软件。通过学习和使用 CMake,开发者可以大大简化跨平台项目的构建和维护工作,提高软件开发的效率和质量。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。