(mozilla-projects-nss-building-ported)= # Building NSS ## [Introduction](#introduction) :::{container} This page has detailed information on how to build NSS. Because NSS is a cross-platform library that builds on many different platforms and has many options, it may be complex to build. Please read these instructions carefully before attempting to build. ::: ## [Build environment](#build_environment) :::{container} NSS needs a C and C++ compiler. It has minimal dependencies, including only standard C and C++ libraries, plus [zlib](https://www.zlib.net/). For building, you also need [make](https://www.gnu.org/software/make/). Ideally, also install [gyp](https://gyp.gsrc.io/) and [ninja](https://ninja-build.org/) and put them on your path. This is recommended, as the build is faster and more reliable. ::: ### [Windows](#windows) :::{container} NSS compilation on Windows uses the same shared build system as Mozilla Firefox. You must first install the [Windows Prerequisites](https://firefox-source-docs.mozilla.org/setup/windows_build.html), including **MozillaBuild**. You can also build NSS on the Windows Subsystem for Linux, but the resulting binaries aren't usable by other Windows applications. ::: ## [Get the source](#get_the_source) :::{container} NSS and NSPR use Mercurial for source control like other Mozilla projects. To check out the latest sources for NSS and NSPR--which may not be part of a stable release--use the following commands: ```{code} git clone https://github.com/mozilla/nspr hg clone https://hg.mozilla.org/projects/nss ``` To get the source of a specific release, see {ref}`mozilla_projects_nss_nss_releases`. ::: ## [Build](#build) :::{container} Build NSS using our build script: ```{code} nss/build.sh ``` This builds both NSPR and NSS. ::: ## [Build with make](#build_with_make) :::{container} Alternatively, there is a `make` target called "nss_build_all", which produces a similar result. This supports some alternative options, but can be a lot slower. ```{code} make -C nss nss_build_all USE_64=1 ``` The make-based build system for NSS uses a variety of variables to control the build. Below are some of the variables, along with possible values they may be set to. BUILD_OPT : 0 : Build a debug (non-optimized) version of NSS. *This is the default.* 1 : Build an optimized (non-debug) version of NSS. USE_64 : 0 : Build for a 32-bit environment/ABI. *This is the default.* 1 : Build for a 64-bit environment/ABI. *This is recommended.* USE_ASAN : 0 : Do not create an [AddressSanitizer](http://clang.llvm.org/docs/AddressSanitizer.html) build. *This is the default.* 1 : Create an AddressSanitizer build. ::: ## [Unit testing](#unit_testing) :::{container} NSS contains extensive unit tests. Scripts to run these are found in the `tests` directory. Run the standard suite by: ```{code} HOST=localhost DOMSUF=localdomain USE_64=1 nss/tests/all.sh ``` ::: ### [Unit test configuration](#unit_test_configuration) :::{container} NSS tests are configured using environment variables. The scripts will attempt to infer values for `HOST` and `DOMSUF` , but can fail. Replace `localhost` and `localdomain` with the hostname and domain suffix for your host. You need to be able to connect to `$HOST.$DOMSUF` . If you don't have a domain suffix you can add an entry to `/etc/hosts` (on Windows,`c:\Windows\System32\drivers\etc\hosts`) as follows: ```{code} 127.0.0.1 localhost.localdomain ``` Validate this opening a command shell and typing: `ping localhost.localdomain`. Remove the `USE_64=1` override if using a 32-bit build. ::: ### [Test results](#test_results) :::{container} Running all tests can take a considerable amount of time. Test output is stored in `tests_results/security/$HOST.$NUMBER/`. The file `results.html` summarizes the results, `output.log` captures all the test output. Other subdirectories of `nss/tests` contain scripts that run a subset of the full suite. Those can be run directly instead of `all.sh`, which might save some time at the cost of coverage. :::