summaryrefslogtreecommitdiffstats
path: root/pkgs/development/mobile/xcodeenv
diff options
context:
space:
mode:
authorSander van der Burg <sander@conference-compass.com>2013-01-07 16:52:42 +0100
committerSander van der Burg <sander@conference-compass.com>2013-01-07 16:52:42 +0100
commit5b0ca88d97d005a73a2be38e7a521af70875a718 (patch)
treeb2eba8467fa5e1ecd1cac6ab8513582651647e44 /pkgs/development/mobile/xcodeenv
parenta547de1ecb14853487d864f70ad5e6a1cb3ce08d (diff)
- 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.nix92
-rw-r--r--pkgs/development/mobile/xcodeenv/default.nix15
-rw-r--r--pkgs/development/mobile/xcodeenv/simulate-app.nix17
-rw-r--r--pkgs/development/mobile/xcodeenv/xcodewrapper.nix24
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 000000000000..3ac9e4bb9581
--- /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 000000000000..7f834688e636
--- /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 000000000000..456732abe1f4
--- /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 000000000000..39804b1a248b
--- /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
+ '';
+}