diff options
-rw-r--r-- | pkgs/os-specific/darwin/apple-source-releases/default.nix | 11 | ||||
-rw-r--r-- | pkgs/os-specific/darwin/ios-cross/default.nix | 54 | ||||
-rw-r--r-- | pkgs/stdenv/cross/default.nix | 6 | ||||
-rw-r--r-- | pkgs/stdenv/default.nix | 6 | ||||
-rw-r--r-- | pkgs/top-level/all-packages.nix | 4 |
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 {}; |