summaryrefslogtreecommitdiff
path: root/pkgs/development/compilers/swift/wrapper/default.nix
blob: e446bec668688f5fe6f61ee5ec123ab2ed4b8c5a (plain)
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
{
  lib,
  stdenv,
  swift,
  useSwiftDriver ? true,
  swift-driver,
  clang,
}:

stdenv.mkDerivation (
  swift._wrapperParams
  // {
    pname = "swift-wrapper";
    inherit (swift) version meta;

    outputs = [
      "out"
      "man"
    ];

    # Wrapper and setup hook variables.
    inherit swift;
    inherit (swift)
      swiftOs
      swiftArch
      swiftModuleSubdir
      swiftLibSubdir
      swiftStaticModuleSubdir
      swiftStaticLibSubdir
      ;
    swiftDriver = lib.optionalString useSwiftDriver "${swift-driver}/bin/swift-driver";
    cc_wrapper = clang.override (prev: {
      extraBuildCommands =
        prev.extraBuildCommands
        # We need to use the resource directory corresponding to Swift’s
        # version of Clang instead of passing along the one from the
        # `cc-wrapper` flags.
        + ''
          rm -r $out/resource-root
          substituteInPlace $out/nix-support/cc-cflags \
            --replace-fail \
              "-resource-dir=$out/resource-root" \
              "-resource-dir=${lib.getLib swift}/lib/swift/clang"
        ''
        # We need the libc++ headers corresponding to the LLVM version of
        # Swift’s Clang.
        + lib.optionalString (clang.libcxx != null) ''
          include -isystem "${lib.getDev swift}/include/c++/v1" > $out/nix-support/libcxx-cxxflags
        '';
    });

    env.darwinMinVersion = lib.optionalString stdenv.targetPlatform.isDarwin (
      stdenv.targetPlatform.darwinMinVersion
    );

    passAsFile = [ "buildCommand" ];
    buildCommand = ''
      mkdir -p $out/bin $out/nix-support

      # Symlink all Swift binaries first.
      # NOTE: This specifically omits clang binaries. We want to hide these for
      # private use by Swift only.
      ln -s -t $out/bin/ $swift/bin/swift*

      # Replace specific binaries with wrappers.
      for executable in swift swiftc swift-frontend; do
        export prog=$swift/bin/$executable
        rm $out/bin/$executable
        substituteAll '${./wrapper.sh}' $out/bin/$executable
        chmod a+x $out/bin/$executable
      done

      ${lib.optionalString useSwiftDriver ''
        # Symlink swift-driver executables.
        ln -s -t $out/bin/ ${swift-driver}/bin/*
      ''}

      ln -s ${swift.man} $man

      # This link is here because various tools (swiftpm) check for stdlib
      # relative to the swift compiler. It's fine if this is for build-time
      # stuff, but we should patch all cases were it would end up in an output.
      ln -s ${swift.lib}/lib $out/lib

      substituteAll ${./setup-hook.sh} $out/nix-support/setup-hook

      # Propagate any propagated inputs from the unwrapped Swift compiler, if any.
      if [ -e "$swift/nix-support" ]; then
        for input in "$swift/nix-support/"*propagated*; do
          cp "$input" "$out/nix-support/$(basename "$input")"
        done
      fi
    '';

    passthru = {
      inherit swift;
      inherit (swift)
        swiftOs
        swiftArch
        swiftModuleSubdir
        swiftLibSubdir
        tests
        ;
    };
  }
)