diff options
author | Sander van der Burg <sander@conference-compass.com> | 2013-01-07 16:52:42 +0100 |
---|---|---|
committer | Sander van der Burg <sander@conference-compass.com> | 2013-01-07 16:52:42 +0100 |
commit | 5b0ca88d97d005a73a2be38e7a521af70875a718 (patch) | |
tree | b2eba8467fa5e1ecd1cac6ab8513582651647e44 /pkgs/development/mobile/xcodeenv | |
parent | a547de1ecb14853487d864f70ad5e6a1cb3ce08d (diff) | |
download | nixpkgs-5b0ca88d97d005a73a2be38e7a521af70875a718.tar nixpkgs-5b0ca88d97d005a73a2be38e7a521af70875a718.tar.gz nixpkgs-5b0ca88d97d005a73a2be38e7a521af70875a718.tar.bz2 nixpkgs-5b0ca88d97d005a73a2be38e7a521af70875a718.tar.lz nixpkgs-5b0ca88d97d005a73a2be38e7a521af70875a718.tar.xz nixpkgs-5b0ca88d97d005a73a2be38e7a521af70875a718.tar.zst nixpkgs-5b0ca88d97d005a73a2be38e7a521af70875a718.zip |
- Added xcodeenv: experimental support to build iOS apps through Nix
- Moved mobile development tools into a separate folder
Diffstat (limited to 'pkgs/development/mobile/xcodeenv')
-rw-r--r-- | pkgs/development/mobile/xcodeenv/build-app.nix | 92 | ||||
-rw-r--r-- | pkgs/development/mobile/xcodeenv/default.nix | 15 | ||||
-rw-r--r-- | pkgs/development/mobile/xcodeenv/simulate-app.nix | 17 | ||||
-rw-r--r-- | pkgs/development/mobile/xcodeenv/xcodewrapper.nix | 24 |
4 files changed, 148 insertions, 0 deletions
diff --git a/pkgs/development/mobile/xcodeenv/build-app.nix b/pkgs/development/mobile/xcodeenv/build-app.nix new file mode 100644 index 00000000000..3ac9e4bb958 --- /dev/null +++ b/pkgs/development/mobile/xcodeenv/build-app.nix @@ -0,0 +1,92 @@ +{stdenv, xcodewrapper}: +{ name +, src +, target ? null +, configuration ? null +, scheme ? null +, sdk ? null +, arch ? null +, xcodeFlags ? "" +, release ? false +, codeSignIdentity ? null +, certificateFile ? null +, certificatePassword ? null +, provisioningProfile ? null +, generateIPA ? false +, generateXCArchive ? false +}: + +assert release -> codeSignIdentity != null && certificateFile != null && certificatePassword != null && provisioningProfile != null; + +let + # Set some default values here + + _target = if target == null then name else target; + _scheme = if scheme == null then name else scheme; + + _configuration = if configuration == null + then + if release then "Release" else "Debug" + else configuration; + + _arch = if arch == null + then + if release then "armv7" else "i386" + else arch; + + _sdk = if sdk == null + then + if release then "iphoneos6.0" else "iphonesimulator6.0" + else sdk; + + # The following is to prevent repetition + deleteKeychain = "security delete-keychain $keychainName"; +in +stdenv.mkDerivation { + inherit name src; + buildInputs = [ xcodewrapper ]; + buildPhase = '' + ${stdenv.lib.optionalString release '' + export HOME=/Users/$(whoami) + keychainName="$(basename $out)" + + # Create a keychain + security create-keychain -p "" $keychainName + security default-keychain -s $keychainName + security unlock-keychain -p "" $keychainName + + # Import the certificate into the keychain + security import ${certificateFile} -k $keychainName -P "${certificatePassword}" -A + + # Determine provisioning ID + PROVISIONING_PROFILE=$(grep UUID -A1 -a ${provisioningProfile} | grep -o "[-A-Z0-9]\{36\}") + + if [ ! -f "$HOME/Library/MobileDevice/Provisioning Profiles/$PROVISIONING_PROFILE.mobileprovision" ] + then + # Copy provisioning profile into the home directory + mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles" + cp ${provisioningProfile} "$HOME/Library/MobileDevice/Provisioning Profiles/$PROVISIONING_PROFILE.mobileprovision" + fi + + # Check whether the identity can be found + security find-identity -p codesigning $keychainName + ''} + + # Do the building + xcodebuild -target ${_target} -configuration ${_configuration} -scheme ${_scheme} -sdk ${_sdk} -arch ${_arch} ONLY_ACTIVE_ARCH=NO CONFIGURATION_TEMP_DIR=$TMPDIR CONFIGURATION_BUILD_DIR=$out ${if generateXCArchive then "archive" else ""} ${xcodeFlags} ${if release then ''"CODE_SIGN_IDENTITY=${codeSignIdentity}" PROVISIONING_PROFILE=$PROVISIONING_PROFILE OTHER_CODE_SIGN_FLAGS="--keychain $HOME/Library/Keychains/$keychainName"'' else ""} + + ${stdenv.lib.optionalString release '' + ${stdenv.lib.optionalString generateIPA '' + # Produce an IPA file + xcrun -sdk iphoneos PackageApplication -v $out/*.app -o $out/${name}.ipa + ''} + + # Delete our temp keychain + ${deleteKeychain} + ''} + ''; + + failureHook = stdenv.lib.optionalString release deleteKeychain; + + installPhase = "true"; +} diff --git a/pkgs/development/mobile/xcodeenv/default.nix b/pkgs/development/mobile/xcodeenv/default.nix new file mode 100644 index 00000000000..7f834688e63 --- /dev/null +++ b/pkgs/development/mobile/xcodeenv/default.nix @@ -0,0 +1,15 @@ +{stdenv}: + +rec { + xcodewrapper = import ./xcodewrapper.nix { + inherit stdenv; + }; + + buildApp = import ./build-app.nix { + inherit stdenv xcodewrapper; + }; + + simulateApp = import ./simulate-app.nix { + inherit stdenv xcodewrapper; + }; +} diff --git a/pkgs/development/mobile/xcodeenv/simulate-app.nix b/pkgs/development/mobile/xcodeenv/simulate-app.nix new file mode 100644 index 00000000000..456732abe1f --- /dev/null +++ b/pkgs/development/mobile/xcodeenv/simulate-app.nix @@ -0,0 +1,17 @@ +{stdenv, xcodewrapper}: +{name, app, device ? "iPhone", baseDir ? ""}: + +stdenv.mkDerivation { + inherit name; + buildCommand = '' + ensureDir $out/bin + cat > $out/bin/run-test-simulator << "EOF" + #! ${stdenv.shell} -e + + cd ${app}/${baseDir}/${name}.app + "$(readlink "${xcodewrapper}/bin/iPhone Simulator")" -SimulateApplication ./${name} -SimulateDevice '${device}' + EOF + chmod +x $out/bin/run-test-simulator + ''; +} + diff --git a/pkgs/development/mobile/xcodeenv/xcodewrapper.nix b/pkgs/development/mobile/xcodeenv/xcodewrapper.nix new file mode 100644 index 00000000000..39804b1a248 --- /dev/null +++ b/pkgs/development/mobile/xcodeenv/xcodewrapper.nix @@ -0,0 +1,24 @@ +{stdenv}: + +let + version = "4.5.2"; +in +stdenv.mkDerivation { + name = "xcode-wrapper-"+version; + buildCommand = '' + ensureDir $out/bin + cd $out/bin + ln -s /usr/bin/xcode-select + ln -s /usr/bin/xcodebuild + ln -s /usr/bin/xcrun + ln -s /usr/bin/security + ln -s "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/iPhone Simulator" + + # Check if we have the xcodebuild version that we want + if [ -z "$($out/bin/xcodebuild -version | grep ${version})" ] + then + echo "We require xcodebuild version: ${version}" + exit 1 + fi + ''; +} |