From ebc224377853eb2a67f59aa68d95d94fc8770a77 Mon Sep 17 00:00:00 2001 From: Ken Micklas Date: Sun, 15 Apr 2018 19:22:08 -0400 Subject: [PATCH 1/4] binutils: Add iOS as a supported platform --- .../tools/misc/binutils/default.nix | 10 +- .../tools/misc/binutils/support-ios.patch | 112 ++++++++++++++++++ 2 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 pkgs/development/tools/misc/binutils/support-ios.patch diff --git a/pkgs/development/tools/misc/binutils/default.nix b/pkgs/development/tools/misc/binutils/default.nix index 5c88902a68c4..123f679d779d 100644 --- a/pkgs/development/tools/misc/binutils/default.nix +++ b/pkgs/development/tools/misc/binutils/default.nix @@ -1,5 +1,5 @@ { stdenv, buildPackages -, fetchurl, zlib +, fetchurl, zlib, autoreconfHook264 , buildPlatform, hostPlatform, targetPlatform , noSysDirs, gold ? true, bison ? null }: @@ -64,12 +64,16 @@ stdenv.mkDerivation rec { # https://sourceware.org/bugzilla/show_bug.cgi?id=22868 ./gold-symbol-visibility.patch - ]; + ] ++ stdenv.lib.optional targetPlatform.isiOS ./support-ios.patch; outputs = [ "out" "info" "man" ]; depsBuildBuild = [ buildPackages.stdenv.cc ]; - nativeBuildInputs = [ bison ]; + nativeBuildInputs = [ + bison + ] ++ stdenv.lib.optionals targetPlatform.isiOS [ + autoreconfHook264 + ]; buildInputs = [ zlib ]; inherit noSysDirs; diff --git a/pkgs/development/tools/misc/binutils/support-ios.patch b/pkgs/development/tools/misc/binutils/support-ios.patch new file mode 100644 index 000000000000..919a3920727f --- /dev/null +++ b/pkgs/development/tools/misc/binutils/support-ios.patch @@ -0,0 +1,112 @@ +diff --git a/bfd/config.bfd b/bfd/config.bfd +index f04a993f06..3357022f35 100644 +--- a/bfd/config.bfd ++++ b/bfd/config.bfd +@@ -238,7 +238,7 @@ case "${targ}" in + + # START OF targmatch.h + #ifdef BFD64 +- aarch64-*-darwin*) ++ aarch64-*-darwin* | aarch64-*-ios*) + targ_defvec=aarch64_mach_o_vec + targ_selvecs="arm_mach_o_vec mach_o_le_vec mach_o_be_vec mach_o_fat_vec" + targ_archs="$targ_archs bfd_i386_arch bfd_powerpc_arch bfd_rs6000_arch" +@@ -358,7 +358,7 @@ case "${targ}" in + targ_selvecs=arc_elf32_be_vec + ;; + +- arm-*-darwin*) ++ arm-*-darwin* | arm-*-ios*) + targ_defvec=arm_mach_o_vec + targ_selvecs="mach_o_le_vec mach_o_be_vec mach_o_fat_vec" + targ_archs="$targ_archs bfd_i386_arch bfd_powerpc_arch bfd_rs6000_arch" +diff --git a/configure.ac b/configure.ac +index aae94501e4..4b1121e0d1 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -510,7 +510,7 @@ if test x$enable_libgomp = x ; then + ;; + *-*-solaris2* | *-*-hpux11*) + ;; +- *-*-darwin* | *-*-aix*) ++ *-*-darwin* | *-*-ios* | *-*-aix*) + ;; + nvptx*-*-*) + ;; +@@ -706,7 +706,7 @@ case "${target}" in + ;; + x86_64-*-darwin[[912]]*) + ;; +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + noconfigdirs="$noconfigdirs target-libffi" + ;; + *-*-netware*) +@@ -788,7 +788,7 @@ esac + # Disable the go frontend on systems where it is known to not work. Please keep + # this in sync with contrib/config-list.mk. + case "${target}" in +-*-*-darwin* | *-*-cygwin* | *-*-mingw*) ++*-*-darwin* | *-*-ios* | *-*-cygwin* | *-*-mingw*) + unsupported_languages="$unsupported_languages go" + ;; + esac +@@ -797,7 +797,7 @@ esac + # For testing, you can easily override this with --enable-libgo. + if test x$enable_libgo = x; then + case "${target}" in +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + # PR 46986 + noconfigdirs="$noconfigdirs target-libgo" + ;; +@@ -916,11 +916,11 @@ esac + case "${target}" in + *-*-chorusos) + ;; +- aarch64-*-darwin*) ++ aarch64-*-darwin* | aarch64-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- arm-*-darwin*) ++ arm-*-darwin* | arm-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +@@ -936,7 +936,7 @@ case "${target}" in + noconfigdirs="$noconfigdirs ld gas gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + noconfigdirs="$noconfigdirs ld gas gdb gprof" + noconfigdirs="$noconfigdirs sim target-rda" + ;; +@@ -1226,7 +1226,7 @@ case "${host}" in + hppa*-*) + host_makefile_frag="config/mh-pa" + ;; +- *-*-darwin*) ++ *-*-darwin* | *-*-ios*) + host_makefile_frag="config/mh-darwin" + ;; + powerpc-*-aix*) +@@ -1708,7 +1708,7 @@ ACX_ELF_TARGET_IFELSE([# ELF platforms build the lto-plugin always. + # warn during gcc/ subconfigure; unless you're bootstrapping with + # -flto it won't be needed until after installation anyway. + case $target in +- *-cygwin* | *-mingw* | *-apple-darwin* | *djgpp*) ;; ++ *-cygwin* | *-mingw* | *-apple-darwin* | *-apple-ios* | *djgpp*) ;; + *) if test x"$enable_lto" = x"yes"; then + AC_MSG_ERROR([LTO support is not enabled for this target.]) + fi +@@ -2590,7 +2590,7 @@ rm -f conftest* + # Decide which environment variable is used to find dynamic libraries. + case "${host}" in + *-*-hpux*) RPATH_ENVVAR=SHLIB_PATH ;; +- *-*-darwin*) RPATH_ENVVAR=DYLD_LIBRARY_PATH ;; ++ *-*-darwin* | *-*-ios* ) RPATH_ENVVAR=DYLD_LIBRARY_PATH ;; + *-*-mingw* | *-*-cygwin ) RPATH_ENVVAR=PATH ;; + *) RPATH_ENVVAR=LD_LIBRARY_PATH ;; + esac From 60771af5b6fc183aa354ed95e4df32c497382414 Mon Sep 17 00:00:00 2001 From: Ken Micklas Date: Sun, 15 Apr 2018 19:22:17 -0400 Subject: [PATCH 2/4] cctools-port: Use old version for iOS to support TBD linking --- .../darwin/cctools/ld-tbd-v2.patch | 98 +++++++++++++++++++ pkgs/os-specific/darwin/cctools/port.nix | 37 ++++++- .../darwin/cctools/support-ios.patch | 13 +++ .../darwin/cctools/undo-unknown-triple.patch | 17 ++++ 4 files changed, 160 insertions(+), 5 deletions(-) create mode 100644 pkgs/os-specific/darwin/cctools/ld-tbd-v2.patch create mode 100644 pkgs/os-specific/darwin/cctools/support-ios.patch create mode 100644 pkgs/os-specific/darwin/cctools/undo-unknown-triple.patch diff --git a/pkgs/os-specific/darwin/cctools/ld-tbd-v2.patch b/pkgs/os-specific/darwin/cctools/ld-tbd-v2.patch new file mode 100644 index 000000000000..9aae2be1d033 --- /dev/null +++ b/pkgs/os-specific/darwin/cctools/ld-tbd-v2.patch @@ -0,0 +1,98 @@ +diff --git a/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp b/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp +index 09c0e12..ac6b085 100644 +--- a/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp ++++ b/cctools/ld64/src/ld/parsers/textstub_dylib_file.cpp +@@ -187,6 +187,7 @@ struct DynamicLibrary { + ld::File::ObjcConstraint _objcConstraint; + Options::Platform _platform; + std::vector _allowedClients; ++ std::vector _allowableClients; + std::vector _reexportedLibraries; + std::vector _symbols; + std::vector _classes; +@@ -246,6 +247,14 @@ class TBDFile { + }); + } + ++ void parseAllowableClients(DynamicLibrary& lib) { ++ if ( !hasOptionalToken("allowable-clients") ) ++ return; ++ parseFlowSequence([&](Token name) { ++ lib._allowableClients.emplace_back(name); ++ }); ++ } ++ + void parseReexportedDylibs(DynamicLibrary& lib) { + if ( !hasOptionalToken("re-exports") ) + return; +@@ -306,6 +315,21 @@ class TBDFile { + return false; + } + ++ void skipUUIDs(DynamicLibrary& lib) { ++ expectToken("uuids"); ++ while ( true ) { ++ auto token = next(); ++ if ( token == "]" ) ++ break; ++ } ++ } ++ ++ void skipParentUmbrella(DynamicLibrary& lib) { ++ if (!hasOptionalToken("parent-umbrella")) ++ return; ++ next(); ++ } ++ + void parsePlatform(DynamicLibrary& lib) { + expectToken("platform"); + +@@ -410,6 +434,7 @@ class TBDFile { + } + + parseAllowedClients(lib); ++ parseAllowableClients(lib); + parseReexportedDylibs(lib); + parseSymbols(lib); + if ( !hasOptionalToken("-") ) +@@ -455,17 +480,21 @@ class TBDFile { + return result.front(); + } + +- void parseDocument(DynamicLibrary& lib, std::string &requestedArchName) { ++ void parseDocument(DynamicLibrary& lib, std::string &requestedArchName, bool isTbdV2) { + auto selectedArchName = parseAndSelectArchitecture(requestedArchName); + if (selectedArchName.empty()) + throwf("invalid arch"); + ++ if(isTbdV2) ++ skipUUIDs(lib); + parsePlatform(lib); + parseInstallName(lib); + parseCurrentVersion(lib); + parseCompatibilityVersion(lib); + parseSwiftVersion(lib); + parseObjCConstraint(lib); ++ if(isTbdV2) ++ skipParentUmbrella(lib); + parseExportsBlock(lib, selectedArchName); + } + +@@ -476,7 +505,8 @@ public: + _tokenizer.reset(); + DynamicLibrary lib; + expectToken("---"); +- parseDocument(lib, requestedArchName); ++ auto isTbdV2 = hasOptionalToken("!tapi-tbd-v2"); ++ parseDocument(lib, requestedArchName, isTbdV2); + expectToken("..."); + return lib; + } +@@ -486,6 +516,7 @@ public: + auto token = next(); + if ( token != "---" ) + return false; ++ hasOptionalToken("!tapi-tbd-v2"); + return !parseAndSelectArchitecture(requestedArchName).empty(); + } + diff --git a/pkgs/os-specific/darwin/cctools/port.nix b/pkgs/os-specific/darwin/cctools/port.nix index 55995c1592d1..d8abdc2c6f84 100644 --- a/pkgs/os-specific/darwin/cctools/port.nix +++ b/pkgs/os-specific/darwin/cctools/port.nix @@ -1,4 +1,4 @@ -{ stdenv, fetchFromGitHub, makeWrapper, autoconf, automake, libtool_2 +{ stdenv, fetchFromGitHub, makeWrapper, autoconf, automake, libtool_2, autoreconfHook , llvm, libcxx, libcxxabi, clang, libuuid , libobjc ? null, maloader ? null, xctoolchain ? null , hostPlatform, targetPlatform @@ -6,6 +6,14 @@ }: let + + # We need to use an old version of cctools-port to support linking TBD files + # in the iOS SDK. Note that this only provides support for SDK versions up to + # 10.x. For 11.0 and higher we will need to upgrade to a newer cctools than the + # default version here, which can support the new TBD format via Apple's + # libtapi. + useOld = targetPlatform.isiOS; + # The targetPrefix prepended to binary names to allow multiple binuntils on the # PATH to both be usable. targetPrefix = stdenv.lib.optionalString @@ -16,10 +24,12 @@ in # Non-Darwin alternatives assert (!hostPlatform.isDarwin) -> (maloader != null && xctoolchain != null); +assert enableDumpNormalizedLibArgs -> (!useOld); + let baseParams = rec { name = "${targetPrefix}cctools-port-${version}"; - version = "895"; + version = if useOld then "886" else "895"; src = fetchFromGitHub (if enableDumpNormalizedLibArgs then { owner = "tpoechtrager"; @@ -27,6 +37,11 @@ let # master with https://github.com/tpoechtrager/cctools-port/pull/34 rev = "8395d4b2c3350356e2fb02f5e04f4f463c7388df"; sha256 = "10vbf1cfzx02q8chc77s84fp2kydjpx2y682mr6mrbb7sq5rwh8f"; + } else if useOld then { + owner = "tpoechtrager"; + repo = "cctools-port"; + rev = "02f0b8ecd87a3951653d838a321ae744815e21a5"; + sha256 = "0bzyabzr5dvbxglr74d0kbrk2ij5x7s5qcamqi1v546q1had1wz1"; } else { owner = "tpoechtrager"; repo = "cctools-port"; @@ -36,7 +51,11 @@ let outputs = [ "out" "dev" ]; - nativeBuildInputs = [ autoconf automake libtool_2 ]; + nativeBuildInputs = [ + autoconf automake libtool_2 + ] ++ stdenv.lib.optionals useOld [ + autoreconfHook + ]; buildInputs = [ libuuid ] ++ # Only need llvm and clang if the stdenv isn't already clang-based (TODO: just make a stdenv.cc.isClang) stdenv.lib.optionals (!stdenv.isDarwin) [ llvm clang ] ++ @@ -44,9 +63,14 @@ let patches = [ ./ld-rpath-nonfinal.patch ./ld-ignore-rpath-link.patch + ] ++ stdenv.lib.optionals useOld [ + # See https://github.com/tpoechtrager/cctools-port/issues/24. Remove when that's fixed. + ./undo-unknown-triple.patch + ./ld-tbd-v2.patch + ./support-ios.patch ]; - __propagatedImpureHostDeps = [ + __propagatedImpureHostDeps = stdenv.lib.optionals (!useOld) [ # As far as I can tell, otool from cctools is the only thing that depends on these two, and we should fix them "/usr/lib/libobjc.A.dylib" "/usr/lib/libobjc.dylib" @@ -86,12 +110,15 @@ let EOF '' + stdenv.lib.optionalString (!stdenv.isDarwin) '' sed -i -e 's|clang++|& -I${libcxx}/include/c++/v1|' cctools/autogen.sh + '' + stdenv.lib.optionalString useOld '' + cd cctools ''; # TODO: this builds an ld without support for LLVM's LTO. We need to teach it, but that's rather # hairy to handle during bootstrap. Perhaps it could be optional? - preConfigure = '' + preConfigure = stdenv.lib.optionalString (!useOld) '' cd cctools + '' + '' sh autogen.sh ''; diff --git a/pkgs/os-specific/darwin/cctools/support-ios.patch b/pkgs/os-specific/darwin/cctools/support-ios.patch new file mode 100644 index 000000000000..f78c6b63ac80 --- /dev/null +++ b/pkgs/os-specific/darwin/cctools/support-ios.patch @@ -0,0 +1,13 @@ +diff --git a/cctools/configure.ac b/cctools/configure.ac +index 56e8f24..0b4b3ff 100644 +--- a/cctools/configure.ac ++++ b/cctools/configure.ac +@@ -39,7 +39,7 @@ EXTRACXXFLAGS="" + WARNINGS="" + + case $host_os in +- darwin* ) ++ darwin* | ios*) + isdarwin=yes + AM_CONDITIONAL([ISDARWIN], [true]) + ;; diff --git a/pkgs/os-specific/darwin/cctools/undo-unknown-triple.patch b/pkgs/os-specific/darwin/cctools/undo-unknown-triple.patch new file mode 100644 index 000000000000..7df9bdd16dab --- /dev/null +++ b/pkgs/os-specific/darwin/cctools/undo-unknown-triple.patch @@ -0,0 +1,17 @@ +diff --git a/cctools/as/driver.c b/cctools/as/driver.c +index b06d085..c03397a 100644 +--- a/cctools/as/driver.c ++++ b/cctools/as/driver.c +@@ -363,12 +363,6 @@ char **envp) + /* Add -c or clang will run ld(1). */ + new_argv[j] = "-c"; + j++; +- /* cctools-port start */ +- new_argv[j] = "-target"; +- j++; +- new_argv[j] = "unknown-apple-darwin"; +- j++; +- /* cctools-port end */ + new_argv[j] = NULL; + if(execute(new_argv, verbose)) + exit(0); From b1a8894a1cd386319f771998de417ce0a4a75b7c Mon Sep 17 00:00:00 2001 From: Ken Micklas Date: Mon, 16 Apr 2018 19:55:33 -0400 Subject: [PATCH 3/4] wrapBintoolsWith: Allow overriding extraBuildCommands --- pkgs/top-level/all-packages.nix | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index b074a5572dd0..56064138ac11 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -6916,15 +6916,14 @@ with pkgs; libc = if targetPlatform != hostPlatform then libcCross else stdenv.cc.libc; }; - wrapBintoolsWith = { bintools, libc }: bintoolsWrapperFun { + wrapBintoolsWith = { bintools, libc, extraBuildCommands ? "" }: bintoolsWrapperFun { nativeTools = targetPlatform == hostPlatform && stdenv.cc.nativeTools or false; nativeLibc = targetPlatform == hostPlatform && stdenv.cc.nativeLibc or false; nativePrefix = stdenv.cc.nativePrefix or ""; noLibc = (libc == null); - inherit bintools libc; - extraBuildCommands = ""; + inherit bintools libc extraBuildCommands; }; # prolog From ef3db7d14c90e1876d38ebc25428b4f65962ffbc Mon Sep 17 00:00:00 2001 From: Ken Micklas Date: Sun, 15 Apr 2018 19:21:45 -0400 Subject: [PATCH 4/4] ios-sdk-pkgs: Init from iOS SDK from XCode --- lib/systems/default.nix | 2 + pkgs/os-specific/darwin/ios-cross/default.nix | 61 ----------------- .../darwin/ios-sdk-pkgs/default.nix | 68 +++++++++++++++++++ pkgs/stdenv/cross/default.nix | 4 +- pkgs/top-level/all-packages.nix | 1 + pkgs/top-level/darwin-packages.nix | 20 ++++-- 6 files changed, 87 insertions(+), 69 deletions(-) delete mode 100644 pkgs/os-specific/darwin/ios-cross/default.nix create mode 100644 pkgs/os-specific/darwin/ios-sdk-pkgs/default.nix diff --git a/lib/systems/default.nix b/lib/systems/default.nix index bd408e00bb14..e7346a538d35 100644 --- a/lib/systems/default.nix +++ b/lib/systems/default.nix @@ -44,6 +44,8 @@ rec { }; # Misc boolean options useAndroidPrebuilt = false; + useiOSPrebuilt = false; + isiPhoneSimulator = false; } // mapAttrs (n: v: v final.parsed) inspect.predicates // args; in assert final.useAndroidPrebuilt -> final.isAndroid; diff --git a/pkgs/os-specific/darwin/ios-cross/default.nix b/pkgs/os-specific/darwin/ios-cross/default.nix deleted file mode 100644 index 175e9738ef9e..000000000000 --- a/pkgs/os-specific/darwin/ios-cross/default.nix +++ /dev/null @@ -1,61 +0,0 @@ -{ runCommand -, lib -, llvm -, clang -, binutils -, stdenv -, coreutils -, gnugrep -, buildPackages -, hostPlatform -, targetPlatform -}: - -/* As of this writing, known-good prefix/arch/simulator triples: - * aarch64-apple-darwin14 | arm64 | false - * arm-apple-darwin10 | armv7 | false - * i386-apple-darwin11 | i386 | true - * x86_64-apple-darwin14 | x86_64 | true - */ - -# Apple uses somewhat non-standard names for this. We could fall back on -# `targetPlatform.parsed.cpu.name`, but that would be a more standard one and -# likely to fail. Better just to require something manual. -assert targetPlatform ? arch; - -let - - prefix = targetPlatform.config; - inherit (targetPlatform) arch; - simulator = targetPlatform.isiPhoneSimulator or false; - - sdkType = if simulator then "Simulator" else "OS"; - - sdkVer = "10.2"; - - sdk = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhone${sdkType}.platform/Developer/SDKs/iPhone${sdkType}${sdkVer}.sdk"; - -in (import ../../../build-support/cc-wrapper { - inherit stdenv coreutils gnugrep runCommand buildPackages; - nativeTools = false; - nativeLibc = false; - inherit binutils; - libc = runCommand "empty-libc" {} "mkdir -p $out/{lib,include}"; - inherit (clang) cc; - inherit hostPlatform targetPlatform; - extraBuildCommands = '' - if ! [ -d ${sdk} ]; then - echo "You must have ${sdkVer} of the iPhone${sdkType} sdk installed at ${sdk}" >&2 - exit 1 - fi - # 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 ${lib.optionalString simulator "-L${sdk}/usr/lib/system "}-i${if simulator then "os_simulator" else "phoneos"}_version_min 7.0.0" > $out/nix-support/libc-ldflags-before - ''; - }) // { - inherit sdkType sdkVer sdk; - } diff --git a/pkgs/os-specific/darwin/ios-sdk-pkgs/default.nix b/pkgs/os-specific/darwin/ios-sdk-pkgs/default.nix new file mode 100644 index 000000000000..5b9f30b62c39 --- /dev/null +++ b/pkgs/os-specific/darwin/ios-sdk-pkgs/default.nix @@ -0,0 +1,68 @@ +{ lib, hostPlatform, targetPlatform +, clang-unwrapped +, binutils-unwrapped +, runCommand +, stdenv +, wrapBintoolsWith +, wrapCCWith +, buildIosSdk, targetIosSdkPkgs +}: + +let + +minSdkVersion = "9.0"; + +iosPlatformArch = { parsed, ... }: { + "arm" = "armv7"; + "aarch64" = "arm64"; + "x86_64" = "x86_64"; +}.${parsed.cpu.name}; + +in + +rec { + # TODO(kmicklas): Make a pure version of this for each supported SDK version. + sdk = rec { + name = "ios-sdk"; + type = "derivation"; + outPath = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhone${sdkType}.platform/Developer/SDKs/iPhone${sdkType}${version}.sdk"; + + sdkType = if targetPlatform.isiPhoneSimulator then "Simulator" else "OS"; + version = targetPlatform.sdkVer; + }; + + binutils = wrapBintoolsWith { + libc = targetIosSdkPkgs.libraries; + bintools = binutils-unwrapped; + extraBuildCommands = '' + echo "-arch ${iosPlatformArch targetPlatform}" >> $out/nix-support/libc-ldflags + ''; + }; + + clang = (wrapCCWith { + cc = clang-unwrapped; + bintools = binutils; + libc = targetIosSdkPkgs.libraries; + extraBuildCommands = '' + tr '\n' ' ' < $out/nix-support/cc-cflags > cc-cflags.tmp + mv cc-cflags.tmp $out/nix-support/cc-cflags + echo "-target ${targetPlatform.config} -arch ${iosPlatformArch targetPlatform}" >> $out/nix-support/cc-cflags + echo "-isystem ${sdk}/usr/include -isystem ${sdk}/usr/include/c++/4.2.1/ -stdlib=libstdc++" >> $out/nix-support/cc-cflags + echo "${if targetPlatform.isiPhoneSimulator then "-mios-simulator-version-min" else "-miphoneos-version-min"}=${minSdkVersion}" >> $out/nix-support/cc-cflags + ''; + }) // { + inherit sdk; + }; + + libraries = let sdk = buildIosSdk; in runCommand "libSystem-prebuilt" { + passthru = { + inherit sdk; + }; + } '' + if ! [ -d ${sdk} ]; then + echo "You must have version ${sdk.version} of the iPhone${sdk.sdkType} sdk installed at ${sdk}" >&2 + exit 1 + fi + ln -s ${sdk}/usr $out + ''; +} diff --git a/pkgs/stdenv/cross/default.nix b/pkgs/stdenv/cross/default.nix index 6e3065718532..973be9831861 100644 --- a/pkgs/stdenv/cross/default.nix +++ b/pkgs/stdenv/cross/default.nix @@ -39,8 +39,8 @@ in lib.init bootStages ++ [ buildPlatform = localSystem; hostPlatform = crossSystem; targetPlatform = crossSystem; - cc = if crossSystem.useiOSCross or false - then buildPackages.darwin.ios-cross + cc = if crossSystem.useiOSPrebuilt or false + then buildPackages.darwin.iosSdkPkgs.clang else if crossSystem.useAndroidPrebuilt then buildPackages.androidenv.androidndkPkgs.gcc else buildPackages.gcc; diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 56064138ac11..bb80c5494f17 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9008,6 +9008,7 @@ with pkgs; else if name == "uclibc" then uclibcCross else if name == "musl" then targetPackages.muslCross or muslCross else if name == "msvcrt" then targetPackages.windows.mingw_w64 or windows.mingw_w64 + else if targetPlatform.useiOSPrebuilt then targetPackages.iosSdkPkgs.libraries else if name == "libSystem" then darwin.xcode else throw "Unknown libc"; diff --git a/pkgs/top-level/darwin-packages.nix b/pkgs/top-level/darwin-packages.nix index d1d5aa470bca..d2d41792c461 100644 --- a/pkgs/top-level/darwin-packages.nix +++ b/pkgs/top-level/darwin-packages.nix @@ -1,4 +1,6 @@ -{ pkgs, darwin, stdenv, callPackage, callPackages, newScope }: +{ buildPackages, pkgs, targetPackages +, darwin, stdenv, callPackage, callPackages, newScope +}: let apple-source-releases = callPackage ../os-specific/darwin/apple-source-releases { }; @@ -10,19 +12,23 @@ in apple_sdk = callPackage ../os-specific/darwin/apple-sdk { }; + binutils-unwrapped = callPackage ../os-specific/darwin/binutils { + inherit (darwin) cctools; + inherit (pkgs) binutils-unwrapped; + }; + binutils = pkgs.wrapBintoolsWith { libc = if pkgs.targetPlatform != pkgs.hostPlatform then pkgs.libcCross else pkgs.stdenv.cc.libc; - bintools = callPackage ../os-specific/darwin/binutils { - inherit (darwin) cctools; - }; + bintools = darwin.binutils-unwrapped; }; cctools = callPackage ../os-specific/darwin/cctools/port.nix { inherit (darwin) libobjc maloader; stdenv = if stdenv.isDarwin then stdenv else pkgs.libcxxStdenv; + libcxxabi = pkgs.libcxxabi; xctoolchain = darwin.xcode.toolchain; }; @@ -39,8 +45,10 @@ in insert_dylib = callPackage ../os-specific/darwin/insert_dylib { }; - ios-cross = callPackage ../os-specific/darwin/ios-cross { - inherit (darwin) binutils; + iosSdkPkgs = darwin.callPackage ../os-specific/darwin/ios-sdk-pkgs { + buildIosSdk = buildPackages.darwin.iosSdkPkgs.sdk; + targetIosSdkPkgs = targetPackages.darwin.iosSdkPkgs; + inherit (pkgs.llvmPackages) clang-unwrapped; }; libobjc = apple-source-releases.objc4;