Xcode Command Line – Tips and Tricks
This post shares various ways to use xcodebuild to build your iOS or OS X projects from the command line.
The easiest way is just type a single command without any parameter “xcodebuild” to build the project in the current directory:
xcodebuild
The output is below (GCClient here is the target of my project):
=== BUILD TARGET GCClient OF PROJECT GCClient WITH THE DEFAULT CONFIGURATION (Release) ===
xcodebuild will look for project file ( .xcodeproj file in the current directory) and invoke the default target/config.
We can also specify the project to build in the command line like below:
xcodebuild -project GCClient.xcodeproj
Output:
=== BUILD TARGET GCClient OF PROJECT GCClient WITH THE DEFAULT CONFIGURATION (Release) ===
Again, the xcode will use the default (release) config for building.
If your project has more than one targets (maybe for unit test, testing….), you can specify the target as well:
xcodebuild -project GCClient.xcodeproj -target GCClient
In case you want to build for debugging only, you can specify the configuration to build:
xcodebuild -project GCClient.xcodeproj -target GCClient -configuration Debug
In this case, xCode will build the architectures you specified in BuildSettings > Architectures
The output .a will be valid for all 3 architectures and put at build/Debug-iphoneos.
You can check the list of supported architectures by “lipo” command
lipo -info build/Debug-iphoneos/libGeoComplyClient.a
Output:
Architectures in the fat file: build/Debug-iphoneos/libGeoComplyClient.a are: armv7 arm64 armv7s
Sometimes, you want to build against an older SDK, simulator SDK, or even OS X SDK, you can specify it by the -sdk parameter.
To check the pre-installed SDKs on your machine, you can use the following command:
xcodebuild -showsdks
Output:
OS X SDKs: OS X 10.11 -sdk macosx10.11 iOS SDKs: iOS 9.0 -sdk iphoneos9.0 iOS Simulator SDKs: Simulator - iOS 9.0 -sdk iphonesimulator9.0 watchOS SDKs: watchOS 2.0 -sdk watchos2.0 watchOS Simulator SDKs: Simulator - watchOS 2.0 -sdk watchsimulator2.0
Once we know the available SDKs, we can now specify the based SDK from the command line:
xcodebuild -project GCClient.xcodeproj -target GCClient -configuration Debug -sdk iphoneos9.0
There is a more handy way to use the xcodebuild command, it’s “Run Script” in Build Phase of Xcode.
If you want to build flat .a file which contains all 5 architectures for both real devices(armv7/armv7s/arm64) and simulators (i386/x86_64), you can write Run Script as following:
SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.\{3\}$') if [ "true" == ${ALREADYINVOKED:-false} ] then echo "RECURSION: don't run xcodebuild here, it will be infinitely looped" else # CRITICAL: # Prevent infinite recursion export ALREADYINVOKED="true" xcodebuild -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphoneos${SDK_VERSION} ARCHS="armv7 armv7s arm64" -destination "name=iOS" BUILD_DIR="${BUILD_DIR}" xcodebuild -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk iphonesimulator${SDK_VERSION} ARCHS="x86_64 i386" -destination "name=iOS Simulator" BUILD_DIR="${BUILD_DIR}" # collect build .a files: CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal rm -rf "${CREATING_UNIVERSAL_DIR}" mkdir "${CREATING_UNIVERSAL_DIR}" lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}" fi
Notice that you have to specify the ARCHS and sdk properly. If ARCHS are for real devices(arm*) then SDK must be iphoneos*. In contrast, iphonesimulator* is in-pair with x86_64/i386.