From 5bab67bd96976a79ad24aa40815c454368f0e298 Mon Sep 17 00:00:00 2001 From: Martin Thomson Date: Fri, 12 Oct 2018 16:22:34 +1100 Subject: [PATCH] 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 --HG-- extra : rebase_source : 54465a06808f1164e31094773930831b8bb7e20b extra : amend_source : f89a25ab6ab7b95fa6d54b8d55ebee88ec1dcc65 --- automation/taskcluster/graph/src/extend.js | 14 +-- automation/taskcluster/windows/build.sh | 8 +- automation/taskcluster/windows/build_gyp.sh | 32 +++--- automation/taskcluster/windows/setup.sh | 48 +++++++-- automation/taskcluster/windows/setup32.sh | 10 -- automation/taskcluster/windows/setup64.sh | 10 -- build.sh | 101 ++++++++++--------- coreconf/fuzz.sh | 7 +- coreconf/msvc.sh | 106 ++++++++++++++++++++ coreconf/nspr.sh | 3 + help.txt | 61 +++++------ 11 files changed, 265 insertions(+), 135 deletions(-) delete mode 100644 automation/taskcluster/windows/setup32.sh delete mode 100644 automation/taskcluster/windows/setup64.sh create mode 100644 coreconf/msvc.sh diff --git a/automation/taskcluster/graph/src/extend.js b/automation/taskcluster/graph/src/extend.js index 352bdad214..1302602bcd 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 46136153d0..eebb415353 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 cc829ca99a..c0f38f948f 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 36a040ba1c..93c0cdbd5a 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 19bed284d1..0000000000 --- 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 d16cb0ec9d..0000000000 --- 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 558e91fcc5..4c6d513cd4 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 67cb7f5949..c7b8844b63 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 0000000000..a592279c90 --- /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 d11cd48ed7..325a188c39 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 1458c96dbe..1df72736e0 100644 --- a/help.txt +++ b/help.txt @@ -1,15 +1,15 @@ -Usage: build.sh [-hcv] [-cc] [-j ] [--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 ] [--gyp|-g] [--opt|-o] + [-t |--target=] + [--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=:|--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 run at most 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= 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=: 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