From 60771af5b6fc183aa354ed95e4df32c497382414 Mon Sep 17 00:00:00 2001 From: Ken Micklas Date: Sun, 15 Apr 2018 19:22:17 -0400 Subject: cctools-port: Use old version for iOS to support TBD linking --- pkgs/os-specific/darwin/cctools/port.nix | 37 +++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) (limited to 'pkgs/os-specific/darwin/cctools/port.nix') diff --git a/pkgs/os-specific/darwin/cctools/port.nix b/pkgs/os-specific/darwin/cctools/port.nix index 55995c1592d..d8abdc2c6f8 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 ''; -- cgit 1.4.1