summary refs log tree commit diff
path: root/pkgs/development/compilers/openjdk/bootstrap.nix
blob: 1b20ca6cc606000c939276da93de7a0bd58e1ecd (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
{ stdenv
, runCommand, fetchurl, zlib

, version
}:

assert stdenv.hostPlatform.libc == "glibc";

let
  fetchboot = version: arch: sha256: fetchurl {
    name = "openjdk${version}-bootstrap-${arch}-linux.tar.xz";
    url  = "http://tarballs.nixos.org/openjdk/2018-03-31/${version}/${arch}-linux.tar.xz";
    inherit sha256;
  };

  src = if stdenv.hostPlatform.system == "x86_64-linux" then
    (if version == "10"    then fetchboot "10" "x86_64" "08085fsxc1qhqiv3yi38w8lrg3vm7s0m2yvnwr1c92v019806yq2"
    else if version == "8" then fetchboot "8"  "x86_64" "18zqx6jhm3lizn9hh6ryyqc9dz3i96pwaz8f6nxfllk70qi5gvks"
    else throw "No bootstrap jdk for version ${version}")
  else if stdenv.hostPlatform.system == "i686-linux" then
    (if version == "10"    then fetchboot "10" "i686" "1blb9gyzp8gfyggxvggqgpcgfcyi00ndnnskipwgdm031qva94p7"
    else if version == "8" then fetchboot "8"  "i686" "1yx04xh8bqz7amg12d13rw5vwa008rav59mxjw1b9s6ynkvfgqq9"
    else throw "No bootstrap for version")
  else throw "No bootstrap jdk for system ${stdenv.hostPlatform.system}";

  bootstrap = runCommand "openjdk-bootstrap" {
    passthru.home = "${bootstrap}/lib/openjdk";
  } ''
    tar xvf ${src}
    mv openjdk-bootstrap $out

    LIBDIRS="$(find $out -name \*.so\* -exec dirname {} \; | sort | uniq | tr '\n' ':')"

    find "$out" -type f -print0 | while IFS= read -r -d "" elf; do
      isELF "$elf" || continue
      patchelf --set-interpreter $(cat "${stdenv.cc}/nix-support/dynamic-linker") "$elf" || true
      patchelf --set-rpath "${stdenv.cc.libc}/lib:${stdenv.cc.cc.lib}/lib:${zlib}/lib:$LIBDIRS" "$elf" || true
    done

    # Temporarily, while NixOS's OpenJDK bootstrap tarball doesn't have PaX markings:
    find "$out/bin" -type f -print0 | while IFS= read -r -d "" elf; do
      isELF "$elf" || continue
      paxmark m "$elf"
      # On x86 for heap sizes over 700MB disable SEGMEXEC and PAGEEXEC as well.
      ${stdenv.lib.optionalString stdenv.isi686 ''paxmark msp "$elf"''}
    done
  '';
in bootstrap