summary refs log tree commit diff
path: root/pkgs/os-specific/darwin/cctools/port.nix
blob: 0c25f225291eb26ebfd881de7a2dc8bc308a45aa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
{ stdenv, fetchFromGitHub, autoconf, automake, libtool, autoreconfHook
, installShellFiles
, libcxxabi, libuuid
, libobjc ? null, maloader ? null
, enableTapiSupport ? true, libtapi
}:

let

  # The targetPrefix prepended to binary names to allow multiple binuntils on the
  # PATH to both be usable.
  targetPrefix = stdenv.lib.optionalString
    (stdenv.targetPlatform != stdenv.hostPlatform)
    "${stdenv.targetPlatform.config}-";
in

# Non-Darwin alternatives
assert (!stdenv.hostPlatform.isDarwin) -> maloader != null;

let
  baseParams = rec {
    name = "${targetPrefix}cctools-port";
    version = "927.0.2";

    src = fetchFromGitHub {
      owner  = "tpoechtrager";
      repo   = "cctools-port";
      rev    = "8239a5211bcf07d6b9d359782e1a889ec1d7cce5";
      sha256 = "0h8b1my0wf1jyjq63wbiqkl2clgxsf87f6i4fjhqs431fzlq8sac";
    };

    outputs = [ "out" "dev" "man" ];

    nativeBuildInputs = [ autoconf automake libtool autoreconfHook installShellFiles ];
    buildInputs = [ libuuid ]
      ++ stdenv.lib.optionals stdenv.isDarwin [ libcxxabi libobjc ]
      ++ stdenv.lib.optional enableTapiSupport libtapi;

    patches = [ ./ld-ignore-rpath-link.patch ./ld-rpath-nonfinal.patch ];

    __propagatedImpureHostDeps = [
      # 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"
    ];

    enableParallelBuilding = true;

    # TODO(@Ericson2314): Always pass "--target" and always targetPrefix.
    configurePlatforms = [ "build" "host" ]
      ++ stdenv.lib.optional (stdenv.targetPlatform != stdenv.hostPlatform) "target";
    configureFlags = [ "--disable-clang-as" ]
      ++ stdenv.lib.optionals enableTapiSupport [
        "--enable-tapi-support"
        "--with-libtapi=${libtapi}"
      ];

    postPatch = stdenv.lib.optionalString stdenv.hostPlatform.isDarwin ''
      substituteInPlace cctools/Makefile.am --replace libobjc2 ""
    '' + ''
      sed -i -e 's/addStandardLibraryDirectories = true/addStandardLibraryDirectories = false/' cctools/ld64/src/ld/Options.cpp

      # FIXME: there are far more absolute path references that I don't want to fix right now
      substituteInPlace cctools/configure.ac \
        --replace "-isystem /usr/local/include -isystem /usr/pkg/include" "" \
        --replace "-L/usr/local/lib" "" \

      substituteInPlace cctools/include/Makefile \
        --replace "/bin/" ""

      patchShebangs tools
      sed -i -e 's/which/type -P/' tools/*.sh

      # Workaround for https://www.sourceware.org/bugzilla/show_bug.cgi?id=11157
      cat > cctools/include/unistd.h <<EOF
      #ifdef __block
      #  undef __block
      #  include_next "unistd.h"
      #  define __block __attribute__((__blocks__(byref)))
      #else
      #  include_next "unistd.h"
      #endif
      EOF

      cd cctools
    '';

    preInstall = ''
      pushd include
      make DSTROOT=$out/include RC_OS=common install
      popd

      installManPage ar/ar.{1,5}
    '';

    passthru = {
      inherit targetPrefix;
    };

    meta = {
      broken = !stdenv.targetPlatform.isDarwin; # Only supports darwin targets
      homepage = "http://www.opensource.apple.com/source/cctools/";
      description = "MacOS Compiler Tools (cross-platform port)";
      license = stdenv.lib.licenses.apsl20;
      maintainers = with stdenv.lib.maintainers; [ matthewbauer ];
    };
  };
in stdenv.mkDerivation baseParams