#!/bin/bash
#
# Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# Create a bundle in the current directory, containing what's needed to run
# the 'dot' program from the graphviz suite by the OpenJDK build.

set -eux

mydir="$(cd -- $(dirname ${BASH_SOURCE[0]}) && pwd)"
me="${mydir}/$(basename ${BASH_SOURCE[0]})"

EXPAT_VERSION="2.6.0"
EXPAT_URL="https://github.com/libexpat/libexpat/releases/download/R_${EXPAT_VERSION//./_}/expat-${EXPAT_VERSION}.tar.gz"
EXPAT_SHA256="a13447b9aa67d7c860783fdf6820f33ebdea996900d6d8bbc50a628f55f099f7"

GRAPHVIZ_VERSION="9.0.0"
GRAPHVIZ_URL="https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/${GRAPHVIZ_VERSION}/graphviz-${GRAPHVIZ_VERSION}.tar.xz"
GRAPHVIZ_SHA256="6c9afda06a732af7658c2619ee713d2545818c3ff19b7b8fd48effcd06d57bf6"

uname_s="$(uname -s)"
case ${uname_s} in
    Linux)
        bundle_os="linux"
        shacmd="sha256sum --strict --check -"
        lib_path_var="LD_LIBRARY_PATH"
        ;;
    Darwin)
        bundle_os="macosx"
        shacmd="shasum -a 256 --strict --check -"
        lib_path_var="DYLD_LIBRARY_PATH"
        ;;
    *)
        echo "Unknown OS: ${uname_s}"
        exit 1
        ;;
esac
uname_m="$(uname -m)"
case ${uname_m} in
    aarch64|arm64)
        bundle_cpu="aarch64"
        ;;
    x86_64)
        bundle_cpu="x64"
        ;;
esac
bundle_platform="${bundle_os}_${bundle_cpu}"

build_dir="${mydir}/../../build/graphviz"
download_dir="${build_dir}/download"
install_dir="${build_dir}/result/graphviz-${bundle_platform}-${GRAPHVIZ_VERSION}"
bundle_file="${install_dir}.tar.gz"

expat_dir="${build_dir}/expat"
expat_src_dir="${expat_dir}/src"

graphviz_dir="${build_dir}/graphviz"
graphviz_src_dir="${graphviz_dir}/src"
graphviz_doc_dir="${install_dir}/doc"

mkdir -p "${build_dir}"
cd "${build_dir}"

download_and_unpack() {
    local url="$1"
    local sha256="$2"
    local file="$3"
    local dir="$4"

    mkdir -p "$(dirname "${file}")"
    if [ ! -f "${file}" ]; then
        curl -L -o "${file}" "${url}"
    fi
    echo "${sha256}  ${file}" | ${shacmd}
    if [ ! -d "${dir}" ]; then
        mkdir -p "${dir}"
        tar --extract --file "${file}" --directory "${dir}" --strip-components 1
    fi
}

download_and_unpack "${EXPAT_URL}" "${EXPAT_SHA256}" "${download_dir}/expat.tar.gz" "${expat_src_dir}"
download_and_unpack "${GRAPHVIZ_URL}" "${GRAPHVIZ_SHA256}" "${download_dir}/graphviz.tar.gz" "${graphviz_src_dir}"

(
    cd "${expat_src_dir}"
    ./configure --prefix="${install_dir}"
    make -j install
)

(
    cd "${graphviz_src_dir}"
    ./configure --prefix="${install_dir}" EXPAT_CFLAGS="-I${install_dir}/include" EXPAT_LIBS="-L${install_dir}/lib -lexpat"
    make -j install
)

cat > "${install_dir}/dot" << EOF
#!/bin/bash
# Get an absolute path to this script
this_script_dir="\$(dirname \$0)"
this_script_dir="\$(cd \${this_script_dir} > /dev/null && pwd)"
export ${lib_path_var}="\${this_script_dir}/lib:\${this_script_dir}/lib/graphviz"
exec "\${this_script_dir}/bin/dot" "\$@"
EOF
chmod +x "${install_dir}/dot"
# create config file
"${install_dir}/dot" -c

cp "${me}" "${install_dir}"

tar --create --gzip --file "${bundle_file}" -C "${install_dir}" .