about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSander van der Burg <svanderburg@gmail.com>2018-11-17 21:55:49 +0100
committerSander van der Burg <svanderburg@gmail.com>2018-12-18 21:16:06 +0100
commit907216a57d1c478486d71f8b085f7019114c6fce (patch)
treec80d388b21e5a38bbf4648bebe685d9841a3cec4
parent74750dc67d0b51d7eb8976a3ffb52d047490ed90 (diff)
downloadnixlib-907216a57d1c478486d71f8b085f7019114c6fce.tar
nixlib-907216a57d1c478486d71f8b085f7019114c6fce.tar.gz
nixlib-907216a57d1c478486d71f8b085f7019114c6fce.tar.bz2
nixlib-907216a57d1c478486d71f8b085f7019114c6fce.tar.lz
nixlib-907216a57d1c478486d71f8b085f7019114c6fce.tar.xz
nixlib-907216a57d1c478486d71f8b085f7019114c6fce.tar.zst
nixlib-907216a57d1c478486d71f8b085f7019114c6fce.zip
Replace xcodeenv with new implementation
-rw-r--r--pkgs/development/mobile/xcodeenv/build-app.nix101
-rw-r--r--pkgs/development/mobile/xcodeenv/compose-xcodewrapper.nix (renamed from pkgs/development/mobile/xcodeenv/xcodewrapper.nix)6
-rw-r--r--pkgs/development/mobile/xcodeenv/default.nix10
-rw-r--r--pkgs/development/mobile/xcodeenv/install.html.template6
-rw-r--r--pkgs/development/mobile/xcodeenv/simulate-app.nix61
5 files changed, 100 insertions, 84 deletions
diff --git a/pkgs/development/mobile/xcodeenv/build-app.nix b/pkgs/development/mobile/xcodeenv/build-app.nix
index d7dd2d1190d8..90fa307fbf23 100644
--- a/pkgs/development/mobile/xcodeenv/build-app.nix
+++ b/pkgs/development/mobile/xcodeenv/build-app.nix
@@ -1,14 +1,13 @@
-{stdenv, xcodewrapper}:
+{stdenv, composeXcodeWrapper}:
 { name
 , src
-, sdkVersion ? "11.2"
+, sdkVersion ? "11.3"
 , target ? null
 , configuration ? null
 , scheme ? null
 , sdk ? null
 , xcodeFlags ? ""
 , release ? false
-, codeSignIdentity ? null
 , certificateFile ? null
 , certificatePassword ? null
 , provisioningProfile ? null
@@ -18,24 +17,23 @@
 , enableWirelessDistribution ? false
 , installURL ? null
 , bundleId ? null
-, version ? null
-, title ? null
-, meta ? {}
-}:
+, appVersion ? null
+, ...
+}@args:
 
-assert release -> codeSignIdentity != null && certificateFile != null && certificatePassword != null && provisioningProfile != null && signMethod != null;
-assert enableWirelessDistribution -> installURL != null && bundleId != null && version != null && title != null;
+assert release -> certificateFile != null && certificatePassword != null && provisioningProfile != null && signMethod != null;
+assert enableWirelessDistribution -> installURL != null && bundleId != null && appVersion != null;
 
 let
   # Set some default values here
-  
+
   _target = if target == null then name else target;
 
   _configuration = if configuration == null
     then
       if release then "Release" else "Debug"
     else configuration;
-    
+
   _sdk = if sdk == null
     then
       if release then "iphoneos" + sdkVersion else "iphonesimulator" + sdkVersion
@@ -46,41 +44,45 @@ let
     security default-keychain -s login.keychain
     security delete-keychain $keychainName
   '';
+
+  xcodewrapperFormalArgs = builtins.functionArgs composeXcodeWrapper;
+  xcodewrapperArgs = builtins.intersectAttrs xcodewrapperFormalArgs args;
+  xcodewrapper = composeXcodeWrapper xcodewrapperArgs;
+
+  extraArgs = removeAttrs args ([ "name" "scheme" "xcodeFlags" "release" "certificateFile" "certificatePassword" "provisioningProfile" "signMethod" "generateIPA" "generateXCArchive" "enableWirelessDistribution" "installURL" "bundleId" "version" ] ++ builtins.attrNames xcodewrapperFormalArgs);
 in
-stdenv.mkDerivation {
-  name = stdenv.lib.replaceChars [" "] [""] name;
-  inherit src;
-  inherit meta;
+stdenv.mkDerivation ({
+  name = stdenv.lib.replaceChars [" "] [""] name; # iOS app names can contain spaces, but in the Nix store this is not allowed
   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 
-
-        # Grant the codesign utility permissions to read from the keychain
-        security set-key-partition-list -S apple-tool:,apple: -s -k "" $keychainName
-        
-        # Determine provisioning ID
-        PROVISIONING_PROFILE=$(grep UUID -A1 -a ${provisioningProfile} | grep -o "[-A-Za-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
-      ''}
+      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 
+
+      # Grant the codesign utility permissions to read from the keychain
+      security set-key-partition-list -S apple-tool:,apple: -s -k "" $keychainName
+
+      # Determine provisioning ID
+      PROVISIONING_PROFILE=$(grep UUID -A1 -a ${provisioningProfile} | grep -o "[-A-Za-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
     export LD=clang # To avoid problem with -isysroot parameter that is unrecognized by the stock ld. Comparison with an impure build shows that it uses clang instead. Ugly, but it works
@@ -116,10 +118,11 @@ stdenv.mkDerivation {
         # Add IPA to Hydra build products
         mkdir -p $out/nix-support
         echo "file binary-dist \"$(echo $out/*.ipa)\"" > $out/nix-support/hydra-build-products
-        
+
         ${stdenv.lib.optionalString enableWirelessDistribution ''
-          appname=$(basename $out/*.ipa .ipa)
-          sed -e "s|@INSTALL_URL@|${installURL}?bundleId=${bundleId}\&amp;version=${version}\&amp;title=$appname|" ${./install.html.template} > $out/$appname.html
+          # Add another hacky build product that enables wireless adhoc installations
+          appname="$(basename "$out/*.ipa" .ipa)"
+          sed -e "s|@INSTALL_URL@|${installURL}?bundleId=${bundleId}\&amp;version=${appVersion}\&amp;title=$appname|" ${./install.html.template} > $out/$appname.html
           echo "doc install \"$out/$appname.html\"" >> $out/nix-support/hydra-build-products
         ''}
       ''}
@@ -127,13 +130,13 @@ stdenv.mkDerivation {
         mkdir -p $out
         mv "${name}.xcarchive" $out
       ''}
-      
+
       # Delete our temp keychain
       ${deleteKeychain}
     ''}
   '';
-  
+
   failureHook = stdenv.lib.optionalString release deleteKeychain;
-  
+
   installPhase = "true";
-}
+} // extraArgs)
diff --git a/pkgs/development/mobile/xcodeenv/xcodewrapper.nix b/pkgs/development/mobile/xcodeenv/compose-xcodewrapper.nix
index 38afe86c5aa5..d0093ffac91b 100644
--- a/pkgs/development/mobile/xcodeenv/xcodewrapper.nix
+++ b/pkgs/development/mobile/xcodeenv/compose-xcodewrapper.nix
@@ -1,4 +1,7 @@
-{stdenv, version, xcodeBaseDir}:
+{stdenv}:
+{version ? "9.3", xcodeBaseDir ? "/Applications/Xcode.app"}:
+
+assert stdenv.isDarwin;
 
 stdenv.mkDerivation {
   name = "xcode-wrapper-"+version;
@@ -9,6 +12,7 @@ stdenv.mkDerivation {
     ln -s /usr/bin/security
     ln -s /usr/bin/codesign
     ln -s /usr/bin/xcrun
+    ln -s /usr/bin/plutil
     ln -s "${xcodeBaseDir}/Contents/Developer/usr/bin/xcodebuild"
     ln -s "${xcodeBaseDir}/Contents/Developer/Applications/Simulator.app/Contents/MacOS/Simulator"
 
diff --git a/pkgs/development/mobile/xcodeenv/default.nix b/pkgs/development/mobile/xcodeenv/default.nix
index b3b9dbdf07ac..47686e6d69e9 100644
--- a/pkgs/development/mobile/xcodeenv/default.nix
+++ b/pkgs/development/mobile/xcodeenv/default.nix
@@ -1,15 +1,15 @@
-{stdenv, version ? "9.2", xcodeBaseDir ? "/Applications/Xcode.app"}:
+{stdenv}:
 
 rec {
-  xcodewrapper = import ./xcodewrapper.nix {
-    inherit stdenv version xcodeBaseDir;
+  composeXcodeWrapper = import ./compose-xcodewrapper.nix {
+    inherit stdenv;
   };
 
   buildApp = import ./build-app.nix {
-    inherit stdenv xcodewrapper;
+    inherit stdenv composeXcodeWrapper;
   };
 
   simulateApp = import ./simulate-app.nix {
-    inherit stdenv xcodewrapper;
+    inherit stdenv composeXcodeWrapper;
   };
 }
diff --git a/pkgs/development/mobile/xcodeenv/install.html.template b/pkgs/development/mobile/xcodeenv/install.html.template
index 833b1994162c..d48fda7f38b9 100644
--- a/pkgs/development/mobile/xcodeenv/install.html.template
+++ b/pkgs/development/mobile/xcodeenv/install.html.template
@@ -4,14 +4,14 @@
     <head>
         <title>Install IPA</title>
     </head>
-    
+
     <body>
         <a id="forwardlink" href="@INSTALL_URL@">Go to the install page or wait a second</a>
-        
+
         <script type="text/javascript">
             setTimeout(function() {
                 var link = document.getElementById('forwardlink');
-                
+
                 if(document.createEvent) {
                     var eventObj = document.createEvent('MouseEvents');
                     eventObj.initEvent('click', true, false);
diff --git a/pkgs/development/mobile/xcodeenv/simulate-app.nix b/pkgs/development/mobile/xcodeenv/simulate-app.nix
index 04b6f2cbc834..1a55f8366a3b 100644
--- a/pkgs/development/mobile/xcodeenv/simulate-app.nix
+++ b/pkgs/development/mobile/xcodeenv/simulate-app.nix
@@ -1,47 +1,56 @@
-{stdenv, xcodewrapper}:
-{name, bundleId, app}:
+{stdenv, composeXcodeWrapper}:
+{name, app ? null, bundleId ? null, ...}@args:
 
+assert app != null -> bundleId != null;
+
+let
+  xcodewrapperArgs = builtins.intersectAttrs (builtins.functionArgs composeXcodeWrapper) args;
+
+  xcodewrapper = composeXcodeWrapper xcodewrapperArgs;
+in
 stdenv.mkDerivation {
   name = stdenv.lib.replaceChars [" "] [""] name;
   buildCommand = ''
     mkdir -p $out/bin
     cat > $out/bin/run-test-simulator << "EOF"
     #! ${stdenv.shell} -e
-    
+
     if [ "$1" = "" ]
     then
         # Show the user the possibile UDIDs and let him pick one, if none is provided as a command-line parameter
         xcrun simctl list
-        
+
         echo "Please provide a UDID of a simulator:"
         read udid
     else
         # If a parameter has been provided, consider that a device UDID and use that
         udid="$1"
     fi
-    
+
     # Open the simulator instance
     open -a "$(readlink "${xcodewrapper}/bin/Simulator")" --args -CurrentDeviceUDID $udid
-    
-    # Copy the app and restore the write permissions
-    appTmpDir=$(mktemp -d -t appTmpDir)
-    cp -r "$(echo ${app}/*.app)" "$appTmpDir"
-    chmod -R 755 "$(echo $appTmpDir/*.app)"
-    
-    # Wait for the simulator to start
-    echo "Press enter when the simulator is started..."
-    read
-    
-    # Install the app
-    xcrun simctl install "$udid" "$(echo $appTmpDir/*.app)"
-    
-    # Remove the app tempdir
-    rm -Rf $appTmpDir
-    
-    # Launch the app in the simulator
-    xcrun simctl launch $udid "${bundleId}"
-    EOF
-
-    chmod +x $out/bin/run-test-simulator
+
+    ${stdenv.lib.optionalString (app != null) ''
+      # Copy the app and restore the write permissions
+      appTmpDir=$(mktemp -d -t appTmpDir)
+      cp -r "$(echo ${app}/*.app)" "$appTmpDir"
+      chmod -R 755 "$(echo $appTmpDir/*.app)"
+
+      # Wait for the simulator to start
+      echo "Press enter when the simulator is started..."
+      read
+
+      # Install the app
+      xcrun simctl install "$udid" "$(echo $appTmpDir/*.app)"
+
+      # Remove the app tempdir
+      rm -Rf $appTmpDir
+
+      # Launch the app in the simulator
+      xcrun simctl launch $udid "${bundleId}"
+      EOF
+
+      chmod +x $out/bin/run-test-simulator
+    ''}
   '';
 }