summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Thomson <martin.thomson@gmail.com>2018-10-12 16:22:34 +1100
committerMartin Thomson <martin.thomson@gmail.com>2018-10-12 16:22:34 +1100
commit395db9dd0d6eb8d7982db4d8f1845f80c4af8c17 (patch)
tree5c50ee7e4a35803835ac4c1fbe384569fafdb842
parent90e6c8c4fdde4bc1524d9e821856542aeebcabd0 (diff)
downloadnss-hg-395db9dd0d6eb8d7982db4d8f1845f80c4af8c17.tar.gz
Bug 1434943 - Support for MSVC in build.sh, r=jcj
Summary: This adds basic support for MSVC to build.sh. It uses the registry and vswhere (which is part of the standard mozilla-build setup now) to work out paths and set them properly. It's probably a little fragile, but it's better than the shoestring and tape we have in builds right now. I took the liberty of sanitizing the command-line options a little here. Mostly that is sorting them, but I also deprecated the -m32 option in favour of specifying target architecture with -t. That turned out to be a lot cleaner. Reviewers: jcj Reviewed By: jcj Bug #: 1434943 Differential Revision: https://phabricator.services.mozilla.com/D5125
-rw-r--r--automation/taskcluster/graph/src/extend.js14
-rw-r--r--automation/taskcluster/windows/build.sh8
-rw-r--r--automation/taskcluster/windows/build_gyp.sh32
-rw-r--r--automation/taskcluster/windows/setup.sh48
-rw-r--r--automation/taskcluster/windows/setup32.sh10
-rw-r--r--automation/taskcluster/windows/setup64.sh10
-rwxr-xr-xbuild.sh101
-rw-r--r--coreconf/fuzz.sh7
-rw-r--r--coreconf/msvc.sh106
-rw-r--r--coreconf/nspr.sh3
-rw-r--r--help.txt61
11 files changed, 265 insertions, 135 deletions
diff --git a/automation/taskcluster/graph/src/extend.js b/automation/taskcluster/graph/src/extend.js
index 352bdad21..1302602bc 100644
--- a/automation/taskcluster/graph/src/extend.js
+++ b/automation/taskcluster/graph/src/extend.js
@@ -152,13 +152,13 @@ export default async function main() {
await scheduleLinux("Linux 32 (opt)", {
platform: "linux32",
image: LINUX_IMAGE
- }, "-m32 --opt");
+ }, "-t ia32 --opt");
await scheduleLinux("Linux 32 (debug)", {
platform: "linux32",
collection: "debug",
image: LINUX_IMAGE
- }, "-m32");
+ }, "-t ia32");
await scheduleLinux("Linux 64 (opt)", {
platform: "linux64",
@@ -248,12 +248,12 @@ export default async function main() {
await scheduleWindows("Windows 2012 32 (opt)", {
platform: "windows2012-32",
- }, "build_gyp.sh --opt -m32");
+ }, "build_gyp.sh --opt -t ia32");
await scheduleWindows("Windows 2012 32 (debug)", {
platform: "windows2012-32",
collection: "debug"
- }, "build_gyp.sh -m32");
+ }, "build_gyp.sh -t ia32");
await scheduleFuzzing();
await scheduleFuzzing32();
@@ -679,7 +679,7 @@ async function scheduleFuzzing32() {
"/bin/bash",
"-c",
"bin/checkout.sh && " +
- "nss/automation/taskcluster/scripts/build_gyp.sh -g -v --fuzz -m32"
+ "nss/automation/taskcluster/scripts/build_gyp.sh -g -v --fuzz -t ia32"
],
artifacts: {
public: {
@@ -706,7 +706,7 @@ async function scheduleFuzzing32() {
"/bin/bash",
"-c",
"bin/checkout.sh && " +
- "nss/automation/taskcluster/scripts/build_gyp.sh -g -v --fuzz=tls -m32"
+ "nss/automation/taskcluster/scripts/build_gyp.sh -g -v --fuzz=tls -t ia32"
],
}));
@@ -1105,7 +1105,7 @@ async function scheduleTools() {
command: [
"/bin/bash",
"-c",
- "bin/checkout.sh && nss/automation/taskcluster/scripts/build_gyp.sh --disable-tests --emit-llvm -m32"
+ "bin/checkout.sh && nss/automation/taskcluster/scripts/build_gyp.sh --disable-tests --emit-llvm -t ia32"
]
}));
diff --git a/automation/taskcluster/windows/build.sh b/automation/taskcluster/windows/build.sh
index 46136153d..eebb41535 100644
--- a/automation/taskcluster/windows/build.sh
+++ b/automation/taskcluster/windows/build.sh
@@ -2,12 +2,12 @@
set -v -e -x
-# Set up the toolchain.
-if [ "$USE_64" = 1 ]; then
- source $(dirname $0)/setup64.sh
+if [[ "$USE_64" == 1 ]]; then
+ m=x64
else
- source $(dirname $0)/setup32.sh
+ m=x86
fi
+source "$(dirname "$0")/setup.sh"
# Clone NSPR.
hg_clone https://hg.mozilla.org/projects/nspr nspr default
diff --git a/automation/taskcluster/windows/build_gyp.sh b/automation/taskcluster/windows/build_gyp.sh
index cc829ca99..c0f38f948 100644
--- a/automation/taskcluster/windows/build_gyp.sh
+++ b/automation/taskcluster/windows/build_gyp.sh
@@ -2,33 +2,37 @@
set -v -e -x
-# Set up the toolchain.
-if [[ "$@" == *"-m32"* ]]; then
- source $(dirname $0)/setup32.sh
-else
- source $(dirname $0)/setup64.sh
-fi
+# Parse for the -t option.
+m=x64
+for i in "$@"; do
+ case "$i" in
+ -t|--target) m= ;;
+ --target=*) m="${i#*=}" ;;
+ *) [[ -z "$m" ]] && m="$i" ;;
+ esac
+done
+[[ "$m" == "ia32" ]] && m=x86
+source "$(dirname "$0")/setup.sh"
# Install GYP.
-cd gyp
+pushd gyp
python -m virtualenv test-env
test-env/Scripts/python setup.py install
test-env/Scripts/python -m pip install --upgrade pip
test-env/Scripts/pip install --upgrade setuptools
-cd ..
-
-export GYP_MSVS_OVERRIDE_PATH="${VSPATH}"
-export GYP_MSVS_VERSION="2015"
-export GYP="${PWD}/gyp/test-env/Scripts/gyp"
-
# Fool GYP.
touch "${VSPATH}/VC/vcvarsall.bat"
+export GYP_MSVS_OVERRIDE_PATH="${VSPATH}"
+export GYP_MSVS_VERSION=2015
+popd
+
+export PATH="${PATH}:${PWD}/ninja/bin:${PWD}/gyp/test-env/Scripts"
# Clone NSPR.
hg_clone https://hg.mozilla.org/projects/nspr nspr default
# Build with gyp.
-GYP=${GYP} ./nss/build.sh -g -v "$@"
+./nss/build.sh -g -v "$@"
# Package.
7z a public/build/dist.7z dist
diff --git a/automation/taskcluster/windows/setup.sh b/automation/taskcluster/windows/setup.sh
index 36a040ba1..93c0cdbd5 100644
--- a/automation/taskcluster/windows/setup.sh
+++ b/automation/taskcluster/windows/setup.sh
@@ -2,13 +2,6 @@
set -v -e -x
-export VSPATH="$(pwd)/vs2017_15.4.2"
-export NINJA_PATH="$(pwd)/ninja/bin"
-
-export WINDOWSSDKDIR="${VSPATH}/SDK"
-export VS90COMNTOOLS="${VSPATH}/VC"
-export INCLUDE="${VSPATH}/VC/include:${VSPATH}/SDK/Include/10.0.15063.0/ucrt:${VSPATH}/SDK/Include/10.0.15063.0/shared:${VSPATH}/SDK/Include/10.0.15063.0/um"
-
# Usage: hg_clone repo dir [revision=@]
hg_clone() {
repo=$1
@@ -22,5 +15,42 @@ hg_clone() {
exit 1
}
-hg_clone https://hg.mozilla.org/build/tools tools default
-tools/scripts/tooltool/tooltool_wrapper.sh $(dirname $0)/releng.manifest https://tooltool.mozilla-releng.net/ non-existant-file.sh /c/mozilla-build/python/python.exe /c/builds/tooltool.py --authentication-file /c/builds/relengapi.tok -c /c/builds/tooltool_cache
+hg_clone https://hg.mozilla.org/build/tools tools b8d7c263dfc3
+tools/scripts/tooltool/tooltool_wrapper.sh \
+ $(dirname $0)/releng.manifest https://tooltool.mozilla-releng.net/ \
+ non-existant-file.sh /c/mozilla-build/python/python.exe \
+ /c/builds/tooltool.py --authentication-file /c/builds/relengapi.tok \
+ -c /c/builds/tooltool_cache
+
+# This needs $m to be set.
+[[ -n "$m" ]]
+
+# Setup MSVC paths.
+export VSPATH="${PWD}/vs2017_15.4.2"
+UCRTVersion="10.0.15063.0"
+
+export WINDOWSSDKDIR="${VSPATH}/SDK"
+export VS90COMNTOOLS="${VSPATH}/VC"
+export WIN32_REDIST_DIR="${VSPATH}/VC/redist/${m}/Microsoft.VC141.CRT"
+export WIN_UCRT_REDIST_DIR="${VSPATH}/SDK/Redist/ucrt/DLLs/${m}"
+
+if [ "$m" == "x86" ]; then
+ PATH="${PATH}:${VSPATH}/VC/bin/Hostx64/x86"
+ PATH="${PATH}:${VSPATH}/VC/bin/Hostx64/x64"
+fi
+PATH="${PATH}:${VSPATH}/VC/bin/Host${m}/${m}"
+PATH="${PATH}:${WIN32_REDIST_DIR}"
+PATH="${PATH}:${WIN_UCRT_REDIST_DIR}"
+PATH="${PATH}:${VSPATH}/SDK/bin/${UCRTVersion}/x64"
+export PATH
+
+LIB="${LIB}:${VSPATH}/VC/lib/${m}"
+LIB="${LIB}:${VSPATH}/SDK/lib/${UCRTVersion}/ucrt/${m}"
+LIB="${LIB}:${VSPATH}/SDK/lib/${UCRTVersion}/um/${m}"
+export LIB
+
+INCLUDE="${INCLUDE}:${VSPATH}/VC/include"
+INCLUDE="${INCLUDE}:${VSPATH}/SDK/Include/${UCRTVersion}/ucrt"
+INCLUDE="${INCLUDE}:${VSPATH}/SDK/Include/${UCRTVersion}/shared"
+INCLUDE="${INCLUDE}:${VSPATH}/SDK/Include/${UCRTVersion}/um"
+export INCLUDE
diff --git a/automation/taskcluster/windows/setup32.sh b/automation/taskcluster/windows/setup32.sh
deleted file mode 100644
index 19bed284d..000000000
--- a/automation/taskcluster/windows/setup32.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-set -v -e -x
-
-source $(dirname $0)/setup.sh
-
-export WIN32_REDIST_DIR="${VSPATH}/VC/redist/x86/Microsoft.VC141.CRT"
-export WIN_UCRT_REDIST_DIR="${VSPATH}/SDK/Redist/ucrt/DLLs/x86"
-export PATH="${NINJA_PATH}:${VSPATH}/VC/bin/Hostx64/x86:${VSPATH}/VC/bin/Hostx64/x64:${VSPATH}/VC/Hostx86/x86:${VSPATH}/SDK/bin/10.0.15063.0/x64:${VSPATH}/VC/redist/x86/Microsoft.VC141.CRT:${VSPATH}/SDK/Redist/ucrt/DLLs/x86:${PATH}"
-export LIB="${VSPATH}/VC/lib/x86:${VSPATH}/SDK/lib/10.0.15063.0/ucrt/x86:${VSPATH}/SDK/lib/10.0.15063.0/um/x86"
diff --git a/automation/taskcluster/windows/setup64.sh b/automation/taskcluster/windows/setup64.sh
deleted file mode 100644
index d16cb0ec9..000000000
--- a/automation/taskcluster/windows/setup64.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-set -v -e -x
-
-source $(dirname $0)/setup.sh
-
-export WIN32_REDIST_DIR="${VSPATH}/VC/redist/x64/Microsoft.VC141.CRT"
-export WIN_UCRT_REDIST_DIR="${VSPATH}/SDK/Redist/ucrt/DLLs/x64"
-export PATH="${NINJA_PATH}:${VSPATH}/VC/bin/Hostx64/x64:${VSPATH}/VC/bin/Hostx86/x86:${VSPATH}/SDK/bin/10.0.15063.0/x64:${VSPATH}/VC/redist/x64/Microsoft.VC141.CRT:${VSPATH}/SDK/Redist/ucrt/DLLs/x64:${PATH}"
-export LIB="${VSPATH}/VC/lib/x64:${VSPATH}/SDK/lib/10.0.15063.0/ucrt/x64:${VSPATH}/SDK/lib/10.0.15063.0/um/x64"
diff --git a/build.sh b/build.sh
index 558e91fcc..4c6d513cd 100755
--- a/build.sh
+++ b/build.sh
@@ -50,76 +50,86 @@ fuzz=0
fuzz_tls=0
fuzz_oss=0
no_local_nspr=0
-armhf=0
gyp_params=(--depth="$cwd" --generator-output=".")
-nspr_params=()
ninja_params=()
-# try to guess sensible defaults
-arch=$(python "$cwd"/coreconf/detect_host_arch.py)
-if [ "$arch" = "x64" -o "$arch" = "aarch64" ]; then
- build_64=1
-elif [ "$arch" = "arm" ]; then
- armhf=1
+# Assume that the target architecture is the same as the host by default.
+host_arch=$(python "$cwd"/coreconf/detect_host_arch.py)
+target_arch=$host_arch
+
+# Assume that MSVC is wanted if this is running on windows.
+platform=$(uname -s)
+if [ "${platform%-*}" = "MINGW32_NT" -o "${platform%-*}" = "MINGW64_NT" ]; then
+ msvc=1
fi
-# parse command line arguments
+# Parse command line arguments.
while [ $# -gt 0 ]; do
- case $1 in
+ case "$1" in
-c) clean=1 ;;
-cc) clean_only=1 ;;
- --gyp|-g) rebuild_gyp=1 ;;
- --nspr) nspr_clean; rebuild_nspr=1 ;;
- -j) ninja_params+=(-j "$2"); shift ;;
-v) ninja_params+=(-v); verbose=1 ;;
- --test) gyp_params+=(-Dtest_build=1) ;;
- --clang) export CC=clang; export CCC=clang++; export CXX=clang++ ;;
- --gcc) export CC=gcc; export CCC=g++; export CXX=g++ ;;
- --fuzz) fuzz=1 ;;
- --fuzz=oss) fuzz=1; fuzz_oss=1 ;;
- --fuzz=tls) fuzz=1; fuzz_tls=1 ;;
+ -j) ninja_params+=(-j "$2"); shift ;;
+ --gyp|-g) rebuild_gyp=1 ;;
+ --opt|-o) opt_build=1 ;;
+ -m32|--m32) target_arch=ia32; echo 'Warning: use -t instead of -m32' 1>&2 ;;
+ -t|--target) target_arch="$2"; shift ;;
+ --target=*) target_arch="${1#*=}" ;;
+ --clang) export CC=clang; export CCC=clang++; export CXX=clang++; msvc=0 ;;
+ --gcc) export CC=gcc; export CCC=g++; export CXX=g++; msvc=0 ;;
+ --msvc) msvc=1 ;;
--scan-build) enable_scanbuild ;;
--scan-build=?*) enable_scanbuild "${1#*=}" ;;
- --opt|-o) opt_build=1 ;;
- -m32|--m32) build_64=0 ;;
+ --disable-tests) gyp_params+=(-Ddisable_tests=1) ;;
+ --pprof) gyp_params+=(-Duse_pprof=1) ;;
--asan) enable_sanitizer asan ;;
--msan) enable_sanitizer msan ;;
--ubsan) enable_ubsan ;;
--ubsan=?*) enable_ubsan "${1#*=}" ;;
+ --fuzz) fuzz=1 ;;
+ --fuzz=oss) fuzz=1; fuzz_oss=1 ;;
+ --fuzz=tls) fuzz=1; fuzz_tls=1 ;;
--sancov) enable_sancov ;;
--sancov=?*) enable_sancov "${1#*=}" ;;
- --pprof) gyp_params+=(-Duse_pprof=1) ;;
- --ct-verif) gyp_params+=(-Dct_verif=1) ;;
--emit-llvm) gyp_params+=(-Demit_llvm=1 -Dsign_libs=0) ;;
- --disable-tests) gyp_params+=(-Ddisable_tests=1) ;;
--no-zdefs) gyp_params+=(-Dno_zdefs=1) ;;
- --system-sqlite) gyp_params+=(-Duse_system_sqlite=1) ;;
+ --test) gyp_params+=(-Dtest_build=1) ;;
+ --ct-verif) gyp_params+=(-Dct_verif=1) ;;
+ --nspr) nspr_clean; rebuild_nspr=1 ;;
--with-nspr=?*) set_nspr_path "${1#*=}"; no_local_nspr=1 ;;
--system-nspr) set_nspr_path "/usr/include/nspr/:"; no_local_nspr=1 ;;
- --enable-libpkix) gyp_params+=(-Ddisable_libpkix=0) ;;
+ --system-sqlite) gyp_params+=(-Duse_system_sqlite=1) ;;
--enable-fips) gyp_params+=(-Ddisable_fips=0) ;;
+ --enable-libpkix) gyp_params+=(-Ddisable_libpkix=0) ;;
--mozpkix-only) gyp_params+=(-Dmozpkix_only=1 -Ddisable_tests=1 -Dsign_libs=0) ;;
*) show_help; exit 2 ;;
esac
shift
done
+# Set the target architecture and build type.
+gyp_params+=(-Dtarget_arch="$target_arch")
if [ "$opt_build" = 1 ]; then
target=Release
else
target=Debug
fi
-if [ "$build_64" = 1 ]; then
- nspr_params+=(--enable-64bit)
-elif [ ! "$armhf" = 1 ]; then
- gyp_params+=(-Dtarget_arch=ia32)
-fi
+
+# Do special setup.
if [ "$fuzz" = 1 ]; then
source "$cwd"/coreconf/fuzz.sh
fi
+nspr_set_flags $sanitizer_flags
+if [ ! -z "$sanitizer_flags" ]; then
+ gyp_params+=(-Dsanitizer_flags="$sanitizer_flags")
+fi
-# set paths
+if [ "$msvc" = 1 ]; then
+ source "$cwd"/coreconf/msvc.sh
+fi
+
+# Setup build paths.
target_dir="$cwd"/out/$target
mkdir -p "$target_dir"
dist_dir="$cwd"/../dist
@@ -150,6 +160,7 @@ check_config()
echo CC="$CC" >"$newconf"
echo CCC="$CCC" >>"$newconf"
echo CXX="$CXX" >>"$newconf"
+ echo target_arch="$target_arch" >>"$newconf"
for i in "$@"; do echo $i; done | sort >>"$newconf"
# Note: The following diff fails if $oldconf isn't there as well, which
@@ -160,6 +171,7 @@ check_config()
gyp_config="$cwd"/out/gyp_config
nspr_config="$cwd"/out/$target/nspr_config
+# Now check what needs to be rebuilt.
# If we don't have a build directory make sure that we rebuild.
if [ ! -d "$target_dir" ]; then
rebuild_nspr=1
@@ -168,33 +180,28 @@ elif [ ! -d "$dist_dir"/$target ]; then
rebuild_nspr=1
fi
-# Update NSPR ${C,CXX,LD}FLAGS.
-nspr_set_flags $sanitizer_flags
-
-if check_config "$nspr_config" "${nspr_params[@]}" \
+if check_config "$nspr_config" \
nspr_cflags="$nspr_cflags" \
nspr_cxxflags="$nspr_cxxflags" \
nspr_ldflags="$nspr_ldflags"; then
rebuild_nspr=1
fi
-# Forward sanitizer flags.
-if [ ! -z "$sanitizer_flags" ]; then
- gyp_params+=(-Dsanitizer_flags="$sanitizer_flags")
-fi
-
if check_config "$gyp_config" "${gyp_params[@]}"; then
rebuild_gyp=1
fi
-# save the chosen target
+# Save the chosen target.
mkdir -p "$dist_dir"
echo $target > "$dist_dir"/latest
+# Build.
+# NSPR.
if [[ "$rebuild_nspr" = 1 && "$no_local_nspr" = 0 ]]; then
- nspr_build "${nspr_params[@]}"
+ nspr_build
mv -f "$nspr_config".new "$nspr_config"
fi
+# gyp.
if [ "$rebuild_gyp" = 1 ]; then
if ! hash ${GYP} 2> /dev/null; then
echo "Please install gyp" 1>&2
@@ -212,11 +219,11 @@ if [ "$rebuild_gyp" = 1 ]; then
mv -f "$gyp_config".new "$gyp_config"
fi
-# Run ninja.
-if hash ninja 2>/dev/null; then
- ninja=ninja
-elif hash ninja-build 2>/dev/null; then
+# ninja.
+if hash ninja-build 2>/dev/null; then
ninja=ninja-build
+elif hash ninja 2>/dev/null; then
+ ninja=ninja
else
echo "Please install ninja" 1>&2
exit 1
diff --git a/coreconf/fuzz.sh b/coreconf/fuzz.sh
index 67cb7f594..c7b8844b6 100644
--- a/coreconf/fuzz.sh
+++ b/coreconf/fuzz.sh
@@ -5,8 +5,7 @@ set +e
# Default to clang if CC is not set.
if [ -z "$CC" ]; then
- command -v clang &> /dev/null 2>&1
- if [ $? != 0 ]; then
+ if ! command -v clang &> /dev/null 2>&1; then
echo "Fuzzing requires clang!"
exit 1
fi
@@ -24,8 +23,8 @@ if [ "$fuzz_oss" = 1 ]; then
gyp_params+=(-Dno_zdefs=1 -Dfuzz_oss=1)
else
enable_sanitizer asan
- # Ubsan doesn't build on 32-bit at the moment. Disable it.
- if [ "$build_64" = 1 ]; then
+ # Ubsan only builds on x64 for the moment.
+ if [ "$target_arch" = "x64" ]; then
enable_ubsan
fi
enable_sancov
diff --git a/coreconf/msvc.sh b/coreconf/msvc.sh
new file mode 100644
index 000000000..a592279c9
--- /dev/null
+++ b/coreconf/msvc.sh
@@ -0,0 +1,106 @@
+#!/bin/bash
+# This configures the environment for running MSVC. It uses vswhere, the
+# registry, and a little knowledge of how MSVC is laid out.
+
+if ! hash vswhere 2>/dev/null; then
+ echo "Can't find vswhere on the path, aborting" 1>&2
+ exit 1
+fi
+
+if ! hash reg 2>/dev/null; then
+ echo "Can't find reg on the path, aborting" 1>&2
+ exit 1
+fi
+
+# Turn a unix-y path into a windows one.
+fixpath() {
+ if hash cygpath 2>/dev/null; then
+ cygpath --unix "$1"
+ else # haxx
+ echo "$1" | sed -e 's,\\,/,g;s,^\(.\):,/\L\1,;s,/$,,'
+ fi
+}
+
+# Query the registry. This takes $1 and tags that on the end of several
+# different paths, looking for a value called $2 at that location.
+# e.g.,
+# regquery Microsoft\Microsoft SDKs\Windows\v10.0 ProductVersion
+# looks for a REG_SZ value called ProductVersion at
+# HKLM\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0
+# HKLU\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0
+# etc...
+regquery() {
+ search=("HKLM\\SOFTWARE\\Wow6432Node" \
+ "HKCU\\SOFTWARE\\Wow6432Node" \
+ "HKLM\\SOFTWARE" \
+ "HKCU\\SOFTWARE")
+ for i in "${search[@]}"; do
+ r=$(reg query "${i}\\${1}" -v "$2" | sed -e 's/ *'"$2"' *REG_SZ *//;t;d')
+ if [ -n "$r" ]; then
+ echo "$r"
+ return 0
+ fi
+ done
+ return 1
+}
+
+VSCOMPONENT=Microsoft.VisualStudio.Component.VC.Tools.x86.x64
+vsinstall=$(vswhere -latest -requires "$VSCOMPONENT" -property installationPath)
+
+# Attempt to setup paths if vswhere returns something and VSPATH isn't set.
+# Otherwise, assume that the env is setup.
+if [[ -n "$vsinstall" && -z "$VSPATH" ]]; then
+
+ case "$target_arch" in
+ ia32) m=x86 ;;
+ x64) m="$target_arch" ;;
+ *)
+ echo "No support for target '$target_arch' with MSVC." 1>&2
+ exit 1
+ esac
+
+ export VSPATH=$(fixpath "$vsinstall")
+ export WINDOWSSDKDIR="${VSPATH}/SDK"
+ export VCINSTALLDIR="${VSPATH}/VC"
+
+ CRTREG="Microsoft\\Microsoft SDKs\\Windows\\v10.0"
+ UniversalCRTSdkDir=$(regquery "$CRTREG" InstallationFolder)
+ UniversalCRTSdkDir=$(fixpath "$UniversalCRTSdkDir")
+ UCRTVersion=$(regquery "$CRTREG" ProductVersion)
+ UCRTVersion=$(cd "${UniversalCRTSdkDir}/include"; ls -d "${UCRTVersion}"* | tail -1)
+
+ VCVER=$(cat "${VCINSTALLDIR}/Auxiliary/Build/Microsoft.VCToolsVersion.default.txt")
+ REDISTVER=$(cat "${VCINSTALLDIR}/Auxiliary/Build/Microsoft.VCRedistVersion.default.txt")
+ export WIN32_REDIST_DIR="${VCINSTALLDIR}/Redist/MSVC/${REDISTVER}/${m}/Microsoft.VC141.CRT"
+ export WIN_UCRT_REDIST_DIR="${UniversalCRTSdkDir}/Redist/ucrt/DLLs/${m}"
+
+ if [ "$m" == "x86" ]; then
+ PATH="${PATH}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/bin/Hostx64/x64"
+ PATH="${PATH}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/bin/Hostx64/x86"
+ fi
+ PATH="${PATH}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/bin/Host${m}/${m}"
+ PATH="${PATH}:${UniversalCRTSdkDir}/bin/${UCRTVersion}/${m}"
+ PATH="${PATH}:${WIN32_REDIST_DIR}"
+ export PATH
+
+ INCLUDE="${VCINSTALLDIR}/Tools/MSVC/${VCVER}/ATLMFC/include"
+ INCLUDE="${INCLUDE}:${VCINSTALLDIR}/Tools/MSVC/${VCVER}/include"
+ INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/ucrt"
+ INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/shared"
+ INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/um"
+ INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/winrt"
+ INCLUDE="${INCLUDE}:${UniversalCRTSdkDir}/include/${UCRTVersion}/cppwinrt"
+ export INCLUDE
+
+ LIB="${VCINSTALLDIR}/lib/${m}"
+ LIB="${VCINSTALLDIR}/Tools/MSVC/${VCVER}/lib/${m}"
+ LIB="${LIB}:${UniversalCRTSdkDir}/lib/${UCRTVersion}/ucrt/${m}"
+ LIB="${LIB}:${UniversalCRTSdkDir}/lib/${UCRTVersion}/um/${m}"
+ export LIB
+
+ export GYP_MSVS_OVERRIDE_PATH="${VSPATH}"
+ export GYP_MSVS_VERSION=$(vswhere -latest -requires "$VSCOMPONENT" -property catalog_productLineVersion)
+else
+ echo Assuming env setup is already done.
+ echo VSPATH=$VSPATH
+fi
diff --git a/coreconf/nspr.sh b/coreconf/nspr.sh
index d11cd48ed..325a188c3 100644
--- a/coreconf/nspr.sh
+++ b/coreconf/nspr.sh
@@ -32,6 +32,9 @@ nspr_build()
if [ "$opt_build" = 1 ]; then
extra_params+=(--disable-debug --enable-optimize)
fi
+ if [ "$target_arch" = "x64" ]; then
+ extra_params+=(--enable-64bit)
+ fi
echo "NSPR [1/3] configure ..."
pushd "$nspr_dir" >/dev/null
diff --git a/help.txt b/help.txt
index 1458c96db..1df72736e 100644
--- a/help.txt
+++ b/help.txt
@@ -1,15 +1,15 @@
-Usage: build.sh [-hcv] [-cc] [-j <n>] [--nspr] [--gyp|-g] [--opt|-o] [-m32]
- [--test] [--pprof] [--scan-build[=output]] [--ct-verif]
- [--asan] [--ubsan] [--msan] [--sancov[=edge|bb|func|...]]
- [--disable-tests] [--fuzz[=tls|oss]] [--system-sqlite]
- [--no-zdefs] [--with-nspr] [--system-nspr] [--enable-libpkix]
- [--enable-fips] [--mozpkix-only]
+Usage: build.sh [-h] [-c|-cc] [-v] [-j <n>] [--gyp|-g] [--opt|-o]
+ [-t <x64|x86|...>|--target=<x64|x86|...>]
+ [--clang|--gcc|--msvc] [--scan-build[=dir]] [--disable-tests]
+ [--pprof] [--asan] [--msan] [--ubsan[=bool,shift,...]
+ [--fuzz[=tls|oss]] [--sancov[=edge|bb|func|...]]
+ [--emit-llvm] [--no-zdefs] [--test] [--ct-verif]
+ [--nspr|--with-nspr=<include>:<lib>|--system-nspr]
+ [--system-sqlite] [--enable-fips] [--enable-libpkix]
+ [--mozpkix-only]
This script builds NSS with gyp and ninja.
-This build system is still under development. It does not yet support all
-the features or platforms that NSS supports.
-
NSS build tool options:
-h display this help and exit
@@ -17,36 +17,37 @@ NSS build tool options:
-cc clean without building
-v verbose build
-j <n> run at most <n> concurrent jobs
- --nspr force a rebuild of NSPR
--gyp|-g force a rerun of gyp
--opt|-o do an opt build
- -m32 do a 32-bit build on a 64-bit system
+ --target|-t specify target architecture (e.g., x86, x64, aarch64)
--clang build with clang and clang++
--gcc build with gcc and g++
- --test ignore map files and export everything we have
+ --msvc build with MSVC
+ --scan-build run the build with scan-build
+ --scan-build=<dir> sets the output path for scan-build
+ --disable-tests don't build tests and corresponding cmdline utils
+ --pprof build with gperftool support
+ --asan enable address sanitizer
+ --msan enable memory sanitizer
+ --ubsan enable undefined behavior sanitizer
+ --ubsan=bool,shift,... sets specific UB sanitizers
--fuzz build fuzzing targets (this always enables test builds)
--fuzz=tls to enable TLS fuzzing mode
--fuzz=oss to build for OSS-Fuzz
- --pprof build with gperftool support
- --ct-verif build with valgrind for ct-verif
- --scan-build run the build with scan-build (scan-build has to be in the path)
- --scan-build=/out/path sets the output path for scan-build
- --asan do an asan build
- --ubsan do an ubsan build
- --ubsan=bool,shift,... sets specific UB sanitizers
- --msan do an msan build
--sancov do sanitize coverage builds
--sancov=func sets coverage to function level for example
--emit-llvm emit LLVM bitcode while building
(requires the gold linker, use clang-3.8 for SAW)
- --disable-tests don't build tests and corresponding cmdline utils
- --system-sqlite use system sqlite
--no-zdefs don't set -Wl,-z,defs
- --with-nspr don't build NSPR but use the one at the given location, e.g.
- --with-nspr=/path/to/nspr/include:/path/to/nspr/lib
- --system-nspr use system nspr. This requires an installation of NSPR and
- might not work on all systems.
- --enable-libpkix make libpkix part of the build.
- --enable-fips don't disable FIPS checks.
- --mozpkix-only build only static mozpkix and mozpkix-test libraries.
- Note that support for this build option is limited.
+ --test ignore map files and export everything we have
+ --ct-verif build with valgrind for ct-verif
+ --nspr force a rebuild of NSPR
+ --with-nspr use the NSPR build at the given locations
+ --with-nspr=<include>:<lib> sets include and lib paths
+ --system-nspr attempt to use system nspr
+ shorthand for --with-nspr=/usr/include/nspr:
+ --system-sqlite use system sqlite
+ --enable-fips enable FIPS checks
+ --enable-libpkix make libpkix part of the build
+ --mozpkix-only build only static mozpkix and mozpkix-test libraries
+ support for this build option is limited