about summary refs log tree commit diff
path: root/pkgs/os-specific/darwin
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2016-11-15 16:31:55 -0500
committerShea Levy <shea@shealevy.com>2016-11-15 16:31:55 -0500
commit7df3d7446f868170848227cd972fa833c827f07c (patch)
tree5b2ff67e13aa0c5e94c46a6bf2b8564c4282bb78 /pkgs/os-specific/darwin
parent2ca507a2b8408228cacb56f59dfbf0039bcff6c2 (diff)
downloadnixlib-7df3d7446f868170848227cd972fa833c827f07c.tar
nixlib-7df3d7446f868170848227cd972fa833c827f07c.tar.gz
nixlib-7df3d7446f868170848227cd972fa833c827f07c.tar.bz2
nixlib-7df3d7446f868170848227cd972fa833c827f07c.tar.lz
nixlib-7df3d7446f868170848227cd972fa833c827f07c.tar.xz
nixlib-7df3d7446f868170848227cd972fa833c827f07c.tar.zst
nixlib-7df3d7446f868170848227cd972fa833c827f07c.zip
Add initial basic support for cross-compiling to iOS
Diffstat (limited to 'pkgs/os-specific/darwin')
-rw-r--r--pkgs/os-specific/darwin/apple-source-releases/default.nix11
-rw-r--r--pkgs/os-specific/darwin/ios-cross/default.nix54
2 files changed, 63 insertions, 2 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
+  '';
+}