Mbed TLS 应能在大多数系统上直接构建。部分平台特定的选项可在完全文档化的配置文件 include/mbedtls/config.h
中找到,这也是选择功能的地方。此文件可手动编辑,或使用 Perl 脚本 scripts/config.pl
以更程序化的方式进行编辑(使用 --help
获取使用说明)。
编译器选项可通过使用传统的环境变量设置,如 CC
和 CFLAGS
,在 Make 和 CMake 构建系统下(见下文)进行设置。
Mbed TLS 版本中当前使用了三个活跃的构建系统
- GNU Make
- CMake
- Microsoft Visual Studio (Microsoft Visual Studio 2010 或更高版本)
用于开发的 主要系统是 CMake 和 GNU Make。这些系统始终完整且最新。其他系统应反映 CMake 和 Make 构建系统中的所有变更,尽管某些功能可能不会自动移植到那里。
Make 和 CMake 构建系统会创建三个库:libmbedcrypto、libmbedx509 和 libmbedtls。请注意,libmbedtls 依赖于 libmbedx509 和 libmbedcrypto,而 libmbedx509 依赖于 libmbedcrypto。因此,某些连接器会期望旗帜按特定顺序排列,例如 GNU 连接器需要 -lmbedtls -lmbedx509 -lmbedcrypto
。此外,当使用 dlopen() 加载共享库时,您需要先加载 libmbedcrypto,然后是 libmbedx509,之后才能加载 libmbedtls。
我们要求使用 GNU Make。要构建库和示例程序,只要有 GNU Make 和 C 编译器就足够了。某些更高级的构建目标可能需要一些 Unix/Linux 工具。
我们有意在使用 makefile 时仅使用最少的功能,以尽可能保持它们简单且独立于不同的工具链,使用户更容易在不同平台之间移动。需要更多功能的用户建议使用 CMake。
要使用 GNU Make 从源代码编译,只需在命令行中输入
make
要运行测试,请输入
make check
测试需要 Perl 来构建和运行。如果您未安装 Perl,则可以用以下命令跳过构建测试
make no_test
您仍然可以使用
programs/test/selftest
要为 Windows 平台编译,如果目标是 Windows 但构建环境是类 Unix(例如交叉编译或从 MSYS shell 编译),则应使用 WINDOWS_BUILD=1
;如果构建环境是 Windows shell(例如使用 mingw32-make),则应使用 WINDOWS=1
(在这种情况下,某些目标将不可用)。
在您的环境中设置变量 SHARED
将构建共享库和静态库。设置 DEBUG
将提供调试构建。您可以通过在环境中设置或在 make 命令行中设置来覆盖 CFLAGS
和 LDFLAGS
;可以独立使用 WARNING_CFLAGS
覆盖编译器警告选项。某些特定目录的选项(例如,-I
指令)仍然保留。
请注意,设置 CFLAGS
将覆盖其默认值 -O2
,设置 WARNING_CFLAGS
将覆盖其默认值(以 -Wall -W
开头),所以如果您只想将一些警告选项添加到默认选项中,可以通过设置 CFLAGS=-O2 -Werror
等。当您想在默认内容中去除某些内容时(例如,因为您的编译器不接受 -Wall
作为选项),设置 WARNING_CFLAGS
是有用的。无法从命令行覆盖特定目录的选项。
根据您的平台,您可能会遇到一些问题。请检查 library/
、programs/
和 tests/
中的 Makefiles,以查看为特定平台手动添加或删除的选项。您还可以查看 Mbed TLS 知识库 中的有关您平台或问题的文章。
如果您还有其他的事情要做,请告诉我们,这样我们就可以将它添加到 Mbed TLS 知识库。
为了在使用 CMake 在单独的目录中(强烈推荐)构建源代码,请输入命令行:
mkdir /path/to/build_dir && cd /path/to/build_dir
cmake /path/to/mbedtls_source
make
要运行测试,请输入
make test
测试套件需要 Perl 来构建。如果您没有安装 Perl,您将需要禁用测试套件,如下所示:
cmake -DENABLE_TESTING=Off /path/to/mbedtls_source
如果您已禁用测试套件但保持程序开启,您仍然可以使用以下方式运行一组更小的测试:
programs/test/selftest
要为构建共享库配置 CMake,请使用:
cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On /path/to/mbedtls_source
CMake 建筑系统中提供了许多不同的构建模式。其中大多数对 gcc 和 clang 可用,尽管一些是对编译器特定的。
发布
。这会生成没有在二进制文件中包含任何不必要信息的默认代码。调试
。这会生成调试信息并禁用代码优化。覆盖
。这除了生成调试信息外,还生成了代码覆盖率信息。ASan
。这使用 AddressSanitizer 仪器代码以检查内存错误。(这包括 LeakSanitizer,在最新的 gcc 和 clang 版本中。)(在最新版本的 clang 中,此模式还会使用 UndefinedSanitizer 仪器代码以检查未定义的行为。)ASanDbg
。与 ASan 相同但速度较慢,具有调试信息和更好的堆栈跟踪。MemSan
。这使用 MemorySanitizer 仪器代码以检查未初始化的内存读取。实验性,需要 Linux/x86_64 的最新 clang。MemSanDbg
。与 MemSan 相同但速度较慢,具有调试信息、更好的堆栈跟踪和源跟踪。检查
。这激活了依赖于优化的编译器警告,并将所有警告视为错误。
在 CMake 中切换构建模式很简单。对于调试模式,在命令行中输入:
cmake -D CMAKE_BUILD_TYPE=Debug /path/to/mbedtls_source
要列出其他 CMake 选项,请使用:
cmake -LH
注意,使用 CMake 后,您无法调整编译器或其标志的初始调用之后。这意味着 CC=your_cc make
和 make CC=your_cc
将 不会 工作(与 CFLAGS
和其他变量类似)。这些变量需要在首次调用 cmake 时进行调整,例如
CC=your_cc cmake /path/to/mbedtls_source
如果您已调用 cmake 并且想更改这些设置,您需要删除构建目录并重新创建它。
请注意,可以就地构建;但是,这将覆盖提供的 Makefiles(如果您想防止 git status
将它们显示为已修改,请参阅 scripts/tmp_ignore_makefiles.sh
)。为此,从 Mbed TLS 源目录中,使用以下命令:
cmake .
make
如果您之后要更改 CC
或 CFLAGS
,您将需要删除 CMake 缓存。这可以使用以下命令完成,使用 GNU find:
find . -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} +
现在您可以做出所需更改
CC=your_cc cmake .
make
关于变量,还需注意,当调用cmake时设置CFLAGS,您的CFLAGS值并不会覆盖cmake提供的所有内容(如上所示,取决于构建模式),它只是附加到其后。
Microsoft Visual Studio的构建文件是为Visual Studio 2010生成的。
解决方案文件mbedTLS.sln
包含了构建库和所有程序所需的所有基本项目。测试目录中的文件不会生成和编译,因为这些需要Perl环境。然而,在programs/test/
中的自测程序仍然可用。
我们在programs/
目录中包含了大量不同功能和应用的示例程序。[查看更多](https://tls.mbed.org/kb/development/mbedtls-coding-standards)。大多数程序只关注单一的功能或使用场景,所以当复制代码的一部分时请留意这一点。
Mbed TLS在tests/
中包含了一个复杂的测试套件,最初需要Perl生成测试文件(例如test\_suite\_mpi.c
)。这些文件是从一个功能文件
(例如suites/test\_suite\_mpi.function
)和一个数据文件
(例如suites/test\_suite\_mpi.data
)生成的。功能文件包含测试函数,而数据文件则包含测试案例,这些测试案例将作为参数传递给测试函数。
对于安装了Unix shell和OpenSSL(以及可选的GnuTLS)的计算机,还有额外的测试脚本可用。
tests/ssl-opt.sh
运行了针对各种TLS选项(重协商、恢复等)的集成测试,并测试了这些选项与其他实现之间的互操作性。tests/compat.sh
测试了所有加密套件与其他实现之间的互操作性。tests/scripts/test-ref-configs.pl
测试了各种简化的配置构建。tests/scripts/key-exchanges.pl
测试了仅启用单个密钥交换的配置构建。tests/scripts/all.sh
运行了上述测试的组合,以及更多测试,使用各种构建选项(例如ASan、完整的config.h
等)。
我们在configs/
目录中提供了一些非标准配置,这些配置针对特定的用例。您可以在configs/README.txt
中了解更多信息。
Mbed TLS可以被移植到许多不同的架构、操作系统和平台。在开始移植之前,您可能会发现以下知识库文章非常有用:
我们感谢社区提供的错误报告和贡献。为了能够整合贡献,我们有一些要求需要满足。
- 所有贡献,无论大小,都需要接受一份贡献者许可协议(CLA)。这是因为源代码可能会受到版权法的保护,我们需要您的同意来分享版权所有权。
- 我们希望贡献能够符合我们的编码规范,并在提交之前进行充分测试。
- 与任何开源项目一样,贡献将由项目团队和社区进行审查,可能需要一些修改才能被接受。
要接受贡献者许可协议(CLA),个人贡献者可以通过创建一个Mbed账户,在此处点击接受在线协议来完成操作。对于来自公司或不愿创建Mbed账户的贡献,可以找到一份不同的协议此处。此协议应签字并按照指示返回给Arm。
- 检查未解决的问题或开始关于一个功能想法或错误的讨论。
- 从GitHub上分叉Mbed TLS仓库开始您的修改。一般来说,您应该以“开发”分支为基础。
- 编写一个测试用例来展示错误已被修复或功能按预期工作。
- 提交一个pull请求并不断催促,直到它被合并并发布。贡献可能需要进行一些修改,所以请与我们合作以便您的修改被接受。我们会把您的名字列入ChangeLog :)