Просмотр исходного кода

Add simulator arch to framework. Strip unused archs from OpenSSL binaries.

Adam Pritchard 9 лет назад
Родитель
Сommit
aaf0b5f99f

+ 28 - 12
MobileLibrary/iOS/OpenSSL-for-iPhone/build-libssl.sh

@@ -53,7 +53,9 @@ spinner()
 }
 
 CURRENTPATH=`pwd`
-ARCHS="i386 x86_64 armv7 armv7s arm64 tv_x86_64 tv_arm64"
+# PSIPHON: remove unneeded architectures
+#ARCHS="i386 x86_64 armv7 armv7s arm64 tv_x86_64 tv_arm64"
+ARCHS="x86_64 armv7 armv7s arm64"
 DEVELOPER=`xcode-select -print-path`
 IOS_MIN_SDK_VERSION="6.1"
 TVOS_MIN_SDK_VERSION="9.0"
@@ -236,30 +238,44 @@ do
 done
 
 echo "Build library for iOS..."
+# PSIPHON: remove unneeded architectures
+#lipo -create \
+#  ${CURRENTPATH}/bin/iPhoneSimulator${IOS_SDKVERSION}-i386.sdk/lib/libssl.a \
+#  ${CURRENTPATH}/bin/iPhoneSimulator${IOS_SDKVERSION}-x86_64.sdk/lib/libssl.a \
+#  ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-armv7.sdk/lib/libssl.a \
+#  ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-armv7s.sdk/lib/libssl.a \
+#  ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-arm64.sdk/lib/libssl.a \
+#  -output ${CURRENTPATH}/lib/libssl.a
+#lipo -create \
+#  ${CURRENTPATH}/bin/iPhoneSimulator${IOS_SDKVERSION}-i386.sdk/lib/libcrypto.a \
+#  ${CURRENTPATH}/bin/iPhoneSimulator${IOS_SDKVERSION}-x86_64.sdk/lib/libcrypto.a \
+#  ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-armv7.sdk/lib/libcrypto.a \
+#  ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-armv7s.sdk/lib/libcrypto.a \
+#  ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-arm64.sdk/lib/libcrypto.a \
+#  -output ${CURRENTPATH}/lib/libcrypto.a
 lipo -create \
-  ${CURRENTPATH}/bin/iPhoneSimulator${IOS_SDKVERSION}-i386.sdk/lib/libssl.a \
   ${CURRENTPATH}/bin/iPhoneSimulator${IOS_SDKVERSION}-x86_64.sdk/lib/libssl.a \
   ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-armv7.sdk/lib/libssl.a \
   ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-armv7s.sdk/lib/libssl.a \
   ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-arm64.sdk/lib/libssl.a \
   -output ${CURRENTPATH}/lib/libssl.a
 lipo -create \
-  ${CURRENTPATH}/bin/iPhoneSimulator${IOS_SDKVERSION}-i386.sdk/lib/libcrypto.a \
   ${CURRENTPATH}/bin/iPhoneSimulator${IOS_SDKVERSION}-x86_64.sdk/lib/libcrypto.a \
   ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-armv7.sdk/lib/libcrypto.a \
   ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-armv7s.sdk/lib/libcrypto.a \
   ${CURRENTPATH}/bin/iPhoneOS${IOS_SDKVERSION}-arm64.sdk/lib/libcrypto.a \
   -output ${CURRENTPATH}/lib/libcrypto.a
 
-echo "Build library for tvOS..."
-lipo -create \
-  ${CURRENTPATH}/bin/AppleTVSimulator${TVOS_SDKVERSION}-x86_64.sdk/lib/libssl.a \
-  ${CURRENTPATH}/bin/AppleTVOS${TVOS_SDKVERSION}-arm64.sdk/lib/libssl.a \
-  -output ${CURRENTPATH}/lib/libssl-tvOS.a
-lipo -create \
-  ${CURRENTPATH}/bin/AppleTVSimulator${TVOS_SDKVERSION}-x86_64.sdk/lib/libcrypto.a \
-  ${CURRENTPATH}/bin/AppleTVOS${TVOS_SDKVERSION}-arm64.sdk/lib/libcrypto.a \
-  -output ${CURRENTPATH}/lib/libcrypto-tvOS.a
+# PSIPHON: remove unneeded architectures
+#echo "Build library for tvOS..."
+#lipo -create \
+#  ${CURRENTPATH}/bin/AppleTVSimulator${TVOS_SDKVERSION}-x86_64.sdk/lib/libssl.a \
+#  ${CURRENTPATH}/bin/AppleTVOS${TVOS_SDKVERSION}-arm64.sdk/lib/libssl.a \
+#  -output ${CURRENTPATH}/lib/libssl-tvOS.a
+#lipo -create \
+#  ${CURRENTPATH}/bin/AppleTVSimulator${TVOS_SDKVERSION}-x86_64.sdk/lib/libcrypto.a \
+#  ${CURRENTPATH}/bin/AppleTVOS${TVOS_SDKVERSION}-arm64.sdk/lib/libcrypto.a \
+#  -output ${CURRENTPATH}/lib/libcrypto-tvOS.a
 
 mkdir -p ${CURRENTPATH}/include
 cp -R ${CURRENTPATH}/bin/iPhoneSimulator${IOS_SDKVERSION}-x86_64.sdk/include/openssl ${CURRENTPATH}/include/

+ 6 - 0
MobileLibrary/iOS/PsiphonTunnel/PsiphonTunnel.xcodeproj/project.pbxproj

@@ -342,6 +342,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD)";
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
 				CLANG_CXX_LIBRARY = "libc++";
@@ -385,6 +386,7 @@
 				ONLY_ACTIVE_ARCH = YES;
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
+				VALID_ARCHS = "";
 				VERSIONING_SYSTEM = "apple-generic";
 				VERSION_INFO_PREFIX = "";
 			};
@@ -394,6 +396,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD)";
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
 				CLANG_CXX_LIBRARY = "libc++";
@@ -431,6 +434,7 @@
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				VALIDATE_PRODUCT = YES;
+				VALID_ARCHS = "";
 				VERSIONING_SYSTEM = "apple-generic";
 				VERSION_INFO_PREFIX = "";
 			};
@@ -457,6 +461,7 @@
 				PRODUCT_BUNDLE_IDENTIFIER = com.psiphon3.ios.PsiphonTunnel;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SKIP_INSTALL = YES;
+				VALID_ARCHS = "$(ARCHS) x86_64";
 			};
 			name = Debug;
 		};
@@ -481,6 +486,7 @@
 				PRODUCT_BUNDLE_IDENTIFIER = com.psiphon3.ios.PsiphonTunnel;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SKIP_INSTALL = YES;
+				VALID_ARCHS = "$(ARCHS) x86_64";
 			};
 			name = Release;
 		};

+ 3 - 1
MobileLibrary/iOS/USAGE.md

@@ -32,4 +32,6 @@ This code is a canonical guide for integrating the Library.
 
 ## Compiling and testing
 
-Only phone targets are compiled into the Library, so you must compile for and test on an actual device. If you don't do this, you'll get a linker error that says "missing required architecture x86_64 in file".
+The following architecture targets are compiled into the Library's framework binary: `armv7`, `arm64`, and `x86_64`. This means that the Library can run on phones or in a simulator (on a 64-bit host system).
+
+When run in a simulator, there may be errors shown in the device log. This does not seem to affect the execution of the app (or Library).

+ 44 - 15
MobileLibrary/iOS/build-psiphon-framework.sh

@@ -15,7 +15,8 @@ if [ $? -ne 0 ]; then
   exit 1
 fi
 
-VALID_ARCHS="arm64 armv7 armv7s"
+VALID_IOS_ARCHS="arm64 armv7 armv7s"
+VALID_SIMULATOR_ARCHS="x86_64"
 FRAMEWORK="Psi"
 INTERMEDIATE_OUPUT_DIR="${BASE_DIR}/PsiphonTunnel/PsiphonTunnel"
 INTERMEDIATE_OUPUT_FILE="${FRAMEWORK}.framework"
@@ -69,8 +70,28 @@ if [ ! -e ${IOS_SRC_DIR} ]; then
   fi
 fi
 
+# arg: binary_path
+function strip_architectures() {
+  valid_archs="${VALID_IOS_ARCHS} ${VALID_SIMULATOR_ARCHS}"
+  ARCHS="$(lipo -info "$1" | rev | cut -d ':' -f1 | rev)"
+  for ARCH in "${valid_archs}"; do
+    if ! [[ "${valid_archs}" == *"$ARCH"* ]]; then
+      echo "Stripping ARCH ${ARCH} from $1"
+      lipo -remove "$ARCH" -output "$1" "$1"
+      rc=$?; if [[ $rc != 0 ]]; then
+        echo "FAILURE: lipo $1"
+        exit $rc
+      fi
+    fi
+  done
+  return 0
+}
+
 cd OpenSSL-for-iPhone && ./build-libssl.sh; cd -
 
+strip_architectures "${LIBSSL}"
+strip_architectures "${LIBCRYPTO}"
+
 go get -d  -u -v github.com/Psiphon-Inc/openssl
 rc=$?; if [[ $rc != 0 ]]; then
   echo "FAILURE: go get -d  -u -v github.com/Psiphon-Inc/openssl"
@@ -153,23 +174,13 @@ LC_ALL=C sed -i -- "s|// #cgo pkg-config: libssl|${IOS_CGO_BUILD_FLAGS}|" "${OPE
 
 gomobile init
 
-gomobile bind -target ios -ldflags="${LDFLAGS}" -o ${INTERMEDIATE_OUPUT_DIR}/${INTERMEDIATE_OUPUT_FILE} github.com/Psiphon-Labs/psiphon-tunnel-core/MobileLibrary/psi
+gomobile bind -target ios -ldflags="${LDFLAGS}" -o "${INTERMEDIATE_OUPUT_DIR}/${INTERMEDIATE_OUPUT_FILE}" github.com/Psiphon-Labs/psiphon-tunnel-core/MobileLibrary/psi
 rc=$?; if [[ $rc != 0 ]]; then
   echo "FAILURE: gomobile bind"
   exit $rc
 fi
 
-ARCHS="$(lipo -info "${FRAMEWORK_BINARY}" | rev | cut -d ':' -f1 | rev)"
-for ARCH in $ARCHS; do
-  if ! [[ "${VALID_ARCHS}" == *"$ARCH"* ]]; then
-    echo "Stripping ARCH ${ARCH} from ${FRAMEWORK_BINARY}"
-    lipo -remove "$ARCH" -output "$FRAMEWORK_BINARY" "$FRAMEWORK_BINARY"
-    rc=$?; if [[ $rc != 0 ]]; then
-      echo "FAILURE: lipo"
-      exit $rc
-    fi
-  fi
-done
+strip_architectures "${FRAMEWORK_BINARY}"
 
 #
 # Do the outer framework build using Xcode
@@ -177,12 +188,30 @@ done
 
 # Clean previous output
 rm -rf "${BUILD_DIR}"
+rm -rf "${BUILD_DIR}-SIMULATOR"
 
-# Build the outer framework
+# Build the outer framework for phones...
 xcodebuild clean build CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -configuration Release -sdk iphoneos ONLY_ACTIVE_ARCH=NO -project ${UMBRELLA_FRAMEWORK_XCODE_PROJECT} CONFIGURATION_BUILD_DIR="${BUILD_DIR}"
 rc=$?; if [[ $rc != 0 ]]; then
-  echo "FAILURE: xcodebuild"
+  echo "FAILURE: xcodebuild iphoneos"
   exit $rc
 fi
 
+# ...and for the simulator.
+xcodebuild clean build CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO -configuration Release -sdk iphonesimulator ARCHS=x86_64 VALID_ARCHS=x86_64 ONLY_ACTIVE_ARCH=NO -project ${UMBRELLA_FRAMEWORK_XCODE_PROJECT} CONFIGURATION_BUILD_DIR="${BUILD_DIR}-SIMULATOR"
+rc=$?; if [[ $rc != 0 ]]; then
+  echo "FAILURE: xcodebuild iphonesimulator"
+  exit $rc
+fi
+
+# Add the simulator x86_64 binary into the main framework binary.
+lipo -create "${BUILD_DIR}/PsiphonTunnel.framework/PsiphonTunnel" "${BUILD_DIR}-SIMULATOR/PsiphonTunnel.framework/PsiphonTunnel" -output "${BUILD_DIR}/PsiphonTunnel.framework/PsiphonTunnel"
+rc=$?; if [[ $rc != 0 ]]; then
+  echo "FAILURE: lipo create"
+  exit $rc
+fi
+
+# Delete the temporary simulator build files.
+rm -rf "${BUILD_DIR}-SIMULATOR"
+
 echo "Done."