# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4

PortSystem       1.0

name             openjdk
categories       java devel
maintainers      {breun.nl:nils @breun} openmaintainer
platforms        darwin
license          GPL-2
supported_archs  x86_64

# Latest Long Term Support (LTS) major version
version          11

if {${subport} eq "openjdk"} {
    # The openjdk port is not installable, but recommends users to install the latest Long Term Support (LTS) subport
    PortGroup    obsolete 1.0
    replaced_by  openjdk${version}
}

# Dummy default values for the obsoleted openjdk port
set build        0
set openj9_version 0

set long_description_adoptopenjdk_intro \
   "OpenJDK build provided by AdoptOpenJDK, built from a fully open-source set of build scripts and infrastructure."

set long_description_adoptopenjdk_hotspot \
    "${long_description_adoptopenjdk_intro} HotSpot is the VM from the OpenJDK community and the most widely used VM.\
It is suitable for all workloads."

set long_description_adoptopenjdk_openj9 \
    "${long_description_adoptopenjdk_intro} OpenJ9 is the virtual machine from the Eclipse community. It is an enterprise-grade\
VM designed for low memory usage and fast start-up and is used in IBM’s JDK. It is suitable for running all workloads."

set long_description_adoptopenjdk_openj9xl \
    "${long_description_adoptopenjdk_openj9} This version uses non-compressed references and should be used for\
applications which require heaps that are over ~57 GB."

set long_description_graalvm \
    "GraalVM is a universal virtual machine for running applications written in JavaScript, Python, Ruby, R,\
    JVM-based languages like Java, Scala, Groovy, Kotlin, Clojure, and LLVM-based languages such as C and C++."

subport openjdk8 {
    version      8u282
    revision     0

    set build    08

    description  Open Java Development Kit 8 (AdoptOpenJDK) with HotSpot VM
    long_description ${long_description_adoptopenjdk_hotspot}

    master_sites https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk${version}-b${build}/
    distname     OpenJDK8U-jdk_x64_mac_hotspot_${version}b${build}
    worksrcdir   jdk${version}-b${build}

    configure.cxx_stdlib libstdc++

    checksums    rmd160  3187d760b3cbeaaf01d47481f069a3e2d1011cfd \
                 sha256  1766d756f6e4a5d41b539f2ecf83e5a33e9336bd75f1602e8f4b4afbb8f47aaa \
                 size    101808251
}

subport openjdk8-graalvm {
    version      21.0.0.2
    revision     0

    description  GraalVM Community Edition based on OpenJDK 8
    long_description ${long_description_graalvm}

    master_sites https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-${version}/
    distname     graalvm-ce-java8-darwin-amd64-${version}
    worksrcdir   graalvm-ce-java8-${version}
    
    checksums    rmd160  2fc5f23a1558b5e125ef91ad137270fe4f2b4d0c \
                 sha256  25a653a44b3ad63479d7ae35d921c8d39282ff1849243f1afc0ffddd443e9079 \
                 size    349277690
}

subport openjdk8-openj9 {
    version      8u282
    revision     0

    set build    08
    set openj9_version 0.24.0

    description  Open Java Development Kit 8 (AdoptOpenJDK) with Eclipse OpenJ9 VM
    long_description ${long_description_adoptopenjdk_openj9}

    master_sites https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk${version}-b${build}_openj9-${openj9_version}/
    distname     OpenJDK8U-jdk_x64_mac_openj9_${version}b${build}_openj9-${openj9_version}
    worksrcdir   jdk${version}-b${build}

    checksums    rmd160  b66caafe41d50052fa438dfcef5fdf58430f42c8 \
                 sha256  265d4fb01b61ed7a3a9fae6a50bcf6322687b5f08de8598d8e42263cbd8b5772 \
                 size    115586057
}

subport openjdk8-openj9-large-heap {
    version      8u282
    revision     0

    set build    08
    set openj9_version 0.24.0

    description  Open Java Development Kit 8 (AdoptOpenJDK) with Eclipse OpenJ9 VM for large heap sizes
    long_description ${long_description_adoptopenjdk_openj9xl}

    master_sites https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk${version}-b${build}_openj9-${openj9_version}/
    distname     OpenJDK8U-jdk_x64_mac_openj9_macosXL_${version}b${build}_openj9-${openj9_version}
    worksrcdir   jdk${version}-b${build}

    checksums    rmd160  e4797c143ca666baa428a252bb130251af25a1b2 \
                 sha256  64f2b106bc5c65ed963a72893e3d676df58704718dd86fc0fcbbb61e615e4742 \
                 size    116297701
}

# Remove after 2021-11-28
subport openjdk10 {
    version      10.0.2
    revision     3

    PortGroup    obsolete 1.0
    replaced_by  openjdk11
}

subport openjdk11 {
    version      11.0.10
    revision     0

    set build    9

    description  Open Java Development Kit 11 (AdoptOpenJDK) with HotSpot VM
    long_description ${long_description_adoptopenjdk_hotspot}

    master_sites https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-${version}%2B${build}/
    distname     OpenJDK11U-jdk_x64_mac_hotspot_${version}_${build}
    worksrcdir   jdk-${version}+${build}

    checksums    rmd160  3c1f62a95095aee9f0ee3d02ba4a4a67f5425ba1 \
                 sha256  ee7c98c9d79689aca6e717965747b8bf4eec5413e89d5444cc2bd6dbd59e3811 \
                 size    186160219
}

subport openjdk11-graalvm {
    version      21.0.0.2
    revision     0

    description  GraalVM Community Edition based on OpenJDK 11
    long_description ${long_description_graalvm}

    master_sites https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-${version}/
    distname     graalvm-ce-java11-darwin-amd64-${version}
    worksrcdir   graalvm-ce-java11-${version}
    
    checksums    rmd160  64053c14a3e03b49d69564d99fad84453c097afb \
                 sha256  6714be01bd17c2c049435c02e19dd2bcba96ea9e44152911ed0082bc968618d6 \
                 size    448204139
}

subport openjdk11-openj9 {
    version      11.0.10
    revision     0

    set build    9
    set openj9_version 0.24.0

    description  Open Java Development Kit 11 (AdoptOpenJDK) with Eclipse OpenJ9 VM
    long_description ${long_description_adoptopenjdk_openj9}

    master_sites https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-${version}%2B${build}_openj9-${openj9_version}/
    distname     OpenJDK11U-jdk_x64_mac_openj9_${version}_${build}_openj9-${openj9_version}
    worksrcdir   jdk-${version}+${build}

    checksums    rmd160  68da07a92466f0ce17d814e29f20985b95689853 \
                 sha256  58f931dc30160b04da2d94af32e0dfa384f4b2cf92b7217c0937fd057e668d54 \
                 size    196594593
}

subport openjdk11-openj9-large-heap {
    version      11.0.10
    revision     0

    set build    9
    set openj9_version 0.24.0

    description  Open Java Development Kit 11 (AdoptOpenJDK) with Eclipse OpenJ9 VM for large heap sizes
    long_description ${long_description_adoptopenjdk_openj9xl}

    master_sites https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-${version}%2B${build}_openj9-${openj9_version}/
    distname     OpenJDK11U-jdk_x64_mac_openj9_macosXL_${version}_${build}_openj9-${openj9_version}
    worksrcdir   jdk-${version}+${build}

    checksums    rmd160  66e4e36eb013a66d7970c3874046b80e771cd36d \
                 sha256  ac6998c1a7945dab9d008e3702a69ed86488321aea197961f72375e8bc8bc114 \
                 size    195829115
}

# Remove after 2022-02-15
subport openjdk12 {
    version      12.0.2
    revision     1
}

# Remove after 2022-02-15
subport openjdk12-openj9 {
    version      12.0.2
    revision     1
}

# Remove after 2022-02-15
subport openjdk12-openj9-large-heap {
    version      12.0.2
    revision     1
}

# Remove after 2022-02-15
subport openjdk13 {
    version      13.0.2
    revision     1
}

# Remove after 2022-02-15
subport openjdk13-openj9 {
    version      13.0.2
    revision     1
}

# Remove after 2022-02-15
subport openjdk13-openj9-large-heap {
    version      13.0.2
    revision     1
}

# Remove after 2022-02-15
subport openjdk14 {
    version      14.0.2
    revision     1
}

# Remove after 2022-02-15
subport openjdk14-openj9 {
    version      14.0.2
    revision     1
}

# Remove after 2022-02-15
subport openjdk14-openj9-large-heap {
    version      14.0.2
    revision     1
}

# Remove after 2022-03-22
subport openjdk15 {
    version      15.0.2
    revision     1
}

# Remove after 2022-03-22
subport openjdk15-openj9 {
    version      15.0.2
    revision     1
}

# Remove after 2022-03-22
subport openjdk15-openj9-large-heap {
    version      15.0.2
    revision     1
}

subport openjdk16 {
    version      16
    revision     0

    set build    36

    description  Open Java Development Kit 16 (AdoptOpenJDK) with HotSpot VM
    long_description ${long_description_adoptopenjdk_hotspot}

    master_sites https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-${version}%2B${build}/
    distname     OpenJDK16-jdk_x64_mac_hotspot_${version}_${build}
    worksrcdir   jdk-${version}+${build}

    checksums    rmd160  7ef653cce09364235a659cc9dd721281fec95d98 \
                 sha256  b66761b55fd493ed2a5f4df35a32b338ec34a9e0a1244439e3156561ab27c511 \
                 size    199955659
}

subport openjdk16-openj9 {
    version      16
    revision     0

    set build    36
    set openj9_version 0.25.0

    description  Open Java Development Kit 16 (AdoptOpenJDK) with Eclipse OpenJ9 VM
    long_description ${long_description_adoptopenjdk_openj9}

    master_sites https://github.com/AdoptOpenJDK/openjdk16-binaries/releases/download/jdk-${version}%2B${build}_openj9-${openj9_version}/
    distname     OpenJDK16-jdk_x64_mac_openj9_${version}_${build}_openj9-${openj9_version}
    worksrcdir   jdk-${version}+${build}

    checksums    rmd160  94087f2b59cc2a27d289488f7b76a714a57706b5 \
                 sha256  e6075cbe939b4de165cc8b4b91352f8885d549873f5cd419e75eba737502542e \
                 size    206412428
}

# https://trac.macports.org/wiki/PortfileRecipes#compare-osx-darwin-version
if {${os.platform} eq "darwin" && ${os.major} < 14} {
    known_fail yes
    pre-fetch {
        ui_error "${name} ${version} is only supported on Mac OS X 10.10 Yosemite or later."
        return -code error
    }
}

if {${subport} in [list openjdk12 openjdk13 openjdk14 openjdk15]} {
    PortGroup    obsolete 1.0
    # Can replace with openjdk17 when it is added and openjdk16 is obsoleted
    replaced_by  openjdk16
} elseif {${subport} in [list openjdk12-openj9 openjdk12-openj9-large-heap openjdk13-openj9 openjdk13-openj9-large-heap openjdk14-openj9 openjdk14-openj9-large-heap openjdk15-openj9 openjdk15-openj9-large-heap]} {
    PortGroup    obsolete 1.0
    # Can replace with openjdk17-openj9 when it is added and openjdk16-openj9 is obsoleted
    replaced_by  openjdk16-openj9
}

if {[string match *-graalvm ${subport}]} {
    homepage     https://www.graalvm.org
} else {
    homepage     https://adoptopenjdk.net
}

livecheck.type  none

variant Applets \
    description { Advertise the JVM capability "Applets".} {}

variant BundledApp \
    description { Advertise the JVM capability "BundledApp". This is required by some java-based app bundles to recognize and use the JVM.} {}

variant JNI \
    description { Advertise the JVM capability "JNI". This is required by some java-based app bundles to recognize and use the JVM.} {}

variant WebStart \
    description { Advertise the JVM capability "WebStart".} {}

patch {
    foreach var { Applets BundledApp JNI WebStart } {
        if {[variant_isset ${var}]} {
            reinplace -E "s|^(\[\[:space:\]\]*<string>)CommandLine(</string>)|\\1${var}\\2\\\n\\1CommandLine\\2|" ${worksrcpath}/Contents/Info.plist
        }
    }
}

use_configure    no

build {}

# macOS Java tools expect to find Java virtual machines under /Library/Java/JavaVirtualMachines, which is not under ${prefix}.
destroot.violate_mtree yes

set target /Library/Java/JavaVirtualMachines/${subport}
set destroot_target ${destroot}${target}

destroot {
    xinstall -m 755 -d ${destroot_target}
    copy ${worksrcpath}/Contents ${destroot_target}
}

notes "
If you have more than one JDK installed you can make ${subport} the default
by adding the following line to your shell profile:

    export JAVA_HOME=${target}/Contents/Home
"
