Bug 1888590 - Mark some subtests on trusted-types-event-handlers.html as failing...
[gecko.git] / security / nss / build.sh
blobae8eeee8b0b257b9c5f5dfcb9e97c7f511959aa0
1 #!/usr/bin/env bash
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.
13 set -e
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"
20 GYP=${GYP:-gyp}
22 # Usage info
23 show_help()
25 cat "$cwd/help.txt"
28 run_verbose()
30 if [ "$verbose" = 1 ]; then
31 echo "$@"
32 exec 3>&1
33 "$@" 1>&3 2>&3
34 exec 3>&-
35 else
36 "$@" >/dev/null
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}"; }
44 else
45 Q() { echo "$@"; }
48 if [ -n "$CCC" ] && [ -z "$CXX" ]; then
49 export CXX="$CCC"
52 opt_build=0
53 build_64=0
54 clean=0
55 rebuild_gyp=0
56 rebuild_nspr=0
57 build_nspr_tests=0
58 run_nspr_tests=0
59 exit_after_nspr=0
60 target=Debug
61 verbose=0
62 fuzz=0
63 fuzz_tls=0
64 fuzz_oss=0
65 no_local_nspr=0
66 sslkeylogfile=1
68 gyp_params=(--depth="$cwd" --generator-output=".")
69 ninja_params=()
71 # Assume that MSVC is wanted if this is running on windows.
72 platform=$(uname -s)
73 if [ "${platform%-*}" = "MINGW32_NT" -o "${platform%-*}" = "MINGW64_NT" ]; then
74 msvc=1
77 # Parse command line arguments.
78 all_args=("$@")
79 while [ $# -gt 0 ]; do
80 case "$1" in
81 --rebuild)
82 if [[ ! -e "$argsfile" ]]; then
83 echo "Unable to rebuild" 1>&2
84 exit 2
86 IFS=$'\r\n' GLOBIGNORE='*' command eval 'previous_args=($(<"$argsfile"))'
87 exec /usr/bin/env bash -c "$(Q "$0")"' "$@"' "$0" "${previous_args[@]}"
89 -c) clean=1 ;;
90 -cc) clean_only=1 ;;
91 -v) ninja_params+=(-v); verbose=1 ;;
92 -j) ninja_params+=(-j "$2"); shift ;;
93 --gyp|-g) rebuild_gyp=1 ;;
94 --opt|-o) opt_build=1 ;;
95 -m32|--m32) target_arch=ia32; echo 'Warning: use -t instead of -m32' 1>&2 ;;
96 -t|--target) target_arch="$2"; shift ;;
97 --target=*) target_arch="${1#*=}" ;;
98 --clang) export CC=clang; export CCC=clang++; export CXX=clang++; msvc=0 ;;
99 --gcc) export CC=gcc; export CCC=g++; export CXX=g++; msvc=0 ;;
100 --msvc) msvc=1 ;;
101 --scan-build) enable_scanbuild ;;
102 --scan-build=?*) enable_scanbuild "${1#*=}" ;;
103 --disable-tests) gyp_params+=(-Ddisable_tests=1) ;;
104 --pprof) gyp_params+=(-Duse_pprof=1) ;;
105 --asan) enable_sanitizer asan ;;
106 --msan) enable_sanitizer msan ;;
107 --sourcecov) enable_sourcecov ;;
108 --ubsan) enable_ubsan ;;
109 --ubsan=?*) enable_ubsan "${1#*=}" ;;
110 --fuzz) fuzz=1 ;;
111 --fuzz=oss) fuzz=1; fuzz_oss=1 ;;
112 --fuzz=tls) fuzz=1; fuzz_tls=1 ;;
113 --sancov) enable_sancov; gyp_params+=(-Dcoverage=1) ;;
114 --sancov=?*) enable_sancov "${1#*=}"; gyp_params+=(-Dcoverage=1) ;;
115 --emit-llvm) gyp_params+=(-Demit_llvm=1 -Dsign_libs=0) ;;
116 --no-zdefs) gyp_params+=(-Dno_zdefs=1) ;;
117 --static) gyp_params+=(-Dstatic_libs=1) ;;
118 --ct-verif) gyp_params+=(-Dct_verif=1) ;;
119 --nspr) nspr_clean; rebuild_nspr=1 ;;
120 --nspr-test-build) build_nspr_tests=1 ;;
121 --nspr-test-run) run_nspr_tests=1 ;;
122 --nspr-only) exit_after_nspr=1 ;;
123 --with-nspr=?*) set_nspr_path "${1#*=}"; no_local_nspr=1 ;;
124 --system-nspr) set_nspr_path "/usr/include/nspr/:"; no_local_nspr=1 ;;
125 --system-sqlite) gyp_params+=(-Duse_system_sqlite=1) ;;
126 --enable-fips) gyp_params+=(-Ddisable_fips=0) ;;
127 --enable-libpkix) gyp_params+=(-Ddisable_libpkix=0) ;;
128 --mozpkix-only) gyp_params+=(-Dmozpkix_only=1 -Ddisable_tests=1 -Dsign_libs=0) ;;
129 --disable-keylog) sslkeylogfile=0 ;;
130 --enable-legacy-db) gyp_params+=(-Ddisable_dbm=0) ;;
131 --mozilla-central) gyp_params+=(-Dmozilla_central=1) ;;
132 --python) python="$2"; shift ;;
133 --python=*) python="${1#*=}" ;;
134 -D*) gyp_params+=("$1") ;;
135 *) show_help; exit 2 ;;
136 esac
137 shift
138 done
140 if [ -n "$python" ]; then
141 gyp_params+=(-Dpython="$python")
144 if [ -z "$target_arch" ]; then
145 # Assume that the target architecture is the same as the host by default.
146 host_arch=$(${python:-python} "$cwd/coreconf/detect_host_arch.py")
147 target_arch=$host_arch
150 # Set the target architecture and build type.
151 gyp_params+=(-Dtarget_arch="$target_arch")
152 if [ "$opt_build" = 1 ]; then
153 target=Release
154 else
155 target=Debug
158 gyp_params+=(-Denable_sslkeylogfile="$sslkeylogfile")
160 # Do special setup.
161 if [ "$fuzz" = 1 ]; then
162 source "$cwd/coreconf/fuzz.sh"
164 nspr_set_flags $sanitizer_flags
165 if [ ! -z "$sanitizer_flags" ]; then
166 gyp_params+=(-Dsanitizer_flags="$sanitizer_flags")
169 if [ "$msvc" = 1 ]; then
170 source "$cwd/coreconf/msvc.sh"
173 # -c = clean first
174 if [ "$clean" = 1 -o "$clean_only" = 1 ]; then
175 nspr_clean
176 rm -rf "$cwd/out"
177 rm -rf "$dist_dir"
178 # -cc = only clean, don't build
179 if [ "$clean_only" = 1 ]; then
180 echo "Cleaned"
181 exit 0
185 # Setup build paths.
186 target_dir="$cwd/out/$target"
187 mkdir -p "$target_dir"
188 dist_dir=$(mkdir -p "$dist_dir"; cd "$dist_dir"; pwd -P)
189 gyp_params+=(-Dnss_dist_dir="$dist_dir")
191 # This saves a canonical representation of arguments that we are passing to gyp
192 # or the NSPR build so that we can work out if a rebuild is needed.
193 # Caveat: This can fail for arguments that are position-dependent.
194 # e.g., "-e 2 -f 1" and "-e 1 -f 2" canonicalize the same.
195 check_config()
197 local newconf="$1".new oldconf="$1"
198 shift
199 mkdir -p $(dirname "$newconf")
200 echo CC="$(Q "$CC")" >"$newconf"
201 echo CCC="$(Q "$CCC")" >>"$newconf"
202 echo CXX="$(Q "$CXX")" >>"$newconf"
203 echo target_arch="$(Q "$target_arch")" >>"$newconf"
204 for i in "$@"; do echo "$i"; done | sort >>"$newconf"
206 # Note: The following diff fails if $oldconf isn't there as well, which
207 # happens if we don't have a previous successful build.
208 ! diff -q "$newconf" "$oldconf" >/dev/null 2>&1
211 gyp_config="$cwd/out/gyp_config"
212 nspr_config="$cwd/out/$target/nspr_config"
214 # Now check what needs to be rebuilt.
215 # If we don't have a build directory make sure that we rebuild.
216 if [ ! -d "$target_dir" ]; then
217 rebuild_nspr=1
218 rebuild_gyp=1
219 elif [ ! -d "$dist_dir/$target" ]; then
220 rebuild_nspr=1
223 if check_config "$nspr_config" \
224 nspr_cflags="$(Q "$nspr_cflags")" \
225 nspr_cxxflags="$(Q "$nspr_cxxflags")" \
226 nspr_ldflags="$(Q "$nspr_ldflags")"; then
227 rebuild_nspr=1
230 if check_config "$gyp_config" "$(Q "${gyp_params[@]}")"; then
231 rebuild_gyp=1
234 # Save the chosen target.
235 echo "$target" > "$dist_dir/latest"
236 for i in "${all_args[@]}"; do echo "$i"; done > "$argsfile"
238 # Build.
239 # NSPR.
240 if [[ "$rebuild_nspr" = 1 && "$no_local_nspr" = 0 ]]; then
241 nspr_clean
242 nspr_build
243 mv -f "$nspr_config.new" "$nspr_config"
246 if [ "$exit_after_nspr" = 1 ]; then
247 exit 0
250 # gyp.
251 if [ "$rebuild_gyp" = 1 ]; then
252 if ! hash "$GYP" 2> /dev/null; then
253 echo "Building NSS requires an installation of gyp: https://gyp.gsrc.io/" 1>&2
254 exit 3
256 # These extra arguments aren't used in determining whether to rebuild.
257 obj_dir="$dist_dir/$target"
258 gyp_params+=(-Dnss_dist_obj_dir="$obj_dir")
259 if [ "$no_local_nspr" = 0 ]; then
260 set_nspr_path "$obj_dir/include/nspr:$obj_dir/lib"
263 run_verbose run_scanbuild ${GYP} -f ninja "${gyp_params[@]}" "$cwd/nss.gyp"
265 mv -f "$gyp_config.new" "$gyp_config"
268 # ninja.
269 if hash ninja-build 2>/dev/null; then
270 ninja=ninja-build
271 elif hash ninja 2>/dev/null; then
272 ninja=ninja
273 else
274 echo "Building NSS requires an installation of ninja: https://ninja-build.org/" 1>&2
275 exit 3
277 run_scanbuild "$ninja" -C "$target_dir" "${ninja_params[@]}"