3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 ################################################################################
8 # This script builds NSS with gyp and ninja.
10 # This build system is still under development. It does not yet support all
11 # the features or platforms that NSS supports.
15 cwd
=$
(cd $
(dirname $0); pwd -P)
16 dist_dir
="$cwd/../dist"
17 argsfile
="$dist_dir/build_args"
18 source "$cwd/coreconf/nspr.sh"
19 source "$cwd/coreconf/sanitizers.sh"
30 if [ "$verbose" = 1 ]; then
40 # The prehistoric bash on Mac doesn't support @Q quoting.
41 # The consequences aren't that serious, unless there are odd arrangements of spaces.
42 if /usr
/bin
/env bash
-c 'x=1;echo "${x@Q}"' >/dev
/null
2>&1; then
43 Q
() { echo "${@@Q}"; }
48 if [ -n "$CCC" ] && [ -z "$CXX" ]; then
68 gyp_params
=(--depth="$cwd" --generator-output=".")
71 # Assume that the target architecture is the same as the host by default.
72 host_arch
=$
(python
"$cwd/coreconf/detect_host_arch.py")
73 target_arch
=$host_arch
75 # Assume that MSVC is wanted if this is running on windows.
77 if [ "${platform%-*}" = "MINGW32_NT" -o "${platform%-*}" = "MINGW64_NT" ]; then
81 # Parse command line arguments.
83 while [ $# -gt 0 ]; do
86 if [[ ! -e "$argsfile" ]]; then
87 echo "Unable to rebuild" 1>&2
90 IFS
=$
'\r\n' GLOBIGNORE
='*' command eval 'previous_args=($(<"$argsfile"))'
91 exec /usr
/bin
/env bash
-c "$(Q "$0")"' "$@"' "$0" "${previous_args[@]}"
95 -v) ninja_params
+=(-v); verbose
=1 ;;
96 -j) ninja_params
+=(-j "$2"); shift ;;
97 --gyp|
-g) rebuild_gyp
=1 ;;
98 --opt|
-o) opt_build
=1 ;;
99 -m32|
--m32) target_arch
=ia32
; echo 'Warning: use -t instead of -m32' 1>&2 ;;
100 -t|
--target) target_arch
="$2"; shift ;;
101 --target=*) target_arch
="${1#*=}" ;;
102 --clang) export CC
=clang
; export CCC
=clang
++; export CXX
=clang
++; msvc
=0 ;;
103 --gcc) export CC
=gcc
; export CCC
=g
++; export CXX
=g
++; msvc
=0 ;;
105 --scan-build) enable_scanbuild
;;
106 --scan-build=?
*) enable_scanbuild
"${1#*=}" ;;
107 --disable-tests) gyp_params
+=(-Ddisable_tests=1) ;;
108 --pprof) gyp_params
+=(-Duse_pprof=1) ;;
109 --asan) enable_sanitizer asan
;;
110 --msan) enable_sanitizer msan
;;
111 --ubsan) enable_ubsan
;;
112 --ubsan=?
*) enable_ubsan
"${1#*=}" ;;
114 --fuzz=oss
) fuzz
=1; fuzz_oss
=1 ;;
115 --fuzz=tls
) fuzz
=1; fuzz_tls
=1 ;;
116 --sancov) enable_sancov
;;
117 --sancov=?
*) enable_sancov
"${1#*=}" ;;
118 --emit-llvm) gyp_params
+=(-Demit_llvm=1 -Dsign_libs=0) ;;
119 --no-zdefs) gyp_params
+=(-Dno_zdefs=1) ;;
120 --static) gyp_params
+=(-Dstatic_libs=1) ;;
121 --ct-verif) gyp_params
+=(-Dct_verif=1) ;;
122 --nspr) nspr_clean
; rebuild_nspr
=1 ;;
123 --nspr-test-build) build_nspr_tests
=1 ;;
124 --nspr-test-run) run_nspr_tests
=1 ;;
125 --nspr-only) exit_after_nspr
=1 ;;
126 --with-nspr=?
*) set_nspr_path
"${1#*=}"; no_local_nspr
=1 ;;
127 --system-nspr) set_nspr_path
"/usr/include/nspr/:"; no_local_nspr
=1 ;;
128 --system-sqlite) gyp_params
+=(-Duse_system_sqlite=1) ;;
129 --enable-fips) gyp_params
+=(-Ddisable_fips=0) ;;
130 --enable-libpkix) gyp_params
+=(-Ddisable_libpkix=0) ;;
131 --mozpkix-only) gyp_params
+=(-Dmozpkix_only=1 -Ddisable_tests=1 -Dsign_libs=0) ;;
132 --disable-keylog) sslkeylogfile
=0 ;;
133 -D*) gyp_params
+=("$1") ;;
134 *) show_help
; exit 2 ;;
139 # Set the target architecture and build type.
140 gyp_params
+=(-Dtarget_arch="$target_arch")
141 if [ "$opt_build" = 1 ]; then
147 gyp_params
+=(-Denable_sslkeylogfile="$sslkeylogfile")
150 if [ "$fuzz" = 1 ]; then
151 source "$cwd/coreconf/fuzz.sh"
153 nspr_set_flags
$sanitizer_flags
154 if [ ! -z "$sanitizer_flags" ]; then
155 gyp_params
+=(-Dsanitizer_flags="$sanitizer_flags")
158 if [ "$msvc" = 1 ]; then
159 source "$cwd/coreconf/msvc.sh"
163 if [ "$clean" = 1 -o "$clean_only" = 1 ]; then
167 # -cc = only clean, don't build
168 if [ "$clean_only" = 1 ]; then
175 target_dir
="$cwd/out/$target"
176 mkdir
-p "$target_dir"
177 dist_dir
=$
(mkdir
-p "$dist_dir"; cd "$dist_dir"; pwd -P)
178 gyp_params
+=(-Dnss_dist_dir="$dist_dir")
180 # This saves a canonical representation of arguments that we are passing to gyp
181 # or the NSPR build so that we can work out if a rebuild is needed.
182 # Caveat: This can fail for arguments that are position-dependent.
183 # e.g., "-e 2 -f 1" and "-e 1 -f 2" canonicalize the same.
186 local newconf
="$1".new oldconf
="$1"
188 mkdir
-p $
(dirname "$newconf")
189 echo CC
="$(Q "$CC")" >"$newconf"
190 echo CCC
="$(Q "$CCC")" >>"$newconf"
191 echo CXX
="$(Q "$CXX")" >>"$newconf"
192 echo target_arch
="$(Q "$target_arch")" >>"$newconf"
193 for i
in "$@"; do echo "$i"; done |
sort >>"$newconf"
195 # Note: The following diff fails if $oldconf isn't there as well, which
196 # happens if we don't have a previous successful build.
197 ! diff -q "$newconf" "$oldconf" >/dev
/null
2>&1
200 gyp_config
="$cwd/out/gyp_config"
201 nspr_config
="$cwd/out/$target/nspr_config"
203 # Now check what needs to be rebuilt.
204 # If we don't have a build directory make sure that we rebuild.
205 if [ ! -d "$target_dir" ]; then
208 elif [ ! -d "$dist_dir/$target" ]; then
212 if check_config
"$nspr_config" \
213 nspr_cflags
="$(Q "$nspr_cflags")" \
214 nspr_cxxflags
="$(Q "$nspr_cxxflags")" \
215 nspr_ldflags
="$(Q "$nspr_ldflags")"; then
219 if check_config
"$gyp_config" "$(Q "${gyp_params[@]}")"; then
223 # Save the chosen target.
224 echo "$target" > "$dist_dir/latest"
225 for i
in "${all_args[@]}"; do echo "$i"; done > "$argsfile"
229 if [[ "$rebuild_nspr" = 1 && "$no_local_nspr" = 0 ]]; then
232 mv -f "$nspr_config.new" "$nspr_config"
235 if [ "$exit_after_nspr" = 1 ]; then
240 if [ "$rebuild_gyp" = 1 ]; then
241 if ! hash "$GYP" 2> /dev
/null
; then
242 echo "Building NSS requires an installation of gyp: https://gyp.gsrc.io/" 1>&2
245 # These extra arguments aren't used in determining whether to rebuild.
246 obj_dir
="$dist_dir/$target"
247 gyp_params
+=(-Dnss_dist_obj_dir="$obj_dir")
248 if [ "$no_local_nspr" = 0 ]; then
249 set_nspr_path
"$obj_dir/include/nspr:$obj_dir/lib"
252 run_verbose run_scanbuild
${GYP} -f ninja
"${gyp_params[@]}" "$cwd/nss.gyp"
254 mv -f "$gyp_config.new" "$gyp_config"
258 if hash ninja-build
2>/dev
/null
; then
260 elif hash ninja
2>/dev
/null
; then
263 echo "Building NSS requires an installation of ninja: https://ninja-build.org/" 1>&2
266 run_scanbuild
"$ninja" -C "$target_dir" "${ninja_params[@]}"