github.com/Psiphon-Labs/psiphon-tunnel-core@v2.0.28+incompatible/MobileLibrary/iOS/build-psiphon-framework.sh (about) 1 #!/usr/bin/env bash 2 3 set -e -u -x 4 5 if [ -z ${1+x} ]; then BUILD_TAGS=""; else BUILD_TAGS="$1"; fi 6 7 # Modify this value as we use newer Go versions. 8 GO_VERSION_REQUIRED="1.17.13" 9 10 # At this time, psiphon-tunnel-core doesn't support modules 11 export GO111MODULE=off 12 13 # Reset the PATH to macOS default. This is mainly so we don't execute the wrong 14 # gomobile executable. 15 PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin 16 17 # $GOROOT/bin allows build automation to provide various Go versions dynamically. 18 # As gomobile would be installed at $GOPATH/bin, there is minimal risk that 19 # adding $GOROOT/bin will run an unexpected gomobile binary. 20 PATH=$GOROOT/bin:$PATH 21 22 BASE_DIR=$(cd "$(dirname "$0")" ; pwd -P) 23 cd "${BASE_DIR}" 24 25 # The location of the final framework build 26 BUILD_DIR="${BASE_DIR}/build" 27 28 # Ensure go is installed 29 which go 2>&1 > /dev/null 30 if [[ $? != 0 ]]; then 31 echo "Go is not installed in the path, aborting" 32 exit 1 33 fi 34 35 UMBRELLA_FRAMEWORK_XCODE_PROJECT=${BASE_DIR}/PsiphonTunnel/PsiphonTunnel.xcodeproj/ 36 37 # Exporting these seems necessary for subcommands to pick them up. 38 export GOPATH=${PWD}/go-ios-build 39 export PATH=${GOPATH}/bin:${PATH} 40 41 # The GOPATH we're using is temporary, so make sure there isn't one from a previous run. 42 rm -rf "${GOPATH}" 43 44 GOMOBILE_PINNED_REV=ce6a79cf6a13dd77095a6f8dbee5f39848fa7da1 45 GOMOBILE_PATH=${GOPATH}/src/golang.org/x/mobile/cmd/gomobile 46 47 TUNNEL_CORE_SRC_DIR=${GOPATH}/src/github.com/Psiphon-Labs/psiphon-tunnel-core 48 49 PATH=${PATH}:${GOPATH}/bin 50 51 mkdir -p "${GOPATH}" 52 if [[ $? != 0 ]]; then 53 echo "FAILURE: mkdir -p ${GOPATH}" 54 exit 1 55 fi 56 57 # Symlink the current source directory into GOPATH, so that we're building the 58 # code in this local repo, rather than pulling from Github and building that. 59 mkdir -p "${GOPATH}/src/github.com/Psiphon-Labs" 60 if [[ $? != 0 ]]; then 61 echo "mkdir -p ${GOPATH}/src/github.com/Psiphon-Labs" 62 exit 1 63 fi 64 ln -s "${BASE_DIR}/../.." "${GOPATH}/src/github.com/Psiphon-Labs/psiphon-tunnel-core" 65 if [[ $? != 0 ]]; then 66 echo "ln -s ../.. ${GOPATH}/src/github.com/Psiphon-Labs/psiphon-tunnel-core" 67 exit 1 68 fi 69 70 # Builds Psi.framework library for the given platform. 71 # 72 # - Parameter 1: `gomobile bind` -target option value 73 # - Parameter 2: Variable name where gomobile output will be set to. 74 function gomobile_build_for_platform() { 75 76 # Possible values are "ios" and "simulator" 77 local TARGETS=$1 78 79 echo "Build library for targets ${TARGETS}" 80 81 local GOBIND_OUT="${BUILD_DIR}/gobind-framework/Psi.xcframework" 82 83 # We're using a generated-code prefix to workaround https://github.com/golang/go/issues/18693 84 # CGO_CFLAGS_ALLOW is to workaround https://github.com/golang/go/issues/23742 in Go 1.9.4 85 CGO_CFLAGS_ALLOW="-fmodules|-fblocks" "${GOPATH}"/bin/gomobile bind -v -x \ 86 -target "${TARGETS}" \ 87 -iosversion "10.0" \ 88 -prefix Go \ 89 -tags="${BUILD_TAGS}" \ 90 -ldflags="${LDFLAGS}" \ 91 -o "${GOBIND_OUT}" github.com/Psiphon-Labs/psiphon-tunnel-core/MobileLibrary/psi 92 93 rc=$?; if [[ $rc != 0 ]]; then 94 echo "FAILURE: gomobile bind failed". 95 exit $rc 96 fi 97 98 99 # Sets parameter $2 to value of GOBIND_OUT. 100 eval "$2=${GOBIND_OUT}" 101 } 102 103 # 104 # Check Go version 105 # 106 107 GO_VERSION=$(go version | sed -E -n 's/.*go([0-9]\.[0-9]+(\.[0-9]+)?).*/\1/p') 108 if [[ ${GO_VERSION} != "${GO_VERSION_REQUIRED}" ]]; then 109 echo "FAILURE: go version mismatch; require ${GO_VERSION_REQUIRED}; got ${GO_VERSION}" 110 exit 1 111 fi 112 113 # 114 # Get and install gomobile, using our pinned revision 115 # 116 117 go get -u golang.org/x/mobile/cmd/gomobile 118 cd "${GOPATH}"/src/golang.org/x/mobile/cmd/gomobile 119 git checkout master 120 git checkout -b pinned ${GOMOBILE_PINNED_REV} 121 122 # Patch gomobile to edit a command that assumes modules 123 mv init.go init.go.orig 124 sed -e 's/golang.org\/x\/mobile\/cmd\/gobind@latest/golang.org\/x\/mobile\/cmd\/gobind/g' init.go.orig > init.go 125 126 127 go install 128 "${GOPATH}"/bin/gomobile init -v -x 129 if [[ $? != 0 ]]; then 130 echo "FAILURE: ${GOPATH}/bin/gomobile init" 131 exit 1 132 fi 133 134 # Ensure BUILD* variables reflect the tunnel-core repo 135 cd "${TUNNEL_CORE_SRC_DIR}" 136 137 BUILDINFOFILE="${BASE_DIR}/psiphon-tunnel-core_buildinfo.txt" 138 BUILDDATE=$(date +%Y-%m-%dT%H:%M:%S%z) 139 BUILDREPO=$(git config --get remote.origin.url) 140 BUILDREV=$(git rev-parse --short HEAD) 141 GOVERSION=$(go version | perl -ne '/go version (.*?) / && print $1') 142 GOMOBILEVERSION=$("${GOPATH}"/bin/gomobile version | perl -ne '/gomobile version (.*?) / && print $1') 143 144 # see DEPENDENCIES comment in MobileLibrary/Android/make.bash 145 cd "${GOPATH}"/src/github.com/Psiphon-Labs/psiphon-tunnel-core/MobileLibrary/psi 146 DEPENDENCIES=$(echo -n "{" && GOOS=darwin go list -tags "${BUILD_TAGS}" -f '{{range $dep := .Deps}}{{printf "%s\n" $dep}}{{end}}' | GOOS=darwin xargs go list -tags "${BUILD_TAGS}" -f '{{if not .Standard}}{{.ImportPath}}{{end}}' | xargs -I pkg bash -c 'cd $GOPATH/src/$0 && if echo -n "$0" | grep -vEq "^github.com/Psiphon-Labs/psiphon-tunnel-core/" ; then echo -n "\"$0\":\"$(git rev-parse --short HEAD)\"," ; fi' pkg | sed 's/,$//' | tr -d '\n' && echo -n "}") 147 148 LDFLAGS="\ 149 -s \ 150 -w \ 151 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.buildDate=${BUILDDATE} \ 152 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.buildRepo=${BUILDREPO} \ 153 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.buildRev=${BUILDREV} \ 154 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.goVersion=${GOVERSION} \ 155 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.gomobileVersion=${GOMOBILEVERSION} \ 156 -X github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/buildinfo.dependencies=${DEPENDENCIES} \ 157 " 158 159 echo -e "${BUILDDATE}\n${BUILDREPO}\n${BUILDREV}\n" > "$BUILDINFOFILE" 160 161 echo "" 162 echo "Variables for ldflags:" 163 echo " Build date: ${BUILDDATE}" 164 echo " Build repo: ${BUILDREPO}" 165 echo " Build revision: ${BUILDREV}" 166 echo " Go version: ${GOVERSION}" 167 echo " Gomobile version: ${GOMOBILEVERSION}" 168 echo "" 169 170 171 # 172 # Clean previous output 173 # 174 rm -rf "${BUILD_DIR}" 175 176 177 # 178 # Builds Psi.xcframework 179 # 180 IOS_PSI_FRAMEWORK="" 181 gomobile_build_for_platform "ios" IOS_PSI_FRAMEWORK 182 183 echo "$IOS_PSI_FRAMEWORK" 184 185 # 186 # Copies gobind output Psi.xcframework to the Xcode project 187 # 188 189 rm -rf "${BASE_DIR}/PsiphonTunnel/PsiphonTunnel/Psi.xcframework" 190 cp -r "${IOS_PSI_FRAMEWORK}" "${BASE_DIR}/PsiphonTunnel/PsiphonTunnel" 191 192 # 193 # Build PsiphonTunnel framework for iOS. 194 # 195 196 IOS_ARCHIVE="${BUILD_DIR}/ios.xcarchive" 197 198 xcodebuild clean archive \ 199 -project "${UMBRELLA_FRAMEWORK_XCODE_PROJECT}" \ 200 -scheme "PsiphonTunnel" \ 201 -configuration "Release" \ 202 -sdk iphoneos \ 203 -archivePath "${IOS_ARCHIVE}" \ 204 CODE_SIGN_IDENTITY="" \ 205 CODE_SIGNING_REQUIRED="NO" \ 206 CODE_SIGN_ENTITLEMENTS="" \ 207 CODE_SIGNING_ALLOWED="NO" \ 208 STRIP_BITCODE_FROM_COPIED_FILES="NO" \ 209 BUILD_LIBRARY_FOR_DISTRIBUTION="YES" \ 210 ONLY_ACTIVE_ARCH="NO" \ 211 SKIP_INSTALL="NO" \ 212 EXCLUDED_ARCHS="armv7" 213 214 215 # Build PsiphonTunnel framework for simulator. 216 # 217 # Note: 218 # - Excludes 32-bit Intel: EXCLUDED_ARCHS="i386". 219 # - Excludes ARM Macs: EXCLUDED_ARCHS="arm64". 220 221 SIMULATOR_ARCHIVE="${BUILD_DIR}/simulator.xcarchive" 222 223 xcodebuild clean archive \ 224 -project "${UMBRELLA_FRAMEWORK_XCODE_PROJECT}" \ 225 -scheme "PsiphonTunnel" \ 226 -configuration "Release" \ 227 -sdk iphonesimulator \ 228 -archivePath "${SIMULATOR_ARCHIVE}" \ 229 CODE_SIGN_IDENTITY="" \ 230 CODE_SIGNING_REQUIRED="NO" \ 231 CODE_SIGN_ENTITLEMENTS="" \ 232 CODE_SIGNING_ALLOWED="NO" \ 233 STRIP_BITCODE_FROM_COPIED_FILES="NO" \ 234 BUILD_LIBRARY_FOR_DISTRIBUTION="YES" \ 235 ONLY_ACTIVE_ARCH="NO" \ 236 SKIP_INSTALL="NO" \ 237 EXCLUDED_ARCHS="arm64 i386" 238 239 # 240 # Bundling the generated frameworks into a single PsiphonTunnel.xcframework 241 # 242 243 xcodebuild -create-xcframework \ 244 -framework "${IOS_ARCHIVE}/Products/Library/Frameworks/PsiphonTunnel.framework" \ 245 -debug-symbols "${IOS_ARCHIVE}/dSYMs/PsiphonTunnel.framework.dSYM" \ 246 -framework "${SIMULATOR_ARCHIVE}/Products/Library/Frameworks/PsiphonTunnel.framework" \ 247 -debug-symbols "${SIMULATOR_ARCHIVE}/dSYMs/PsiphonTunnel.framework.dSYM" \ 248 -output "${BUILD_DIR}/PsiphonTunnel.xcframework" 249 250 251 # Jenkins loses symlinks from the framework directory, which results in a build 252 # artifact that is invalid to use in an App Store app. Instead, we will zip the 253 # resulting build and use that as the artifact. 254 cd "${BUILD_DIR}" 255 256 zip --recurse-paths --symlinks build.zip ./PsiphonTunnel.xcframework --exclude "*.DS_Store" 257 258 echo "BUILD DONE"