From 7df3d7446f868170848227cd972fa833c827f07c Mon Sep 17 00:00:00 2001 From: Shea Levy Date: Tue, 15 Nov 2016 16:31:55 -0500 Subject: [PATCH] Add initial basic support for cross-compiling to iOS --- .../darwin/apple-source-releases/default.nix | 11 +++- pkgs/os-specific/darwin/ios-cross/default.nix | 54 +++++++++++++++++++ pkgs/stdenv/cross/default.nix | 6 +++ pkgs/stdenv/default.nix | 6 ++- pkgs/top-level/all-packages.nix | 4 ++ 5 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 pkgs/os-specific/darwin/ios-cross/default.nix 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 <