@@ -47,38 +47,98 @@ if [[ -z "${!nss_dir_var}" ]]; then
4747fi
4848
4949# Use toolchain configuration from environment
50- eval " CC =\$ ${RUST_ANDROID_PREFIX} _CC"
50+ eval " BASE_CC =\$ ${RUST_ANDROID_PREFIX} _CC"
5151eval " AR=\$ ${RUST_ANDROID_PREFIX} _AR"
52+ eval " AS=\$ ${RUST_ANDROID_PREFIX} _AS"
5253eval " RANLIB=\$ ${RUST_ANDROID_PREFIX} _RANLIB"
54+ eval " LD=\$ ${RUST_ANDROID_PREFIX} _LD"
5355eval " STRIP=\$ ${RUST_ANDROID_PREFIX} _TOOLCHAIN_PREFIX/${NSS_TARGET} -strip"
56+ eval " TOOLCHAIN_BIN=\$ ${RUST_ANDROID_PREFIX} _TOOLCHAIN_PREFIX"
5457eval " CFLAGS=\$ ${RUST_ANDROID_PREFIX} _CFLAGS_${NSS_TARGET// -/ _} "
55- eval " LDFLAGS=\$ ${RUST_ANDROID_PREFIX} _LDFLAGS_${NSS_TARGET// -/ _} "
58+
59+ # Bake all compiler/linker flags into CC and CXX like build-nss-ios.sh does
60+ # This ensures ninja picks up the flags for both compilation and linking
61+ CC=" ${BASE_CC} ${CFLAGS} "
62+ CXX=" ${BASE_CC} ${CFLAGS} "
63+ export CC CXX
5664
5765# Build NSPR
5866NSPR_BUILD_DIR=$( mktemp -d)
5967pushd " ${NSPR_BUILD_DIR} "
60- " ${NSS_SRC_DIR} " /nspr/configure \
68+ if ! " ${NSS_SRC_DIR} " /nspr/configure \
6169 STRIP=" ${STRIP} " \
6270 RANLIB=" ${RANLIB} " \
6371 AR=" ${AR} " \
64- AS=" ${AS:- ${AR} } " \
65- LD=" ${LD:- ${AR} } " \
72+ AS=" ${AS} " \
73+ LD=" ${LD} " \
6674 CC=" ${CC} " \
6775 CCC=" ${CC} " \
68- CFLAGS=" ${CFLAGS} " \
69- LDFLAGS=" ${LDFLAGS} " \
7076 --target=" ${NSS_TARGET} " \
7177 --enable-64bit \
7278 --disable-debug \
73- --enable-optimize
79+ --enable-optimize; then
80+ echo " === NSPR configure failed, dumping config.log ==="
81+ cat config.log
82+ exit 1
83+ fi
7484make
7585popd
7686
7787# Build NSS using gyp
7888NSS_BUILD_DIR=$( mktemp -d)
7989rm -rf " ${NSS_SRC_DIR} /nss/out"
8090
81- gyp -f ninja " ${NSS_SRC_DIR} /nss/nss.gyp" \
91+ # Create a fake xcodebuild script and tool wrappers to allow gyp to use the mac flavor
92+ # This tricks gyp into thinking Xcode is installed so it generates macOS-style build rules
93+ FAKE_XCODE_DIR=$( mktemp -d)
94+ cat > " ${FAKE_XCODE_DIR} /xcodebuild" << 'EOF '
95+ #!/usr/bin/env bash
96+ # Fake xcodebuild that returns a version for gyp's mac flavor
97+ # Xcode 12.2 corresponds to macOS SDK 11.0 (Big Sur) and adds Apple Silicon support
98+ echo "Xcode 12.2"
99+ echo "Build version 12B45b"
100+ EOF
101+ chmod +x " ${FAKE_XCODE_DIR} /xcodebuild"
102+
103+ # Create unprefixed symlinks to cctools binaries that gyp's mac flavor expects
104+ # The mac flavor expects tools like 'otool', 'libtool', 'lipo' without the target prefix
105+ ln -s " ${TOOLCHAIN_BIN} /${NSS_TARGET} -otool" " ${FAKE_XCODE_DIR} /otool"
106+ ln -s " ${TOOLCHAIN_BIN} /${NSS_TARGET} -libtool" " ${FAKE_XCODE_DIR} /libtool"
107+ ln -s " ${TOOLCHAIN_BIN} /${NSS_TARGET} -lipo" " ${FAKE_XCODE_DIR} /lipo"
108+ ln -s " ${TOOLCHAIN_BIN} /${NSS_TARGET} -nm" " ${FAKE_XCODE_DIR} /nm"
109+
110+ export PATH=" ${FAKE_XCODE_DIR} :${PATH} "
111+
112+ # Work around Python3 bug in Ubuntu 22.04 gyp package
113+ GYP_WRAPPER=$( mktemp)
114+ cat > " ${GYP_WRAPPER} " << 'EOFGYP '
115+ #!/usr/bin/env python3
116+ import sys
117+ import gyp.xcode_emulation
118+
119+ # Monkey-patch GetStdoutQuiet to fix Python 3 bytes/str bug
120+ original_GetStdoutQuiet = gyp.xcode_emulation.GetStdoutQuiet
121+ def patched_GetStdoutQuiet(cmdlist):
122+ import subprocess
123+ job = subprocess.Popen(cmdlist, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
124+ out = job.communicate()[0]
125+ if job.returncode != 0:
126+ return None
127+ return out.rstrip(b'\n').decode('utf-8')
128+ gyp.xcode_emulation.GetStdoutQuiet = patched_GetStdoutQuiet
129+
130+ # Now run gyp normally
131+ import gyp
132+ sys.exit(gyp.script_main())
133+ EOFGYP
134+ chmod +x " ${GYP_WRAPPER} "
135+
136+ # Disable Apple-specific compiler flags that don't work with non-Apple clang
137+ # These environment variables are read by gyp's xcode_emulation.py
138+ export GCC_CW_ASM_SYNTAX=NO
139+ export GCC_ENABLE_PASCAL_STRINGS=NO
140+
141+ " ${GYP_WRAPPER} " -f ninja-mac " ${NSS_SRC_DIR} /nss/nss.gyp" \
82142 --depth " ${NSS_SRC_DIR} /nss/" \
83143 --generator-output=. \
84144 -DOS=mac \
@@ -97,6 +157,11 @@ gyp -f ninja "${NSS_SRC_DIR}/nss/nss.gyp" \
97157 -Dpython=python3
98158
99159GENERATED_DIR=" ${NSS_SRC_DIR} /nss/out/Release/"
160+ echo " === Dumping build.ninja for nss-macos-cross ==="
161+ cat " ${GENERATED_DIR} /build.ninja"
162+
163+ # With the mac flavor, we can build all targets including shared libraries
164+ # The generated ninja rules will use macOS-style linker flags (e.g., -install_name instead of -soname)
100165ninja -C " ${GENERATED_DIR} "
101166
102167# Assemble the DIST_DIR with relevant libraries and headers
@@ -112,3 +177,4 @@ ninja -C "${GENERATED_DIR}"
112177# Cleanup
113178rm -rf " ${NSS_BUILD_DIR} "
114179rm -rf " ${NSPR_BUILD_DIR} "
180+ rm -rf " ${FAKE_XCODE_DIR} "
0 commit comments