From fe9dd1d0142c1307ba02e645cc2874d865dc0b2f Mon Sep 17 00:00:00 2001 From: Alex Korzh Date: Sun, 24 Apr 2022 17:32:21 +0400 Subject: [PATCH 01/13] Rename ios_compile to apple_compile since it could be used for macOS --- client/scripts/{ios_compile.sh => apple_compile.sh} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/scripts/{ios_compile.sh => apple_compile.sh} (100%) diff --git a/client/scripts/ios_compile.sh b/client/scripts/apple_compile.sh similarity index 100% rename from client/scripts/ios_compile.sh rename to client/scripts/apple_compile.sh From 4bfb52852612baadbba988b36482de32fa2430ce Mon Sep 17 00:00:00 2001 From: Alex Korzh Date: Sun, 24 Apr 2022 19:25:43 +0400 Subject: [PATCH 02/13] Kill prepare process if any of steps failed --- client/scripts/commons.sh | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/client/scripts/commons.sh b/client/scripts/commons.sh index 66472944..d46b7318 100644 --- a/client/scripts/commons.sh +++ b/client/scripts/commons.sh @@ -55,7 +55,11 @@ EOF compile_openvpn_adapter() { cd 3rd/OpenVPNAdapter - $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project OpenVPNAdapter.xcodeproj + if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project OpenVPNAdapter.xcodeproj ; then + print Y "OpenVPNAdapter built successfully" + else + killProcess "OpenVPNAdapter build failed" + fi cd ../../ } @@ -83,7 +87,11 @@ patch_ss() { } compile_ss_frameworks() { - $XCODEBUILD -scheme ShadowSocks -configuration Release -xcconfig ss_ios.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project ShadowSocks.xcodeproj + if $XCODEBUILD -scheme ShadowSocks -configuration Release -xcconfig ss_ios.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project ShadowSocks.xcodeproj ; then + print Y "ShadowSocks built successfully" + else + killProcess "ShadowSocks build failed" + fi cd ../../ } @@ -113,13 +121,21 @@ EOF compile_cocoa_async_socket() { cd 3rd/CocoaAsyncSocket - $XCODEBUILD -scheme 'iOS Framework' -configuration Release -xcconfig cas_ios.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project CocoaAsyncSocket.xcodeproj + if $XCODEBUILD -scheme 'iOS Framework' -configuration Release -xcconfig cas_ios.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project CocoaAsyncSocket.xcodeproj ; then + print Y "CocoaAsyncSocket built successfully" + else + killProcess "CocoaAsyncSocket build failed" + fi cd ../../ } compile_tun2socks() { cd 3rd/outline-go-tun2socks - GOOS=ios GOARCH=arm64 GOFLAGS="-tags=ios" CC=iphoneos-clang CXX=iphoneos-clang++ CGO_CFLAGS="-isysroot iphoneos -miphoneos-version-min=12.0 -fembed-bitcode -arch arm64" CGO_CXXFLAGS="-isysroot iphoneos -miphoneos-version-min=12.0 -fembed-bitcode -arch arm64" CGO_LDFLAGS="-isysroot iphoneos -miphoneos-version-min=12.0 -fembed-bitcode -arch arm64" CGO_ENABLED=1 DARWIN_SDK=iphoneos gomobile bind -a -ldflags="-w -s" -bundleid org.amnezia.tun2socks -target=ios/arm64 -tags ios -o ./build/ios/Tun2Socks.xcframework github.com/Jigsaw-Code/outline-go-tun2socks/outline/apple github.com/Jigsaw-Code/outline-go-tun2socks/outline/shadowsocks + if GOOS=ios GOARCH=arm64 GOFLAGS="-tags=ios" CC=iphoneos-clang CXX=iphoneos-clang++ CGO_CFLAGS="-isysroot iphoneos -miphoneos-version-min=12.0 -fembed-bitcode -arch arm64" CGO_CXXFLAGS="-isysroot iphoneos -miphoneos-version-min=12.0 -fembed-bitcode -arch arm64" CGO_LDFLAGS="-isysroot iphoneos -miphoneos-version-min=12.0 -fembed-bitcode -arch arm64" CGO_ENABLED=1 DARWIN_SDK=iphoneos gomobile bind -a -ldflags="-w -s" -bundleid org.amnezia.tun2socks -target=ios/arm64 -tags ios -o ./build/ios/Tun2Socks.xcframework github.com/Jigsaw-Code/outline-go-tun2socks/outline/apple github.com/Jigsaw-Code/outline-go-tun2socks/outline/shadowsocks ; then + print Y "Tun2Socks built successfully" + else + killProcess "Tun2Socks build failed" + fi cd ../../ } @@ -134,11 +150,15 @@ EOF compile_cocoalamberjack() { cd 3rd/CocoaLumberjack - $XCODEBUILD -scheme 'CocoaLumberjack' -configuration Release -xcconfig cl_ios.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project Lumberjack.xcodeproj + if $XCODEBUILD -scheme 'CocoaLumberjack' -configuration Release -xcconfig cl_ios.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project Lumberjack.xcodeproj ; then + print Y "CocoaLumberjack built successfully" + else + killProcess "CocoaLumberjack build failed" + fi cd ../../ } -die() { +killProcess() { if [[ "$1" ]]; then error "$1" else From 3a69107eaccf534effe5e8f4236a6940b16d3af0 Mon Sep 17 00:00:00 2001 From: Alex Korzh Date: Sun, 24 Apr 2022 19:37:56 +0400 Subject: [PATCH 03/13] Clean up apple compile script --- client/scripts/apple_compile.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/scripts/apple_compile.sh b/client/scripts/apple_compile.sh index 1783186f..ab7c3004 100755 --- a/client/scripts/apple_compile.sh +++ b/client/scripts/apple_compile.sh @@ -15,7 +15,7 @@ ADJUST="CONFIG-=adjust" helpFunction() { print G "Usage:" - print N "\t$0 [-d|--debug] [-n|--networkextension] [-a|--adjusttoken ]" + print N "\t$0 [-d|--debug] [-n|--networkextension] [-a|--adjusttoken ]" print N "" print N "By default, the project is compiled in release mode. Use -d or --debug for a debug build." print N "Use -n or --networkextension to force the network-extension component for MacOS too." @@ -189,7 +189,7 @@ elif [ "$OS" = "ios" ]; then ADJUST="CONFIG+=adjust" fi else - die "Why we are here?" + die "Why are we here?" fi VPNMODE= From 92d79ebeea78ac3d528d533706ba24e998fcf59e Mon Sep 17 00:00:00 2001 From: Alex Korzh Date: Sun, 24 Apr 2022 19:40:02 +0400 Subject: [PATCH 04/13] Clean up comments --- client/scripts/apple_compile.sh | 21 --------------------- client/scripts/commons.sh | 25 ------------------------- 2 files changed, 46 deletions(-) diff --git a/client/scripts/apple_compile.sh b/client/scripts/apple_compile.sh index ab7c3004..235c89c6 100755 --- a/client/scripts/apple_compile.sh +++ b/client/scripts/apple_compile.sh @@ -33,9 +33,6 @@ helpFunction() { print N "This script compiles AmneziaVPN for MacOS/iOS" print N "" -#export QT_IOS_BIN="$HOME/Qt/5.15.2/ios/bin" -#export PATH=$QT_IOS_BIN:$PATH - while [[ $# -gt 0 ]]; do key="$1" @@ -132,16 +129,7 @@ printn Y "Cleaning the existing project... " rm -rf AmneziaVPN.xcodeproj/ || die "Failed to remove things" print G "done." -#print Y "Importing translation files..." -#git submodule update --remote --depth 1 i18n || die "Failed to fetch newest translation files" -#python scripts/importLanguages.py $([[ "$OS" = "macos" ]] && echo "-m" || echo "") || die "Failed to import languages" -# -#print Y "Generating glean samples..." -#python scripts/generate_glean.py || die "Failed to generate glean samples" - printn Y "Extract the project version... " -#SHORTVERSION=$(cat version.pri | grep VERSION | grep defined | cut -d= -f2 | tr -d \ ) -#FULLVERSION=$(echo $SHORTVERSION | cut -d. -f1).$(date +"%Y%m%d%H%M") SHORTVERSION=$(cat version.pri | grep VERSION | grep defined | cut -d= -f2 | tr -d \ ) FULLVERSION=$(cat versionfull.pri | grep BUILDVERSION | grep defined | cut -d= -f2 | tr -d \ ) print G "$SHORTVERSION - $FULLVERSION" @@ -249,15 +237,6 @@ else print Y "No Tun2Socks will be built" fi -#if [ "$OS" = "ios" ]; then -# print Y "Prepare to build CocoaLamberjack..." -# prepare_to_build_cl -# print Y "Building CocoaLamberjack Framework..." -# compile_cocoalamberjack -#else -# print Y "No CocoaLamberjack will be built" -#fi - print Y "Creating the xcode project via qmake..." $QMAKE \ VERSION=$SHORTVERSION \ diff --git a/client/scripts/commons.sh b/client/scripts/commons.sh index d46b7318..040fd10e 100644 --- a/client/scripts/commons.sh +++ b/client/scripts/commons.sh @@ -74,16 +74,6 @@ EOF patch_ss() { cd 3rd/ShadowSocks - -# $PATCH -p1 -N --dry-run --silent < ../../scripts/ss_patch.diff 2>/dev/null - #If the patch has not been applied then the $? which is the exit status - #for last command would have a success status code = 0 -# if [ $? -eq 0 ]; -# then -# #apply the patch -# $PATCH -p1 < ../../scripts/ss_patch.diff -# fi - } compile_ss_frameworks() { @@ -95,21 +85,6 @@ compile_ss_frameworks() { cd ../../ } -#prepare_to_build_pp() { -# cat $WORKINGDIR/scripts/pp_ios.xcconfig > $WORKINGDIR/3rd/PacketProcessor/pp_ios.xcconfig -# cat << EOF >> $WORKINGDIR/3rd/PacketProcessor/pp_ios.xcconfig -#PROJECT_TEMP_DIR = $WORKINGDIR/3rd/PacketProcessor/build/OpenVPNAdapter.build -#CONFIGURATION_BUILD_DIR = $WORKINGDIR/3rd/PacketProcessor/build/Release-iphoneos -#BUILT_PRODUCTS_DIR = $WORKINGDIR/3rd/PacketProcessor/build/Release-iphoneos -#EOF -#} -# -#compile_packet_processor() { -# cd 3rd/PacketProcessor -# $XCODEBUILD -scheme PacketProcessor -configuration Release -xcconfig pp_ios.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project PacketProcessor.xcodeproj -# cd ../../ -#} - prepare_to_build_cas() { cat $WORKINGDIR/scripts/cas_ios.xcconfig > $WORKINGDIR/3rd/CocoaAsyncSocket/cas_ios.xcconfig cat << EOF >> $WORKINGDIR/3rd/CocoaAsyncSocket/cas_ios.xcconfig From ba1efd57a585bdb05ce47752a45270e56facac67 Mon Sep 17 00:00:00 2001 From: Alex Korzh Date: Thu, 28 Apr 2022 14:05:14 +0400 Subject: [PATCH 05/13] Create and use version file from WireGuardKitGo on iOS for consistency --- client/scripts/apple_compile.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/client/scripts/apple_compile.sh b/client/scripts/apple_compile.sh index 235c89c6..b1297378 100755 --- a/client/scripts/apple_compile.sh +++ b/client/scripts/apple_compile.sh @@ -12,6 +12,7 @@ OS= NETWORKEXTENSION= ADJUST_SDK_TOKEN= ADJUST="CONFIG-=adjust" +WORKINGDIR=`pwd` helpFunction() { print G "Usage:" @@ -121,8 +122,19 @@ fi $QMAKE -v &>/dev/null || die "qmake doesn't exist or it fails" -printn Y "Retrieve the wireguard-go version... " -(cd macos/gobridge && go list -m golang.zx2c4.com/wireguard | sed -n 's/.*v\([0-9.]*\).*/#define WIREGUARD_GO_VERSION "\1"/p') > macos/gobridge/wireguard-go-version.h +print Y "Retrieve the wireguard-go version... " +if [ "$OS" = "macos" ]; then + (cd macos/gobridge && go list -m golang.zx2c4.com/wireguard | sed -n 's/.*v\([0-9.]*\).*/#define WIREGUARD_GO_VERSION "\1"/p') > macos/gobridge/wireguard-go-version.h +elif [ "$OS" = "ios" ]; then + if [ ! -f 3rd/wireguard-apple/Sources/WireGuardKitGo/wireguard-go-version.h ]; then + print Y "Creating wireguard-go-version.h file" + touch 3rd/wireguard-apple/Sources/WireGuardKitGo/wireguard-go-version.h + cat <> $WORKINGDIR/3rd/wireguard-apple/Sources/WireGuardKitGo/wireguard-go-version.h +#define WIREGUARD_GO_VERSION "0.0.0" +EOF + fi + (cd 3rd/wireguard-apple/Sources/WireGuardKitGo && go list -m golang.zx2c4.com/wireguard | sed -n 's/.*v\([0-9.]*\).*/#define WIREGUARD_GO_VERSION "\1"/p') > 3rd/wireguard-apple/Sources/WireGuardKitGo/wireguard-go-version.h +fi print G "done." printn Y "Cleaning the existing project... " From 0cc8feac57f357fe48f9443e9137b864477d7d02 Mon Sep 17 00:00:00 2001 From: Alex Korzh Date: Thu, 28 Apr 2022 14:05:30 +0400 Subject: [PATCH 06/13] Improve Tun2Socks error message --- client/scripts/commons.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/scripts/commons.sh b/client/scripts/commons.sh index 040fd10e..35cec027 100644 --- a/client/scripts/commons.sh +++ b/client/scripts/commons.sh @@ -109,6 +109,8 @@ compile_tun2socks() { if GOOS=ios GOARCH=arm64 GOFLAGS="-tags=ios" CC=iphoneos-clang CXX=iphoneos-clang++ CGO_CFLAGS="-isysroot iphoneos -miphoneos-version-min=12.0 -fembed-bitcode -arch arm64" CGO_CXXFLAGS="-isysroot iphoneos -miphoneos-version-min=12.0 -fembed-bitcode -arch arm64" CGO_LDFLAGS="-isysroot iphoneos -miphoneos-version-min=12.0 -fembed-bitcode -arch arm64" CGO_ENABLED=1 DARWIN_SDK=iphoneos gomobile bind -a -ldflags="-w -s" -bundleid org.amnezia.tun2socks -target=ios/arm64 -tags ios -o ./build/ios/Tun2Socks.xcframework github.com/Jigsaw-Code/outline-go-tun2socks/outline/apple github.com/Jigsaw-Code/outline-go-tun2socks/outline/shadowsocks ; then print Y "Tun2Socks built successfully" else + print "Please check that path to bin folder with gomobile is in your PATH" + print "Usually it's in GOPATH/bin, e.g. /usr/local/go/bin" killProcess "Tun2Socks build failed" fi cd ../../ From 58b1c4b511c4ead7ef5028dda92cd0548312468e Mon Sep 17 00:00:00 2001 From: Alex Korzh Date: Thu, 28 Apr 2022 14:08:28 +0400 Subject: [PATCH 07/13] Update xcode patcher to use WireGuardKitGo folder for iOS project --- client/scripts/xcode_patcher.rb | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/client/scripts/xcode_patcher.rb b/client/scripts/xcode_patcher.rb index 4f38f3e7..3e4c0795 100644 --- a/client/scripts/xcode_patcher.rb +++ b/client/scripts/xcode_patcher.rb @@ -29,7 +29,7 @@ class XCodeprojPatcher if networkExtension setup_target_extension shortVersion, fullVersion, platform, configHash - setup_target_gobridge + setup_target_gobridge platform else setup_target_wireguardgo setup_target_wireguardtools @@ -137,8 +137,10 @@ class XCodeprojPatcher # WireGuard group group = @project.main_group.new_group('WireGuard') + version_file_path = platform == 'ios' ? '3rd/wireguard-apple/Sources/WireGuardKitGo/wireguard-go-version.h' : 'macos/gobridge/wireguard-go-version.h' + [ - 'macos/gobridge/wireguard-go-version.h', + version_file_path, '3rd/wireguard-apple/Sources/Shared/Keychain.swift', '3rd/wireguard-apple/Sources/WireGuardKit/IPAddressRange.swift', '3rd/wireguard-apple/Sources/WireGuardKit/InterfaceConfiguration.swift', @@ -450,15 +452,17 @@ class XCodeprojPatcher appex_file.settings = { "ATTRIBUTES" => ['RemoveHeadersOnCopy'] } end - def setup_target_gobridge + def setup_target_gobridge(platform) target_gobridge = legacy_target = @project.new(Xcodeproj::Project::PBXLegacyTarget) - target_gobridge.build_working_directory = 'macos/gobridge' + bridge_platofrm = platform == 'ios' ? 'iOS' : 'macOS' + + target_gobridge.build_working_directory = platform == 'ios' ? '3rd/wireguard-apple/Sources/WireGuardKitGo' : 'macos/gobridge' target_gobridge.build_tool_path = 'make' target_gobridge.pass_build_settings_in_environment = '1' target_gobridge.build_arguments_string = '$(ACTION)' - target_gobridge.name = 'WireGuardGoBridge' - target_gobridge.product_name = 'WireGuardGoBridge' + target_gobridge.name = "WireGuardGoBridge<#{bridge_platofrm}>" + target_gobridge.product_name = "WireGuardGoBridge<#{bridge_platofrm}>" @project.targets << target_gobridge @target_extension.add_dependency target_gobridge From 0fadf035db818306fd4c62f79ac2511e187edf1c Mon Sep 17 00:00:00 2001 From: Alex Korzh Date: Thu, 28 Apr 2022 14:55:58 +0400 Subject: [PATCH 08/13] Add potential go PATH to config build settings --- client/scripts/xcode_patcher.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/scripts/xcode_patcher.rb b/client/scripts/xcode_patcher.rb index 3e4c0795..13fcd3d7 100644 --- a/client/scripts/xcode_patcher.rb +++ b/client/scripts/xcode_patcher.rb @@ -104,6 +104,7 @@ class XCodeprojPatcher config.build_settings['ENABLE_BITCODE'] ||= 'NO' if platform == 'ios' config.build_settings['SDKROOT'] = 'iphoneos' if platform == 'ios' config.build_settings['SWIFT_PRECOMPILE_BRIDGING_HEADER'] = 'NO' if platform == 'ios' + config.build_settings['PATH'] = '${PATH}:/usr/local/go/bin:/usr/local/bin:/opt/homebrew/bin' groupId = ""; if (platform == 'macos') @@ -320,6 +321,7 @@ class XCodeprojPatcher "-framework", "OpenGLES", ] + config.build_settings['PATH'] = '${PATH}:/usr/local/go/bin:/usr/local/bin:/opt/homebrew/bin' end groupId = ""; From 1fdcf3877e4d2c78e168638212357d075e86c978 Mon Sep 17 00:00:00 2001 From: Alex Korzh Date: Thu, 28 Apr 2022 14:56:19 +0400 Subject: [PATCH 09/13] Remove unused xcode_patcher --- client/ios/xcode_patcher.rb | 598 ------------------------------------ 1 file changed, 598 deletions(-) delete mode 100644 client/ios/xcode_patcher.rb diff --git a/client/ios/xcode_patcher.rb b/client/ios/xcode_patcher.rb deleted file mode 100644 index b44b0b56..00000000 --- a/client/ios/xcode_patcher.rb +++ /dev/null @@ -1,598 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -require 'xcodeproj' - -class XCodeprojPatcher - attr :project - attr :p_root - attr :target_main - attr :target_extension - -# @@project_root -# def self.project_root -# @@project_root -# end - - def run(project_root, file, shortVersion, fullVersion, platform, networkExtension, webExtension, configHash, adjust_sdk_token) - @p_root = project_root - open_project file - open_target_main - - die 'IOS requires networkExtension mode' if not networkExtension and platform == 'ios' - - group = @project.main_group.new_group('Configuration') - @configFile = group.new_file('ios/xcode.xconfig') - - setup_target_main shortVersion, fullVersion, platform, networkExtension, configHash, adjust_sdk_token - - if platform == 'macos' - setup_target_loginitem shortVersion, fullVersion, configHash - setup_target_nativemessaging shortVersion, fullVersion, configHash if webExtension - end - - if networkExtension - setup_target_extension shortVersion, fullVersion, platform, configHash - setup_target_gobridge - else - setup_target_wireguardgo - setup_target_wireguardtools - end - - setup_target_balrog if platform == 'macos' - - @project.save - end - - def open_project(file) - @project = Xcodeproj::Project.open(file) - puts 'Failed to open the project file: ' + file if @project.nil? - die 'Failed to open the project file: ' + file if @project.nil? - end - - def open_target_main - @target_main = @project.targets.find { |target| target.to_s == 'AmneziaVPN' } - return @target_main if not @target_main.nil? - - puts 'Unable to open AmneziaVPN target' - die 'Unable to open AmneziaVPN target' - end - - def setup_target_main(shortVersion, fullVersion, platform, networkExtension, configHash, adjust_sdk_token) - @target_main.build_configurations.each do |config| - config.base_configuration_reference = @configFile - - config.build_settings['LD_RUNPATH_SEARCH_PATHS'] ||= '"$(inherited) @executable_path/../Frameworks"' - config.build_settings['SWIFT_VERSION'] ||= '5.0' - config.build_settings['CLANG_ENABLE_MODULES'] ||= 'YES' - config.build_settings['SWIFT_OBJC_BRIDGING_HEADER'] ||= p_root + "/" + 'macos/app/WireGuard-Bridging-Header.h' - config.build_settings['FRAMEWORK_SEARCH_PATHS'] ||= [ - "$(inherited)", - "$(PROJECT_DIR)/3rd" - ] - - # Versions and names - config.build_settings['MARKETING_VERSION'] ||= shortVersion - config.build_settings['CURRENT_PROJECT_VERSION'] ||= fullVersion - config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = configHash['APP_ID_MACOS'] if platform == 'macos' - config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = configHash['APP_ID_IOS'] if platform == 'ios' - config.build_settings['PRODUCT_NAME'] = 'Mozilla VPN' - - # other config - config.build_settings['INFOPLIST_FILE'] ||= p_root + "/" + platform + '/app/Info.plist' - if platform == 'ios' - config.build_settings['CODE_SIGN_ENTITLEMENTS'] ||= p_root + "/" + 'ios/app/main.entitlements' - if adjust_sdk_token != "" - config.build_settings['ADJUST_SDK_TOKEN'] = adjust_sdk_token - end - elsif networkExtension - config.build_settings['CODE_SIGN_ENTITLEMENTS'] ||= p_root + "/" + 'macos/app/app.entitlements' - else - config.build_settings['CODE_SIGN_ENTITLEMENTS'] ||= p_root + "/" + 'macos/app/daemon.entitlements' - end - - config.build_settings['CODE_SIGN_IDENTITY'] ||= 'Apple Development' - config.build_settings['ENABLE_BITCODE'] ||= 'NO' if platform == 'ios' - config.build_settings['SDKROOT'] = 'iphoneos' if platform == 'ios' - config.build_settings['SWIFT_PRECOMPILE_BRIDGING_HEADER'] = 'NO' if platform == 'ios' - - groupId = ""; - if (platform == 'macos') - groupId = configHash['DEVELOPMENT_TEAM'] + "." + configHash['GROUP_ID_MACOS'] - config.build_settings['APP_ID_MACOS'] ||= configHash['APP_ID_MACOS'] - else - groupId = configHash['GROUP_ID_IOS'] - config.build_settings['GROUP_ID_IOS'] ||= configHash['GROUP_ID_IOS'] - end - - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ - 'GROUP_ID=\"' + groupId + '\"', - "VPN_NE_BUNDLEID=\\\"" + (platform == 'macos' ? configHash['NETEXT_ID_MACOS'] : configHash['NETEXT_ID_IOS']) + "\\\"", - ] - - if config.name == 'Release' - config.build_settings['SWIFT_OPTIMIZATION_LEVEL'] ||= '-Onone' - end - end - - if networkExtension - # WireGuard group - group = @project.main_group.new_group('WireGuard') - - [ - 'macos/gobridge/wireguard-go-version.h', - '3rd/wireguard-apple/Sources/Shared/Keychain.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/IPAddressRange.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/InterfaceConfiguration.swift', - '3rd/wireguard-apple/Sources/Shared/Model/NETunnelProviderProtocol+Extension.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/TunnelConfiguration.swift', - '3rd/wireguard-apple/Sources/Shared/Model/TunnelConfiguration+WgQuickConfig.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/Endpoint.swift', - '3rd/wireguard-apple/Sources/Shared/Model/String+ArrayConversion.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/PeerConfiguration.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/DNSServer.swift', - '3rd/wireguard-apple/Sources/WireGuardApp/LocalizationHelper.swift', - '3rd/wireguard-apple/Sources/Shared/FileManager+Extension.swift', - '3rd/wireguard-apple/Sources/WireGuardKitC/x25519.c', - '3rd/wireguard-apple/Sources/WireGuardKit/PrivateKey.swift', - ].each { |filename| - file = group.new_file(p_root + "/" + filename) - @target_main.add_file_references([file]) - } - - # @target_main + swift integration - group = @project.main_group.new_group('SwiftIntegration') - - [ - 'platforms/ios/ioscontroller.swift', - 'platforms/ios/ioslogger.swift', - ].each { |filename| - file = group.new_file(p_root + "/" + filename) - @target_main.add_file_references([file]) - } - end - - if (platform == 'ios' && adjust_sdk_token != "") - frameworks_group = @project.groups.find { |group| group.display_name == 'Frameworks' } - frameworks_build_phase = @target_main.build_phases.find { |build_phase| build_phase.to_s == 'FrameworksBuildPhase' } - embed_frameworks_build_phase = @target_main.build_phases.find { |build_phase| build_phase.to_s == 'Embed Frameworks' } - - framework_ref = frameworks_group.new_file('3rd/AdjustSdk.framework') - frameworks_build_phase.add_file_reference(framework_ref) - - framework_file = embed_frameworks_build_phase.add_file_reference(framework_ref) - framework_file.settings = { "ATTRIBUTES" => ['RemoveHeadersOnCopy', 'CodeSignOnCopy'] } - - framework_ref = frameworks_group.new_file('AdServices.framework') - frameworks_build_phase.add_file_reference(framework_ref) - - framework_ref = frameworks_group.new_file('iAd.framework') - frameworks_build_phase.add_file_reference(framework_ref) - end - end - - def setup_target_extension(shortVersion, fullVersion, platform, configHash) - @target_extension = @project.new_target(:app_extension, 'WireGuardNetworkExtension', platform == 'macos' ? :osx : :ios) - - @target_extension.build_configurations.each do |config| - config.base_configuration_reference = @configFile - - config.build_settings['LD_RUNPATH_SEARCH_PATHS'] ||= '"$(inherited) @executable_path/../Frameworks"' - config.build_settings['SWIFT_VERSION'] ||= '5.0' - config.build_settings['CLANG_ENABLE_MODULES'] ||= 'YES' - config.build_settings['SWIFT_OBJC_BRIDGING_HEADER'] ||= p_root + "/" + 'macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h' - config.build_settings['SWIFT_PRECOMPILE_BRIDGING_HEADER'] = 'NO' - - # Versions and names - config.build_settings['MARKETING_VERSION'] ||= shortVersion - config.build_settings['CURRENT_PROJECT_VERSION'] ||= fullVersion - config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] ||= configHash['NETEXT_ID_MACOS'] if platform == 'macos' - config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] ||= configHash['NETEXT_ID_IOS'] if platform == 'ios' - config.build_settings['PRODUCT_NAME'] = 'WireGuardNetworkExtension' - - # other configs - config.build_settings['INFOPLIST_FILE'] ||= p_root + "/" + 'macos/networkextension/Info.plist' - config.build_settings['CODE_SIGN_ENTITLEMENTS'] ||= p_root + "/" + platform + '/networkextension/AmneziaVPNNetworkExtension.entitlements' - config.build_settings['CODE_SIGN_IDENTITY'] = 'Apple Development' - - if platform == 'ios' - config.build_settings['ENABLE_BITCODE'] ||= 'NO' - config.build_settings['SDKROOT'] = 'iphoneos' - - config.build_settings['OTHER_LDFLAGS'] ||= [ - "-stdlib=libc++", - "-Wl,-rpath,@executable_path/Frameworks", - "-framework", - "AssetsLibrary", - "-framework", - "MobileCoreServices", - "-lm", - "-framework", - "UIKit", - "-lz", - "-framework", - "OpenGLES", - ] - end - - groupId = ""; - if (platform == 'macos') - groupId = configHash['DEVELOPMENT_TEAM'] + "." + configHash['GROUP_ID_MACOS'] - else - groupId = configHash['GROUP_ID_IOS'] - end - - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ - # This is needed to compile the iosglue without Qt. - 'NETWORK_EXTENSION=1', - 'GROUP_ID=\"' + groupId + '\"', - ] - - if config.name == 'Release' - config.build_settings['SWIFT_OPTIMIZATION_LEVEL'] ||= '-Onone' - end - - end - - group = @project.main_group.new_group('WireGuardExtension') - [ - '3rd/wireguard-apple/Sources/WireGuardKit/WireGuardAdapter.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/PacketTunnelSettingsGenerator.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/DNSResolver.swift', - '3rd/wireguard-apple/Sources/WireGuardNetworkExtension/ErrorNotifier.swift', - '3rd/wireguard-apple/Sources/Shared/Keychain.swift', - '3rd/wireguard-apple/Sources/Shared/Model/TunnelConfiguration+WgQuickConfig.swift', - '3rd/wireguard-apple/Sources/Shared/Model/NETunnelProviderProtocol+Extension.swift', - '3rd/wireguard-apple/Sources/Shared/Model/String+ArrayConversion.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/TunnelConfiguration.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/IPAddressRange.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/Endpoint.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/DNSServer.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/InterfaceConfiguration.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/PeerConfiguration.swift', - '3rd/wireguard-apple/Sources/Shared/FileManager+Extension.swift', - '3rd/wireguard-apple/Sources/WireGuardKitC/x25519.c', - '3rd/wireguard-apple/Sources/WireGuardKit/Array+ConcurrentMap.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/IPAddress+AddrInfo.swift', - '3rd/wireguard-apple/Sources/WireGuardKit/PrivateKey.swift', - ].each { |filename| - file = group.new_file(p_root + "/" + filename) - @target_extension.add_file_references([file]) - } - # @target_extension + swift integration - group = @project.main_group.new_group('SwiftIntegration') - - [ - 'platforms/ios/iostunnel.swift', - 'platforms/ios/iosglue.mm', - 'platforms/ios/ioslogger.swift', - ].each { |filename| - file = group.new_file(p_root + "/" + filename) - @target_extension.add_file_references([file]) - } - - frameworks_group = @project.groups.find { |group| group.display_name == 'Frameworks' } - frameworks_build_phase = @target_extension.build_phases.find { |build_phase| build_phase.to_s == 'FrameworksBuildPhase' } - - frameworks_build_phase.clear - - framework_ref = frameworks_group.new_file('libwg-go.a') - frameworks_build_phase.add_file_reference(framework_ref) - - framework_ref = frameworks_group.new_file('NetworkExtension.framework') - frameworks_build_phase.add_file_reference(framework_ref) - - # This fails: @target_main.add_dependency @target_extension - container_proxy = @project.new(Xcodeproj::Project::PBXContainerItemProxy) - container_proxy.container_portal = @project.root_object.uuid - container_proxy.proxy_type = Xcodeproj::Constants::PROXY_TYPES[:native_target] - container_proxy.remote_global_id_string = @target_extension.uuid - container_proxy.remote_info = @target_extension.name - - dependency = @project.new(Xcodeproj::Project::PBXTargetDependency) - dependency.name = @target_extension.name - dependency.target = @target_main - dependency.target_proxy = container_proxy - - @target_main.dependencies << dependency - - copy_appex = @target_main.new_copy_files_build_phase - copy_appex.name = 'Copy Network-Extension plugin' - copy_appex.symbol_dst_subfolder_spec = :plug_ins - - appex_file = copy_appex.add_file_reference @target_extension.product_reference - appex_file.settings = { "ATTRIBUTES" => ['RemoveHeadersOnCopy'] } - end - - def setup_target_gobridge - target_gobridge = legacy_target = @project.new(Xcodeproj::Project::PBXLegacyTarget) - - target_gobridge.build_working_directory = p_root + "/" + 'macos/gobridge' - target_gobridge.build_tool_path = 'make' - target_gobridge.pass_build_settings_in_environment = '1' - target_gobridge.build_arguments_string = '$(ACTION)' - target_gobridge.name = 'WireGuardGoBridge' - target_gobridge.product_name = 'WireGuardGoBridge' - - @project.targets << target_gobridge - @target_extension.add_dependency target_gobridge - end - - def setup_target_balrog - target_balrog = legacy_target = @project.new(Xcodeproj::Project::PBXLegacyTarget) - - target_balrog.build_working_directory = p_root + "/" + 'balrog' - target_balrog.build_tool_path = 'make' - target_balrog.pass_build_settings_in_environment = '1' - target_balrog.build_arguments_string = '$(ACTION)' - target_balrog.name = 'WireGuardBalrog' - target_balrog.product_name = 'WireGuardBalrog' - - @project.targets << target_balrog - - frameworks_group = @project.groups.find { |group| group.display_name == 'Frameworks' } - frameworks_build_phase = @target_main.build_phases.find { |build_phase| build_phase.to_s == 'FrameworksBuildPhase' } - - framework_ref = frameworks_group.new_file('balrog/balrog.a') - frameworks_build_phase.add_file_reference(framework_ref) - - # This fails: @target_main.add_dependency target_balrog - container_proxy = @project.new(Xcodeproj::Project::PBXContainerItemProxy) - container_proxy.container_portal = @project.root_object.uuid - container_proxy.proxy_type = Xcodeproj::Constants::PROXY_TYPES[:native_target] - container_proxy.remote_global_id_string = target_balrog.uuid - container_proxy.remote_info = target_balrog.name - - dependency = @project.new(Xcodeproj::Project::PBXTargetDependency) - dependency.name = target_balrog.name - dependency.target = @target_main - dependency.target_proxy = container_proxy - - @target_main.dependencies << dependency - end - - def setup_target_wireguardtools - target_wireguardtools = legacy_target = @project.new(Xcodeproj::Project::PBXLegacyTarget) - - target_wireguardtools.build_working_directory = p_root + "/" + '3rd/wireguard-tools/src' - target_wireguardtools.build_tool_path = 'make' - target_wireguardtools.pass_build_settings_in_environment = '1' - target_wireguardtools.build_arguments_string = '$(ACTION)' - target_wireguardtools.name = 'WireGuardTools' - target_wireguardtools.product_name = 'WireGuardTools' - - @project.targets << target_wireguardtools - - # This fails: @target_main.add_dependency target_wireguardtools - container_proxy = @project.new(Xcodeproj::Project::PBXContainerItemProxy) - container_proxy.container_portal = @project.root_object.uuid - container_proxy.proxy_type = Xcodeproj::Constants::PROXY_TYPES[:native_target] - container_proxy.remote_global_id_string = target_wireguardtools.uuid - container_proxy.remote_info = target_wireguardtools.name - - dependency = @project.new(Xcodeproj::Project::PBXTargetDependency) - dependency.name = target_wireguardtools.name - dependency.target = @target_main - dependency.target_proxy = container_proxy - - @target_main.dependencies << dependency - - copy_wireguardTools = @target_main.new_copy_files_build_phase - copy_wireguardTools.name = 'Copy wireguard-tools' - copy_wireguardTools.symbol_dst_subfolder_spec = :wrapper - copy_wireguardTools.dst_path = 'Contents/Resources/utils' - - group = @project.main_group.new_group('WireGuardTools') - file = group.new_file '3rd/wireguard-tools/src/wg' - - wireguardTools_file = copy_wireguardTools.add_file_reference file - wireguardTools_file.settings = { "ATTRIBUTES" => ['RemoveHeadersOnCopy'] } - end - - def setup_target_wireguardgo - target_wireguardgo = legacy_target = @project.new(Xcodeproj::Project::PBXLegacyTarget) - - target_wireguardgo.build_working_directory = p_root + "/" + '3rd/wireguard-go' - target_wireguardgo.build_tool_path = 'make' - target_wireguardgo.pass_build_settings_in_environment = '1' - target_wireguardgo.build_arguments_string = '$(ACTION)' - target_wireguardgo.name = 'WireGuardGo' - target_wireguardgo.product_name = 'WireGuardGo' - - @project.targets << target_wireguardgo - - # This fails: @target_main.add_dependency target_wireguardgo - container_proxy = @project.new(Xcodeproj::Project::PBXContainerItemProxy) - container_proxy.container_portal = @project.root_object.uuid - container_proxy.proxy_type = Xcodeproj::Constants::PROXY_TYPES[:native_target] - container_proxy.remote_global_id_string = target_wireguardgo.uuid - container_proxy.remote_info = target_wireguardgo.name - - dependency = @project.new(Xcodeproj::Project::PBXTargetDependency) - dependency.name = target_wireguardgo.name - dependency.target = @target_main - dependency.target_proxy = container_proxy - - @target_main.dependencies << dependency - - copy_wireguardGo = @target_main.new_copy_files_build_phase - copy_wireguardGo.name = 'Copy wireguard-go' - copy_wireguardGo.symbol_dst_subfolder_spec = :wrapper - copy_wireguardGo.dst_path = 'Contents/Resources/utils' - - group = @project.main_group.new_group('WireGuardGo') - file = group.new_file '3rd/wireguard-go/wireguard-go' - - wireguardGo_file = copy_wireguardGo.add_file_reference file - wireguardGo_file.settings = { "ATTRIBUTES" => ['RemoveHeadersOnCopy'] } - end - - def setup_target_loginitem(shortVersion, fullVersion, configHash) - return - @target_loginitem = @project.new_target(:application, 'AmneziaVPNLoginItem', :osx) - - @target_loginitem.build_configurations.each do |config| - config.base_configuration_reference = @configFile - - config.build_settings['LD_RUNPATH_SEARCH_PATHS'] ||= '"$(inherited) @executable_path/../Frameworks"' - - # Versions and names - config.build_settings['MARKETING_VERSION'] ||= shortVersion - config.build_settings['CURRENT_PROJECT_VERSION'] ||= fullVersion - config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] ||= configHash['LOGIN_ID_MACOS'] - config.build_settings['PRODUCT_NAME'] = 'AmneziaVPNLoginItem' - - # other configs - config.build_settings['INFOPLIST_FILE'] ||= 'macos/loginitem/Info.plist' - config.build_settings['CODE_SIGN_ENTITLEMENTS'] ||= p_root + "/" + 'macos/loginitem/AmneziaVPNLoginItem.entitlements' - config.build_settings['CODE_SIGN_IDENTITY'] = 'Apple Development' - config.build_settings['SKIP_INSTALL'] = 'YES' - - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ - 'APP_ID=\"' + configHash['APP_ID_MACOS'] + '\"', - ] - - if config.name == 'Release' - config.build_settings['SWIFT_OPTIMIZATION_LEVEL'] ||= '-Onone' - end - end - - group = @project.main_group.new_group('LoginItem') - [ - 'macos/loginitem/main.m', - ].each { |filename| - file = group.new_file(filename) - @target_loginitem.add_file_references([file]) - } - - # This fails: @target_main.add_dependency @target_loginitem - container_proxy = @project.new(Xcodeproj::Project::PBXContainerItemProxy) - container_proxy.container_portal = @project.root_object.uuid - container_proxy.proxy_type = Xcodeproj::Constants::PROXY_TYPES[:native_target] - container_proxy.remote_global_id_string = @target_loginitem.uuid - container_proxy.remote_info = @target_loginitem.name - - dependency = @project.new(Xcodeproj::Project::PBXTargetDependency) - dependency.name = @target_loginitem.name - dependency.target = @target_main - dependency.target_proxy = container_proxy - - @target_main.dependencies << dependency - - copy_app = @target_main.new_copy_files_build_phase - copy_app.name = 'Copy LoginItem' - copy_app.symbol_dst_subfolder_spec = :wrapper - copy_app.dst_path = 'Contents/Library/LoginItems' - - app_file = copy_app.add_file_reference @target_loginitem.product_reference - app_file.settings = { "ATTRIBUTES" => ['RemoveHeadersOnCopy'] } - end - - def setup_target_nativemessaging(shortVersion, fullVersion, configHash) - @target_nativemessaging = @project.new_target(:application, 'AmneziaVPNNativeMessaging', :osx) - - @target_nativemessaging.build_configurations.each do |config| - config.base_configuration_reference = @configFile - - config.build_settings['LD_RUNPATH_SEARCH_PATHS'] ||= '"$(inherited) @executable_path/../Frameworks"' - - # Versions and names - config.build_settings['MARKETING_VERSION'] ||= shortVersion - config.build_settings['CURRENT_PROJECT_VERSION'] ||= fullVersion - config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] ||= configHash['NATIVEMESSAGING_ID_MACOS'] - config.build_settings['PRODUCT_NAME'] = 'AmneziaVPNNativeMessaging' - - # other configs - config.build_settings['INFOPLIST_FILE'] ||= p_root + "/" + 'macos/nativeMessaging/Info.plist' - config.build_settings['CODE_SIGN_ENTITLEMENTS'] ||= p_root + "/" + 'macos/nativeMessaging/AmneziaVPNNativeMessaging.entitlements' - config.build_settings['CODE_SIGN_IDENTITY'] = 'Apple Development' - config.build_settings['SKIP_INSTALL'] = 'YES' - end - - group = @project.main_group.new_group('NativeMessaging') - [ - 'extension/app/constants.h', - 'extension/app/handler.cpp', - 'extension/app/handler.h', - 'extension/app/json.hpp', - 'extension/app/logger.cpp', - 'extension/app/logger.h', - 'extension/app/main.cpp', - 'extension/app/vpnconnection.cpp', - 'extension/app/vpnconnection.h', - ].each { |filename| - file = group.new_file(p_root + "/" + filename) - @target_nativemessaging.add_file_references([file]) - } - - # This fails: @target_main.add_dependency @target_nativemessaging - container_proxy = @project.new(Xcodeproj::Project::PBXContainerItemProxy) - container_proxy.container_portal = @project.root_object.uuid - container_proxy.proxy_type = Xcodeproj::Constants::PROXY_TYPES[:native_target] - container_proxy.remote_global_id_string = @target_nativemessaging.uuid - container_proxy.remote_info = @target_nativemessaging.name - - dependency = @project.new(Xcodeproj::Project::PBXTargetDependency) - dependency.name = @target_nativemessaging.name - dependency.target = @target_main - dependency.target_proxy = container_proxy - - @target_main.dependencies << dependency - - copy_app = @target_main.new_copy_files_build_phase - copy_app.name = 'Copy LoginItem' - copy_app.symbol_dst_subfolder_spec = :wrapper - copy_app.dst_path = 'Contents/Library/NativeMessaging' - - app_file = copy_app.add_file_reference @target_nativemessaging.product_reference - app_file.settings = { "ATTRIBUTES" => ['RemoveHeadersOnCopy'] } - - copy_nativeMessagingManifest = @target_main.new_copy_files_build_phase - copy_nativeMessagingManifest.name = 'Copy native messaging manifest' - copy_nativeMessagingManifest.symbol_dst_subfolder_spec = :wrapper - copy_nativeMessagingManifest.dst_path = 'Contents/Resources/utils' - - group = @project.main_group.new_group('WireGuardHelper') - file = group.new_file 'extension/app/manifests/macos/mozillavpn.json' - - nativeMessagingManifest_file = copy_nativeMessagingManifest.add_file_reference file - nativeMessagingManifest_file.settings = { "ATTRIBUTES" => ['RemoveHeadersOnCopy'] } - end - - def die(msg) - print $msg - exit 1 - end -end - -if ARGV.length < 4 || (ARGV[4] != "ios" && ARGV[4] != "macos") - puts "Usage: