about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/compilers/corretto/mk-corretto.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/compilers/corretto/mk-corretto.nix')
-rw-r--r--nixpkgs/pkgs/development/compilers/corretto/mk-corretto.nix115
1 files changed, 115 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/compilers/corretto/mk-corretto.nix b/nixpkgs/pkgs/development/compilers/corretto/mk-corretto.nix
new file mode 100644
index 000000000000..026316f2fa73
--- /dev/null
+++ b/nixpkgs/pkgs/development/compilers/corretto/mk-corretto.nix
@@ -0,0 +1,115 @@
+{ jdk
+, version
+, src
+, lib
+, stdenv
+, gradle
+, rsync
+, runCommand
+, testers
+}:
+
+# Each Corretto version is based on a corresponding OpenJDK version. So
+# building Corretto is more or less the same as building OpenJDK. Hence, the
+# Corretto derivation overrides the corresponding OpenJDK derivation in order
+# to have access to all the version-specific fixes for the various OpenJDK
+# builds. However, Corretto uses `gradle` as build tool (which in turn will
+# invoke `make`). The configure/build phases are adapted as needed.
+
+let
+  pname = "corretto";
+  # The version scheme is different between OpenJDK & Corretto.
+  # See https://github.com/corretto/corretto-17/blob/release-17.0.8.8.1/build.gradle#L40
+  # "major.minor.security.build.revision"
+in
+jdk.overrideAttrs (finalAttrs: oldAttrs: {
+  inherit pname version src;
+  name = "${pname}-${version}";
+
+  nativeBuildInputs = oldAttrs.nativeBuildInputs ++ [ jdk gradle rsync ];
+
+  dontConfigure = true;
+
+  postPatch = ''
+    # The rpm/deb task definitions require a Gradle plugin which we don't
+    # have and so the build fails. We'll simply remove them here because
+    # they are not needed anyways.
+    rm -rf installers/linux/universal/{rpm,deb}
+
+    # `/usr/bin/rsync` is invoked to copy the source tree. We don't have that.
+    for file in $(find installers -name "build.gradle"); do
+      substituteInPlace $file --replace "workingDir '/usr/bin'" "workingDir '.'"
+    done
+  '';
+
+
+  buildPhase =
+    let
+      # The Linux installer is placed at linux/universal/tar whereas the MacOS
+      # one is at mac/tar.
+      task =
+        if stdenv.isDarwin then
+          ":installers:mac:tar:packageBuildResults"
+        else ":installers:linux:universal:tar:packageBuildResults";
+    in
+    ''
+      runHook preBuild
+
+      # Corretto's actual built is triggered via `gradle`.
+      gradle --console=plain --no-daemon ${task}
+
+      # Prepare for the installPhase so that it looks like if a normal
+      # OpenJDK had been built.
+      dir=build/jdkImageName/images
+      mkdir -p $dir
+      file=$(find ./installers -name 'amazon-corretto-${version}*.tar.gz')
+      tar -xzf $file -C $dir
+      mv $dir/amazon-corretto-* $dir/jdk
+
+      runHook postBuild
+    '';
+
+  installPhase = oldAttrs.installPhase + ''
+    # The installPhase will place everything in $out/lib/openjdk and
+    # reference through symlinks. We don't rewrite the installPhase but at
+    # least move the folder to convey that this is not OpenJDK anymore.
+    mv $out/lib/openjdk $out/lib/corretto
+    ln -s $out/lib/corretto $out/lib/openjdk
+  '';
+
+  passthru =
+    let
+      pkg = finalAttrs.finalPackage;
+    in
+    oldAttrs.passthru // {
+      tests = {
+        version = testers.testVersion {
+          package = pkg;
+        };
+        vendor = runCommand "${pname}-vendor" { nativeBuildInputs = [ pkg ]; } ''
+          output=$(${pkg.meta.mainProgram} -XshowSettings:properties -version 2>&1 | grep vendor)
+          grep -Fq "java.vendor = Amazon.com Inc." - <<< "$output" && touch $out
+        '';
+        compiler = runCommand "${pname}-compiler" { nativeBuildInputs = [ pkg ]; } ''
+          cat << EOF  > Main.java
+          class Main {
+              public static void main(String[] args) {
+                  System.out.println("Hello, World!");
+              }
+          }
+          EOF
+          ${pkg}/bin/javac Main.java
+          ${pkg}/bin/java Main | grep -q "Hello, World!" && touch $out
+        '';
+      };
+    };
+
+  meta = with lib; {
+    homepage = "https://aws.amazon.com/corretto";
+    license = licenses.gpl2Only;
+    description = "Amazon's distribution of OpenJDK";
+    platforms = jdk.meta.platforms;
+    mainProgram = "java";
+    maintainers = with maintainers; [ rollf ];
+  };
+})