diff --git a/localPackages/Tor/Frameworks/build-minimal.sh b/localPackages/Tor/Frameworks/build-minimal.sh new file mode 100755 index 00000000..f19a2ac3 --- /dev/null +++ b/localPackages/Tor/Frameworks/build-minimal.sh @@ -0,0 +1,404 @@ +#!/bin/sh +# Minimal size-optimized build script for BitChat +# Builds arm64-only tor-nolzma.xcframework with aggressive size optimization + +set -e + +PATH=$PATH:/usr/local/bin:/usr/local/opt/gettext/bin:/usr/local/opt/automake/bin:/usr/local/opt/aclocal/bin:/opt/homebrew/bin:/opt/homebrew/opt/libtool/libexec/gnubin + +OPENSSL_VERSION="openssl-3.6.0" +LIBEVENT_VERSION="release-2.1.12-stable" +TOR_VERSION="tor-0.4.8.21" + +cd "$(dirname "$0")" +ROOT="$(pwd -P)" + +BUILDDIR="$ROOT/build" +mkdir -p "$BUILDDIR" + +echo "Build dir: $BUILDDIR" +echo "Building minimal tor-nolzma.xcframework (arm64-only, size-optimized)" +echo "" + +# Size optimization flags +# Note: LTO (-flto=thin) disabled because it produces bitcode that xcodebuild can't read +# LTO would need to be applied at app link stage, not library build +SIZE_CFLAGS="-Os -ffunction-sections -fdata-sections" + +build_libssl() { + SDK=$1 + ARCH=$2 + MIN=$3 + + SOURCE="$BUILDDIR/openssl" + LOG="$BUILDDIR/libssl-$SDK-$ARCH.log" + + if [ ! -d "$SOURCE" ]; then + echo "- Check out OpenSSL project" + cd "$BUILDDIR" + git clone --recursive --shallow-submodules --depth 1 --branch "$OPENSSL_VERSION" https://github.com/openssl/openssl.git >> "$LOG" 2>&1 + fi + + echo "- Build OpenSSL for $ARCH ($SDK) [size-optimized]" + + cd "$SOURCE" + make distclean >> "$LOG" 2>&1 || true + + if [ "$SDK" = "iphoneos" ]; then + PLATFORM_FLAGS="no-async zlib-dynamic enable-ec_nistp_64_gcc_128" + CONFIG="ios64-xcrun" + elif [ "$SDK" = "iphonesimulator" ]; then + PLATFORM_FLAGS="no-async zlib-dynamic enable-ec_nistp_64_gcc_128" + CONFIG="iossimulator-xcrun" + elif [ "$SDK" = "macosx" ]; then + PLATFORM_FLAGS="no-asm enable-ec_nistp_64_gcc_128" + CONFIG="darwin64-arm64-cc" + fi + + # Tier 2: Aggressive OpenSSL trimming - remove unused ciphers, hashes, and features + ./Configure \ + no-shared \ + no-zlib \ + no-comp \ + no-ssl3 \ + no-tls1 \ + no-tls1_1 \ + no-dtls \ + no-srp \ + no-psk \ + no-weak-ssl-ciphers \ + no-engine \ + no-ocsp \ + no-cms \ + no-ts \ + no-idea \ + no-seed \ + no-camellia \ + no-aria \ + no-bf \ + no-cast \ + no-des \ + no-rc2 \ + no-rc4 \ + no-md4 \ + no-mdc2 \ + no-whirlpool \ + no-rmd160 \ + no-sm2 \ + no-sm3 \ + no-sm4 \ + no-siphash \ + no-scrypt \ + no-legacy \ + no-dso \ + no-dgram \ + no-http \ + no-ml-dsa \ + no-ml-kem \ + no-slh-dsa \ + no-lms \ + no-cmp \ + no-ct \ + no-gost \ + no-rfc3779 \ + no-ec2m \ + no-rc5 \ + ${PLATFORM_FLAGS} \ + --prefix="$BUILDDIR/$SDK/libssl-$ARCH" \ + ${CONFIG} \ + CC="$(xcrun --sdk $SDK --find clang) -isysroot $(xcrun --sdk $SDK --show-sdk-path) -arch ${ARCH} -m$SDK-version-min=$MIN $SIZE_CFLAGS" \ + >> "$LOG" 2>&1 + + make depend >> "$LOG" 2>&1 + make "-j$(sysctl -n hw.logicalcpu_max)" build_libs >> "$LOG" 2>&1 + make install_dev >> "$LOG" 2>&1 +} + +build_libevent() { + SDK=$1 + ARCH=$2 + MIN=$3 + + SOURCE="$BUILDDIR/libevent" + LOG="$BUILDDIR/libevent-$SDK-$ARCH.log" + + if [ ! -d "$SOURCE" ]; then + echo "- Check out libevent project" + cd "$BUILDDIR" + git clone --recursive --shallow-submodules --depth 1 --branch "$LIBEVENT_VERSION" https://github.com/libevent/libevent.git >> "$LOG" 2>&1 + fi + + echo "- Build libevent for $ARCH ($SDK) [size-optimized]" + + cd "$SOURCE" + make distclean 2>/dev/null 1>/dev/null || true + + if [ ! -f ./configure ]; then + ./autogen.sh >> "$LOG" 2>&1 + fi + + CLANG="$(xcrun -f --sdk ${SDK} clang)" + SDKPATH="$(xcrun --sdk ${SDK} --show-sdk-path)" + DEST="$BUILDDIR/$SDK/libevent-$ARCH" + + ./configure \ + --disable-shared \ + --disable-openssl \ + --disable-libevent-regress \ + --disable-samples \ + --disable-doxygen-html \ + --enable-static \ + --disable-debug-mode \ + --prefix="$DEST" \ + CC="$CLANG -arch ${ARCH}" \ + CPP="$CLANG -E -arch ${ARCH}" \ + CFLAGS="-isysroot ${SDKPATH} -m$SDK-version-min=$MIN $SIZE_CFLAGS" \ + LDFLAGS="-isysroot ${SDKPATH} -L$DEST" \ + cross_compiling="yes" \ + ac_cv_func_clock_gettime="no" \ + >> "$LOG" 2>&1 + + make -j$(sysctl -n hw.logicalcpu_max) >> "$LOG" 2>&1 + make install >> "$LOG" 2>&1 +} + +build_libtor_nolzma() { + SDK=$1 + ARCH=$2 + MIN=$3 + + SOURCE="$BUILDDIR/tor" + LOG="$BUILDDIR/libtor-nolzma-$SDK-$ARCH.log" + DEST="$BUILDDIR/$SDK/libtor-nolzma-$ARCH" + + if [ ! -d "$SOURCE" ]; then + echo "- Check out Tor project" + cd "$BUILDDIR" + git clone --recursive --shallow-submodules --depth 1 --branch "$TOR_VERSION" https://gitlab.torproject.org/tpo/core/tor.git >> "$LOG" 2>&1 + fi + + echo "- Build libtor-nolzma for $ARCH ($SDK) [size-optimized, client-only]" + + cd "$SOURCE" + make distclean 2>/dev/null 1>/dev/null || true + + # Apply patch if exists + if [ -f "$ROOT/Tor/mmap-cache.patch" ]; then + git checkout . 2>/dev/null || true + git apply --quiet "$ROOT/Tor/mmap-cache.patch" 2>/dev/null || true + fi + + if [ ! -f ./configure ]; then + sed -i'.backup' -e 's/all,error/no-obsolete,error/' autogen.sh + ./autogen.sh >> "$LOG" 2>&1 + rm autogen.sh && mv autogen.sh.backup autogen.sh + fi + + CLANG="$(xcrun -f --sdk ${SDK} clang)" + SDKPATH="$(xcrun --sdk ${SDK} --show-sdk-path)" + + # Tier 1 + 2: Client-only, minimal Tor build with aggressive size optimization + ./configure \ + --enable-silent-rules \ + --enable-pic \ + --disable-module-relay \ + --disable-module-dirauth \ + --disable-module-pow \ + --disable-tool-name-check \ + --disable-unittests \ + --enable-static-openssl \ + --enable-static-libevent \ + --disable-asciidoc \ + --disable-system-torrc \ + --disable-linker-hardening \ + --disable-dependency-tracking \ + --disable-manpage \ + --disable-html-manual \ + --disable-gcc-warnings-advisory \ + --enable-lzma=no \ + --disable-zstd \ + --with-libevent-dir="$BUILDDIR/$SDK/libevent-$ARCH" \ + --with-openssl-dir="$BUILDDIR/$SDK/libssl-$ARCH" \ + --prefix="$DEST" \ + CC="$CLANG -arch ${ARCH} -isysroot ${SDKPATH}" \ + CPP="$CLANG -E -arch ${ARCH} -isysroot ${SDKPATH}" \ + CFLAGS="$SIZE_CFLAGS -m$SDK-version-min=$MIN" \ + CPPFLAGS="-Isrc/core -I$BUILDDIR/$SDK/libssl-$ARCH/include -I$BUILDDIR/$SDK/libevent-$ARCH/include -m$SDK-version-min=$MIN" \ + LDFLAGS="-lz -Wl,-dead_strip" \ + cross_compiling="yes" \ + ac_cv_func__NSGetEnviron="no" \ + ac_cv_func_clock_gettime="no" \ + ac_cv_func_getentropy="no" \ + >> "$LOG" 2>&1 + + sleep 2 + rm -f src/lib/cc/orconfig.h >> "$LOG" 2>&1 + cp orconfig.h "src/lib/cc/" >> "$LOG" 2>&1 + + make libtor.a -j$(sysctl -n hw.logicalcpu_max) V=1 >> "$LOG" 2>&1 + + mkdir -p "$DEST/lib" >> "$LOG" 2>&1 + mkdir -p "$DEST/include" >> "$LOG" 2>&1 + mv libtor.a "$DEST/lib" >> "$LOG" 2>&1 + rsync --archive --include='*.h' -f 'hide,! */' --prune-empty-dirs src/* "$DEST/include" >> "$LOG" 2>&1 + cp orconfig.h "$DEST/include/" >> "$LOG" 2>&1 + mv micro-revision.i "$DEST" >> "$LOG" 2>&1 +} + +create_framework_nolzma() { + SDK=$1 + + LOG="$BUILDDIR/framework.log" + NAME="tor-nolzma" + + rm -rf "$BUILDDIR/$SDK/$NAME.framework" >> "$LOG" 2>&1 + + echo "- Create framework for $SDK (arm64-only)" + + LIBS=("$BUILDDIR/$SDK/libssl-arm64/lib/libssl.a" \ + "$BUILDDIR/$SDK/libssl-arm64/lib/libcrypto.a" \ + "$BUILDDIR/$SDK/libevent-arm64/lib/libevent.a" \ + "$BUILDDIR/$SDK/libtor-nolzma-arm64/lib/libtor.a") + + HEADERS=("$BUILDDIR/$SDK/libssl-arm64/include"/* \ + "$BUILDDIR/$SDK/libevent-arm64/include"/* \ + "$BUILDDIR/$SDK/libtor-nolzma-arm64/include"/*) + + if [ "$SDK" = "macosx" ]; then + # macOS frameworks need versioned bundle structure + mkdir -p "$BUILDDIR/$SDK/$NAME.framework/Versions/A/Headers" >> "$LOG" 2>&1 + mkdir -p "$BUILDDIR/$SDK/$NAME.framework/Versions/A/Resources" >> "$LOG" 2>&1 + + libtool -static -o "$BUILDDIR/$SDK/$NAME.framework/Versions/A/$NAME" "${LIBS[@]}" >> "$LOG" 2>&1 + cp -r "${HEADERS[@]}" "$BUILDDIR/$SDK/$NAME.framework/Versions/A/Headers" >> "$LOG" 2>&1 + + # Create symlinks + cd "$BUILDDIR/$SDK/$NAME.framework" + ln -s A Versions/Current + ln -s Versions/Current/Headers Headers + ln -s Versions/Current/Resources Resources + ln -s Versions/Current/$NAME $NAME + + # Create Info.plist for macOS + cat > Versions/A/Resources/Info.plist << 'PLIST' + + + + + CFBundleExecutable + tor-nolzma + CFBundleIdentifier + org.torproject.tor-nolzma + CFBundleName + tor-nolzma + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.4.8.21 + CFBundleVersion + 408.21 + MinimumOSVersion + 10.13 + + +PLIST + cd "$ROOT" + else + # iOS frameworks are flat + mkdir -p "$BUILDDIR/$SDK/$NAME.framework/Headers" >> "$LOG" 2>&1 + libtool -static -o "$BUILDDIR/$SDK/$NAME.framework/$NAME" "${LIBS[@]}" >> "$LOG" 2>&1 + cp -r "${HEADERS[@]}" "$BUILDDIR/$SDK/$NAME.framework/Headers" >> "$LOG" 2>&1 + + # Determine min OS version for Info.plist + if [ "$SDK" = "iphoneos" ] || [ "$SDK" = "iphonesimulator" ]; then + MIN_OS="12.0" + else + MIN_OS="10.13" + fi + + # Create Info.plist for iOS + cat > "$BUILDDIR/$SDK/$NAME.framework/Info.plist" << PLIST + + + + + CFBundleExecutable + tor-nolzma + CFBundleIdentifier + org.torproject.tor-nolzma + CFBundleName + tor-nolzma + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.4.8.21 + CFBundleVersion + 408.21 + MinimumOSVersion + $MIN_OS + + +PLIST + fi +} + +create_xcframework_nolzma() { + LOG="$BUILDDIR/framework.log" + NAME="tor-nolzma" + + echo "- Create xcframework for $NAME (arm64-only)" + + rm -rf "$ROOT/$NAME.xcframework" "$ROOT/$NAME.xcframework.zip" >> "$LOG" 2>&1 + + xcodebuild -create-xcframework \ + -framework "$BUILDDIR/iphoneos/$NAME.framework" \ + -framework "$BUILDDIR/iphonesimulator/$NAME.framework" \ + -framework "$BUILDDIR/macosx/$NAME.framework" \ + -output "$ROOT/$NAME.xcframework" >> "$LOG" 2>&1 + + echo "" + echo "=== Build Complete ===" + echo "Output: $ROOT/$NAME.xcframework" + echo "" + + # Show sizes + echo "Binary sizes:" + ls -lh "$ROOT/$NAME.xcframework/ios-arm64/$NAME.framework/$NAME" 2>/dev/null || true + ls -lh "$ROOT/$NAME.xcframework/ios-arm64-simulator/$NAME.framework/$NAME" 2>/dev/null || true + ls -lh "$ROOT/$NAME.xcframework/macos-arm64/$NAME.framework/$NAME" 2>/dev/null || true + + echo "" + du -sh "$ROOT/$NAME.xcframework" +} + +# Build for iOS device (arm64) +echo "=== Building for iOS device (arm64) ===" +build_libssl iphoneos arm64 12.0 +build_libevent iphoneos arm64 12.0 +build_libtor_nolzma iphoneos arm64 12.0 +create_framework_nolzma iphoneos + +# Build for iOS simulator (arm64 only - no Intel) +echo "" +echo "=== Building for iOS simulator (arm64) ===" +build_libssl iphonesimulator arm64 12.0 +build_libevent iphonesimulator arm64 12.0 +build_libtor_nolzma iphonesimulator arm64 12.0 +create_framework_nolzma iphonesimulator + +# Build for macOS (arm64 only - no Intel) +echo "" +echo "=== Building for macOS (arm64) ===" +build_libssl macosx arm64 10.13 +build_libevent macosx arm64 10.13 +build_libtor_nolzma macosx arm64 10.13 +create_framework_nolzma macosx + +# Create xcframework +echo "" +echo "=== Creating XCFramework ===" +create_xcframework_nolzma + +echo "" +echo "Done! To verify:" +echo " lipo -info $ROOT/tor-nolzma.xcframework/*/tor-nolzma.framework/tor-nolzma"