构建 NSS

简介

此页面详细介绍了如何构建 NSS。由于 NSS 是一个跨平台库,它可以在许多不同的平台上构建,并且具有许多选项,因此构建过程可能很复杂。_ 同时维护了两个构建系统:基于 Make 的系统和基于 gyp 的系统。

先决条件

NSS 需要 C 和 C++ 编译器。它具有最少的依赖项,仅包括标准 C 和 C++ 库,以及 zlib。 构建时,还需要 make。理想情况下,还要安装 gyp-nextninja 并将其放在您的路径中。 建议这样做,因为构建速度更快且更可靠。请注意,我们目前 gyp 未维护,并且我们对 gyp-next 的支持处于实验阶段,可能不稳定。

要在不同的平台上安装先决条件,可以使用以下命令

在 Linux 上

sudo apt install mercurial git ninja-build python3-pip
python3 -m pip install gyp-next

在 MacOS 上

brew install mercurial git ninja python3-pip
python3 -m pip install gyp-next

还需要确保路径中存在 python(不仅仅是 python3)可执行文件。Homebrew Python 安装具有必要的符号链接,但可能需要显式添加到 PATH 变量中,例如

export PATH="/opt/homebrew/opt/python/libexec/bin:$PATH"

在 Windows 上

<TODO>

注意

要从项目存储库中检索源代码,用户需要下载发布版本或使用他们喜欢的版本控制系统(git 或 Mercurial)提取源代码。当以压缩存档的形式下载时,构建 NSS 发布版本不需要安装 VCS。

默认情况下,Mozilla 对 NSS 使用 Mercurial 存储库。如果您希望为 NSS 贡献代码并使用 git 而不是 Mercurial,我们建议您安装 git-cinnabar

源代码

NSS 和 NSPR 与其他 Mozilla 项目一样,使用 Mercurial 进行源代码控制。要检出 NSS 和 NSPR 的最新源代码(可能不是稳定版本的一部分),请使用以下命令

hg clone https://hg.mozilla.org/projects/nspr
hg clone https://hg.mozilla.org/projects/nss

**要获取特定版本的源代码,请参阅:** ref:mozilla_projects_nss_releases

要使用 git-cinnabar 下载源代码

git clone hg::https://hg.mozilla.org/projects/nspr
git clone hg::https://hg.mozilla.org/projects/nss

使用 gyp 和 ninja 构建

使用 nss 目录中的构建脚本构建 NSS 和 NSPR

cd nss
./build.sh

这将在名为 dist 的父目录中构建 NSPR 和 NSS。

此脚本提供了构建选项:-o 将以 **发布** 模式而不是 **调试** 模式构建,而 -c 将在构建之前 **清理** dist 目录。

可以通过运行 ./build.sh --help 显示其他构建选项。

使用 make 构建

或者,可以使用 make 目标,它会产生类似的结果。这支持一些备选选项,但速度可能会慢得多。

USE_64=1 make -j

NSS 的基于 make 的构建系统使用各种变量来控制构建。以下是一些变量,以及它们可能设置为的值。

BUILD_OPT

0

构建 NSS 的调试(非优化)版本。**这是默认值。**

1

构建 NSS 的优化(非调试)版本。

USE_64

0

为 32 位环境/ABI 构建。**这是默认值。**

1

为 64 位环境/ABI 构建。建议使用此选项。

USE_ASAN

0

不创建 AddressSanitizer 构建。**这是默认值。**

1

创建 AddressSanitizer 构建。

单元测试

NSS 包含广泛的单元测试。运行这些测试的脚本位于 tests 目录中。通过以下方式运行标准套件

HOST=localhost DOMSUF=localdomain USE_64=1 ./tests/all.sh

单元测试配置

NSS 测试使用环境变量进行配置。脚本将尝试推断 HOSTDOMSUF 的值,但可能会失败。将 localhostlocaldomain 替换为主机的主机名和域名后缀。您需要能够连接到 $HOST.$DOMSUF

如果您没有域名后缀,可以向 /etc/hosts(在 Windows 上为 c:\Windows\System32\drivers\etc\hosts)添加如下条目

127.0.0.1 localhost.localdomain

通过打开命令行并键入以下命令验证此操作:ping localhost.localdomain

如果使用 32 位构建,请删除 USE_64=1 覆盖。

测试结果

运行所有测试可能需要相当长的时间。

测试输出存储在 tests_results/security/$HOST.$NUMBER/ 中。文件 results.html 总结了结果,output.log 捕获了所有测试输出。

nss/tests 的其他子目录包含运行完整套件子集的脚本。可以直接运行这些脚本而不是 all.sh,这可能会节省一些时间,但会降低覆盖率。