blob: 0f5e9e335ea000251c469d6e80b3d6ae897254a6 [file] [log] [blame]
Shenghou Maf961a992014-12-26 01:24:42 -05001Go on iOS
2=========
3
Elias Naur869c02c2020-09-16 15:23:58 +02004To run the standard library tests, run all.bash as usual, but with the compiler
5set to the clang wrapper that invokes clang for iOS. For example, this command runs
6 all.bash on the iOS emulator:
Shenghou Maf961a992014-12-26 01:24:42 -05007
Elias Naur869c02c2020-09-16 15:23:58 +02008 GOOS=ios GOARCH=amd64 CGO_ENABLED=1 CC_FOR_TARGET=$(pwd)/../misc/ios/clangwrap.sh ./all.bash
Shenghou Maf961a992014-12-26 01:24:42 -05009
Cherry Zhangf83e0f62020-12-28 14:33:14 -050010If CC_FOR_TARGET is not set when the toolchain is built (make.bash or all.bash), CC
Daniel Martí780b4de2020-12-29 21:37:06 +000011can be set on the command line. For example,
Cherry Zhangf83e0f62020-12-28 14:33:14 -050012
13 GOOS=ios GOARCH=amd64 CGO_ENABLED=1 CC=$(go env GOROOT)/misc/ios/clangwrap.sh go build
14
15Setting CC is not necessary if the toolchain is built with CC_FOR_TARGET set.
16
Elias Naur869c02c2020-09-16 15:23:58 +020017To use the go tool to run individual programs and tests, put $GOROOT/bin into PATH to ensure
18the go_ios_$GOARCH_exec wrapper is found. For example, to run the archive/tar tests:
19
20 export PATH=$GOROOT/bin:$PATH
21 GOOS=ios GOARCH=amd64 CGO_ENABLED=1 go test archive/tar
22
23The go_ios_exec wrapper uses GOARCH to select the emulator (amd64) or the device (arm64).
24However, further setup is required to run tests or programs directly on a device.
Shenghou Maf961a992014-12-26 01:24:42 -050025
Elias Naur25f73db2018-05-10 17:38:23 +020026First make sure you have a valid developer certificate and have setup your device properly
27to run apps signed by your developer certificate. Then install the libimobiledevice and
28ideviceinstaller tools from https://www.libimobiledevice.org/. Use the HEAD versions from
29source; the stable versions have bugs that prevents the Go exec wrapper to install and run
30apps.
Shenghou Maf961a992014-12-26 01:24:42 -050031
Elias Naur25f73db2018-05-10 17:38:23 +020032Second, the Go exec wrapper must be told the developer account signing identity, the team
33id and a provisioned bundle id to use. They're specified with the environment variables
34GOIOS_DEV_ID, GOIOS_TEAM_ID and GOIOS_APP_ID. The detect.go program in this directory will
35attempt to auto-detect suitable values. Run it as
Shenghou Maf961a992014-12-26 01:24:42 -050036
Elias Naur25f73db2018-05-10 17:38:23 +020037 go run detect.go
Shenghou Maf961a992014-12-26 01:24:42 -050038
Elias Naur25f73db2018-05-10 17:38:23 +020039which will output something similar to
Shenghou Maf961a992014-12-26 01:24:42 -050040
Elias Naur25f73db2018-05-10 17:38:23 +020041 export GOIOS_DEV_ID="iPhone Developer: xxx@yyy.zzz (XXXXXXXX)"
42 export GOIOS_APP_ID=YYYYYYYY.some.bundle.id
43 export GOIOS_TEAM_ID=ZZZZZZZZ
44
45If you have multiple devices connected, specify the device UDID with the GOIOS_DEVICE_ID
Elias Naur869c02c2020-09-16 15:23:58 +020046variable. Use `idevice_id -l` to list all available UDIDs. Then, setting GOARCH to arm64
47will select the device:
Elias Naur25f73db2018-05-10 17:38:23 +020048
Elias Naur869c02c2020-09-16 15:23:58 +020049 GOOS=ios GOARCH=arm64 CGO_ENABLED=1 CC_FOR_TARGET=$(pwd)/../misc/ios/clangwrap.sh ./all.bash
Elias Naur25f73db2018-05-10 17:38:23 +020050
51Note that the go_darwin_$GOARCH_exec wrapper uninstalls any existing app identified by
52the bundle id before installing a new app. If the uninstalled app is the last app by
53the developer identity, the device might also remove the permission to run apps from
54that developer, and the exec wrapper will fail to install the new app. To avoid that,
55install another app with the same developer identity but with a different bundle id.
56That way, the permission to install apps is held on to while the primary app is
57uninstalled.