diff --git a/pkgs/os-specific/darwin/apple-source-releases/default.nix b/pkgs/os-specific/darwin/apple-source-releases/default.nix index 8625ac72c10..d86754ecc74 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 00000000000..d9f4320556c --- /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 <