about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--pkgs/os-specific/darwin/apple-source-releases/default.nix11
-rw-r--r--pkgs/os-specific/darwin/ios-cross/default.nix54
-rw-r--r--pkgs/stdenv/cross/default.nix6
-rw-r--r--pkgs/stdenv/default.nix6
-rw-r--r--pkgs/top-level/all-packages.nix4
5 files changed, 77 insertions, 4 deletions
diff --git a/pkgs/os-specific/darwin/apple-source-releases/default.nix b/pkgs/os-specific/darwin/apple-source-releases/default.nix
index 8625ac72c104..d86754ecc74c 100644
--- a/pkgs/os-specific/darwin/apple-source-releases/default.nix
+++ b/pkgs/os-specific/darwin/apple-source-releases/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, fetchzip, pkgs }:
+{ stdenv, fetchurl, fetchzip, pkgs, fetchurlBoot }:
 
 let
   # This attrset can in theory be computed automatically, but for that to work nicely we need
@@ -123,7 +123,14 @@ let
     };
   };
 
-  fetchApple = version: sha256: name: fetchurl {
+  fetchApple = version: sha256: name: let
+    # When cross-compiling, fetchurl depends on libiconv, resulting
+    # in an infinite recursion without this. It's not clear why this
+    # worked fine when not cross-compiling
+    fetch = if name == "libiconv"
+      then fetchurlBoot
+      else fetchurl;
+  in fetch {
     url = "http://www.opensource.apple.com/tarballs/${name}/${name}-${versions.${version}.${name}}.tar.gz";
     inherit sha256;
   };
diff --git a/pkgs/os-specific/darwin/ios-cross/default.nix b/pkgs/os-specific/darwin/ios-cross/default.nix
new file mode 100644
index 000000000000..d9f4320556c9
--- /dev/null
+++ b/pkgs/os-specific/darwin/ios-cross/default.nix
@@ -0,0 +1,54 @@
+{ runCommand
+, lib
+, llvm
+, clang
+, binutils
+, stdenv
+, coreutils
+, gnugrep
+}: { prefix, arch, simulator ? false }: let
+  sdkType = if simulator then "Simulator" else "OS";
+
+  sdk = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhone${sdkType}.platform/Developer/SDKs/iPhone${sdkType}10.0.sdk";
+
+  /* TODO: Properly integrate with gcc-cross-wrapper */
+  wrapper = import ../../../build-support/cc-wrapper {
+    inherit stdenv coreutils gnugrep;
+    nativeTools = false;
+    nativeLibc = false;
+    inherit binutils;
+    libc = runCommand "empty-libc" {} "mkdir -p $out/{lib,include}";
+    cc = clang;
+    extraBuildCommands = ''
+      # ugh
+      tr '\n' ' ' < $out/nix-support/cc-cflags > cc-cflags.tmp
+      mv cc-cflags.tmp $out/nix-support/cc-cflags
+      echo "-target ${prefix} -arch ${arch} -idirafter ${sdk}/usr/include ${if simulator then "-mios-simulator-version-min=7.0" else "-miphoneos-version-min=7.0"}" >> $out/nix-support/cc-cflags
+
+      # Purposefully overwrite libc-ldflags-before, cctools ld doesn't know dynamic-linker and cc-wrapper doesn't do cross-compilation well enough to adjust
+      echo "-arch ${arch} -L${sdk}/usr/lib -L${sdk}/usr/lib/system" > $out/nix-support/libc-ldflags-before
+    '';
+  };
+in {
+  cc = runCommand "${prefix}-cc" {} ''
+    mkdir -p $out/bin
+    ln -sv ${wrapper}/bin/clang $out/bin/${prefix}-cc
+    mkdir -p $out/nix-support
+    echo ${llvm} > $out/nix-support/propagated-native-build-inputs
+    cat > $out/nix-support/setup-hook <<EOF
+    if test "\$dontSetConfigureCross" != "1"; then
+        configureFlags="\$configureFlags --host=${prefix}"
+    fi
+    EOF
+    fixupPhase
+  '';
+
+  binutils = runCommand "${prefix}-binutils" {} ''
+    mkdir -p $out/bin
+    ln -sv ${wrapper}/bin/ld $out/bin/${prefix}-ld
+    for prog in ar nm ranlib; do
+      ln -s ${binutils}/bin/$prog $out/bin/${prefix}-$prog
+    done
+    fixupPhase
+  '';
+}
diff --git a/pkgs/stdenv/cross/default.nix b/pkgs/stdenv/cross/default.nix
index 575692ca0126..0cde6a05943e 100644
--- a/pkgs/stdenv/cross/default.nix
+++ b/pkgs/stdenv/cross/default.nix
@@ -26,4 +26,10 @@ rec {
   stdenvCross = buildPackages.makeStdenvCross
     buildPackages.stdenv crossSystem
     buildPackages.binutilsCross buildPackages.gccCrossStageFinal;
+
+  stdenvCrossiOS = let
+    inherit (buildPackages.darwin.ios-cross { prefix = crossSystem.config; inherit (crossSystem) arch; simulator = crossSystem.isiPhoneSimulator or false; }) cc binutils;
+  in buildPackages.makeStdenvCross
+    buildPackages.stdenv crossSystem
+    binutils cc;
 }
diff --git a/pkgs/stdenv/default.nix b/pkgs/stdenv/default.nix
index 10086ee6a853..4be34a35acb3 100644
--- a/pkgs/stdenv/default.nix
+++ b/pkgs/stdenv/default.nix
@@ -38,13 +38,15 @@ rec {
 
   inherit (import ./darwin { inherit system allPackages platform config; }) stdenvDarwin;
 
-  inherit (import ./cross { inherit system allPackages platform crossSystem config lib; }) stdenvCross;
+  inherit (import ./cross { inherit system allPackages platform crossSystem config lib; }) stdenvCross stdenvCrossiOS;
 
   inherit (import ./custom { inherit system allPackages platform crossSystem config lib; }) stdenvCustom;
 
   # Select the appropriate stdenv for the platform `system'.
   stdenv =
-    if crossSystem != null then stdenvCross else
+    if crossSystem != null then
+      if crossSystem.useiOSCross or false then stdenvCrossiOS
+      else stdenvCross else
     if config ? replaceStdenv then stdenvCustom else
     if system == "i686-linux" then stdenvLinux else
     if system == "x86_64-linux" then stdenvLinux else
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index cbe19d190152..e376eb40d62c 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -10624,6 +10624,10 @@ in
 
     swift-corefoundation = callPackage ../os-specific/darwin/swift-corefoundation {};
 
+    ios-cross = callPackage ../os-specific/darwin/ios-cross {
+      inherit (darwin) binutils;
+    };
+
     xcode = callPackage ../os-specific/darwin/xcode {};
 
     osx_sdk = callPackage ../os-specific/darwin/osx-sdk {};