#
# Copyright (c) 2011, 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.
#

################################################################################
# Setup bundled libraries.
#
# For libjpeg, giflib, libpng, lcms2 and zlib the source is present in the
# OpenJDK repository (referred to as "bundled"). Default is to use libjpeg,
# giflib, libpng and lcms2 libraries as "bundled". The default for zlib is
# to use the bundled zlib on Windows and AIX, otherwise the external ("system")
# zlib, if present. However the libs may be replaced by an external ("system")
# version by the user.
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_BUNDLED_LIBS],
[
  LIB_SETUP_LIBJPEG
  LIB_SETUP_GIFLIB
  LIB_SETUP_LIBPNG
  LIB_SETUP_ZLIB
  LIB_SETUP_LCMS
  LIB_SETUP_HARFBUZZ
])

################################################################################
# Setup libjpeg
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_LIBJPEG],
[
  AC_ARG_WITH(libjpeg, [AS_HELP_STRING([--with-libjpeg],
      [use libjpeg from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])

  AC_MSG_CHECKING([for which libjpeg to use])
  # default is bundled
  DEFAULT_LIBJPEG=bundled
  # if user didn't specify, use DEFAULT_LIBJPEG
  if test "x${with_libjpeg}" = "x"; then
    with_libjpeg=${DEFAULT_LIBJPEG}
  fi
  AC_MSG_RESULT(${with_libjpeg})

  if test "x${with_libjpeg}" = "xbundled"; then
    USE_EXTERNAL_LIBJPEG=false
    LIBJPEG_CFLAGS=""
    LIBJPEG_LIBS=""
  elif test "x${with_libjpeg}" = "xsystem"; then
    PKG_CHECK_MODULES(LIBJPEG, libjpeg, [LIBJPEG_FOUND=yes], [LIBJPEG_FOUND=no])
    if test "x${LIBJPEG_FOUND}" = "xyes"; then
      # PKG_CHECK_MODULES will set LIBJPEG_CFLAGS and LIBJPEG_LIBS
      USE_EXTERNAL_LIBJPEG=true
    else
      AC_CHECK_HEADER(jpeglib.h, [],
          [ AC_MSG_ERROR([--with-libjpeg=system specified, but jpeglib.h not found!])])
      AC_CHECK_LIB(jpeg, jpeg_CreateDecompress, [],
          [ AC_MSG_ERROR([--with-libjpeg=system specified, but no libjpeg found])])

      USE_EXTERNAL_LIBJPEG=true
      LIBJPEG_CFLAGS=""
      LIBJPEG_LIBS="-ljpeg"
    fi
  else
    AC_MSG_ERROR([Invalid use of --with-libjpeg: ${with_libjpeg}, use 'system' or 'bundled'])
  fi

  AC_SUBST(USE_EXTERNAL_LIBJPEG)
  AC_SUBST(LIBJPEG_CFLAGS)
  AC_SUBST(LIBJPEG_LIBS)
])

################################################################################
# Setup giflib
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_GIFLIB],
[
  AC_ARG_WITH(giflib, [AS_HELP_STRING([--with-giflib],
      [use giflib from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])
  AC_ARG_WITH(giflib-include, [AS_HELP_STRING([--with-giflib-include],
      [specify directory for the system giflib include files])])
  AC_ARG_WITH(giflib-lib, [AS_HELP_STRING([--with-giflib-lib],
      [specify directory for the system giflib library])])

  AC_MSG_CHECKING([for which giflib to use])
  # default is bundled
  DEFAULT_GIFLIB=bundled
  # if user didn't specify, use DEFAULT_GIFLIB
  if test "x${with_giflib}" = "x"; then
    with_giflib=${DEFAULT_GIFLIB}
  fi
  AC_MSG_RESULT(${with_giflib})

  if test "x${with_giflib}" = "xbundled"; then
    USE_EXTERNAL_LIBGIF=false
    GIFLIB_CFLAGS=""
    GIFLIB_LIBS=""
  elif test "x${with_giflib}" = "xsystem"; then
    GIFLIB_H_FOUND=no
    if test "x${with_giflib_include}" != x; then
      GIFLIB_CFLAGS="-I${with_giflib_include}"
      GIFLIB_H_FOUND=yes
    fi
    if test "x$GIFLIB_H_FOUND" = xno; then
      AC_CHECK_HEADER(gif_lib.h,
          [
            GIFLIB_CFLAGS=""
            GIFLIB_H_FOUND=yes
          ])
    fi
    if test "x$GIFLIB_H_FOUND" = xno; then
      AC_MSG_ERROR([--with-giflib=system specified, but gif_lib.h not found!])
    fi

    GIFLIB_LIB_FOUND=no
    if test "x${with_giflib_lib}" != x; then
      GIFLIB_LIBS="-L${with_giflib_lib} -lgif"
      GIFLIB_LIB_FOUND=yes
    fi
    if test "x$GIFLIB_LIB_FOUND" = xno; then
      AC_CHECK_LIB(gif, DGifGetCode,
          [
            GIFLIB_LIBS="-lgif"
            GIFLIB_LIB_FOUND=yes
          ])
    fi
    if test "x$GIFLIB_LIB_FOUND" = xno; then
      AC_MSG_ERROR([--with-giflib=system specified, but no giflib found!])
    fi

    USE_EXTERNAL_LIBGIF=true
    GIFLIB_LIBS=-lgif
  else
    AC_MSG_ERROR([Invalid value of --with-giflib: ${with_giflib}, use 'system' or 'bundled'])
  fi

  AC_SUBST(USE_EXTERNAL_LIBGIF)
  AC_SUBST(GIFLIB_CFLAGS)
  AC_SUBST(GIFLIB_LIBS)
])

################################################################################
# Setup libpng
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_LIBPNG],
[
  AC_ARG_WITH(libpng, [AS_HELP_STRING([--with-libpng],
      [use libpng from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])

  PKG_CHECK_MODULES(PNG, libpng, [LIBPNG_FOUND=yes], [LIBPNG_FOUND=no])
  AC_MSG_CHECKING([for which libpng to use])

  # default is bundled
  DEFAULT_LIBPNG=bundled
  # if user didn't specify, use DEFAULT_LIBPNG
  if test "x${with_libpng}" = "x"; then
    with_libpng=${DEFAULT_LIBPNG}
  fi

  if test "x${with_libpng}" = "xbundled"; then
    USE_EXTERNAL_LIBPNG=false
    PNG_CFLAGS=""
    PNG_LIBS=""
    AC_MSG_RESULT([bundled])
  elif test "x${with_libpng}" = "xsystem"; then
    if test "x${LIBPNG_FOUND}" = "xyes"; then
      # PKG_CHECK_MODULES will set PNG_CFLAGS and PNG_LIBS
      USE_EXTERNAL_LIBPNG=true
      AC_MSG_RESULT([system])
    else
      AC_MSG_RESULT([system not found])
      AC_MSG_ERROR([--with-libpng=system specified, but no libpng found!])
    fi
  else
    AC_MSG_ERROR([Invalid value of --with-libpng: ${with_libpng}, use 'system' or 'bundled'])
  fi

  AC_SUBST(USE_EXTERNAL_LIBPNG)
  AC_SUBST(PNG_CFLAGS)
  AC_SUBST(PNG_LIBS)
])

################################################################################
# Setup zlib
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_ZLIB],
[
  AC_ARG_WITH(zlib, [AS_HELP_STRING([--with-zlib],
      [use zlib from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])

  AC_CHECK_LIB(z, compress,
      [ ZLIB_FOUND=yes ],
      [ ZLIB_FOUND=no ])

  AC_MSG_CHECKING([for which zlib to use])

  DEFAULT_ZLIB=system
  if test "x$OPENJDK_TARGET_OS" = xwindows -o "x$OPENJDK_TARGET_OS" = xaix; then
    # On windows and aix default is bundled
    DEFAULT_ZLIB=bundled
  elif test "x$OPENJDK_TARGET_OS" = xmacosx -a "x$OPENJDK_TARGET_CPU" = xaarch64; then
    DEFAULT_ZLIB=bundled
  fi

  if test "x${ZLIB_FOUND}" != "xyes"; then
    # If we don't find any system...set default to bundled
    DEFAULT_ZLIB=bundled
  fi

  # If user didn't specify, use DEFAULT_ZLIB
  if test "x${with_zlib}" = "x"; then
    with_zlib=${DEFAULT_ZLIB}
  fi

  if test "x${with_zlib}" = "xbundled"; then
    USE_EXTERNAL_LIBZ=false
    AC_MSG_RESULT([bundled])
  elif test "x${with_zlib}" = "xsystem"; then
    if test "x${ZLIB_FOUND}" = "xyes"; then
      USE_EXTERNAL_LIBZ=true
      AC_MSG_RESULT([system])

      if test "x$USE_EXTERNAL_LIBPNG" != "xtrue"; then
        # If we use bundled libpng, we must verify that we have a proper zlib.
        # For instance zlib-ng has had issues with inflateValidate().
        AC_MSG_CHECKING([for system zlib functionality])
        AC_COMPILE_IFELSE(
            [AC_LANG_PROGRAM([#include "zlib.h"], [
                #if ZLIB_VERNUM >= 0x1281
                  inflateValidate(NULL, 0);
                #endif
            ])],
            [AC_MSG_RESULT([ok])],
            [
                AC_MSG_RESULT([not ok])
                AC_MSG_ERROR([System zlib not working correctly])
            ]
        )
      fi
    else
      AC_MSG_RESULT([system not found])
      AC_MSG_ERROR([--with-zlib=system specified, but no zlib found!])
    fi
  else
    AC_MSG_ERROR([Invalid value for --with-zlib: ${with_zlib}, use 'system' or 'bundled'])
  fi

  LIBZ_CFLAGS=""
  LIBZ_LIBS=""
  if test "x$USE_EXTERNAL_LIBZ" = "xfalse"; then
    LIBZ_CFLAGS="$LIBZ_CFLAGS -I$TOPDIR/src/java.base/share/native/libzip/zlib"
    if test "x$OPENJDK_TARGET_OS" = xmacosx; then
        LIBZ_CFLAGS="$LIBZ_CFLAGS -DHAVE_UNISTD_H"
    fi
  else
    LIBZ_LIBS="-lz"
  fi

  AC_SUBST(USE_EXTERNAL_LIBZ)
  AC_SUBST(LIBZ_CFLAGS)
  AC_SUBST(LIBZ_LIBS)
])

################################################################################
# Setup lcms (Little CMS)
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_LCMS],
[
  AC_ARG_WITH(lcms, [AS_HELP_STRING([--with-lcms],
      [use lcms2 from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])

  AC_MSG_CHECKING([for which lcms to use])

  DEFAULT_LCMS=bundled
  # If user didn't specify, use DEFAULT_LCMS
  if test "x${with_lcms}" = "x"; then
    with_lcms=${DEFAULT_LCMS}
  fi

  if test "x${with_lcms}" = "xbundled"; then
    USE_EXTERNAL_LCMS=false
    LCMS_CFLAGS=""
    LCMS_LIBS=""
    AC_MSG_RESULT([bundled])
  elif test "x${with_lcms}" = "xsystem"; then
    AC_MSG_RESULT([system])
    PKG_CHECK_MODULES([LCMS], [lcms2], [LCMS_FOUND=yes], [LCMS_FOUND=no])
    if test "x${LCMS_FOUND}" = "xyes"; then
      # PKG_CHECK_MODULES will set LCMS_CFLAGS and LCMS_LIBS
      USE_EXTERNAL_LCMS=true
    else
      AC_MSG_ERROR([--with-lcms=system specified, but no lcms found!])
    fi
  else
    AC_MSG_ERROR([Invalid value for --with-lcms: ${with_lcms}, use 'system' or 'bundled'])
  fi

  AC_SUBST(USE_EXTERNAL_LCMS)
  AC_SUBST(LCMS_CFLAGS)
  AC_SUBST(LCMS_LIBS)
])

################################################################################
# Setup harfbuzz
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_HARFBUZZ],
[
  AC_ARG_WITH(harfbuzz, [AS_HELP_STRING([--with-harfbuzz],
      [use harfbuzz from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])

  AC_MSG_CHECKING([for which harfbuzz to use])

  DEFAULT_HARFBUZZ=bundled
  # If user didn't specify, use DEFAULT_HARFBUZZ
  if test "x${with_harfbuzz}" = "x"; then
    with_harfbuzz=${DEFAULT_HARFBUZZ}
  fi

  if test "x${with_harfbuzz}" = "xbundled"; then
    USE_EXTERNAL_HARFBUZZ=false
    HARFBUZZ_CFLAGS=""
    HARFBUZZ_LIBS=""
    AC_MSG_RESULT([bundled])
  elif test "x${with_harfbuzz}" = "xsystem"; then
    AC_MSG_RESULT([system])
    PKG_CHECK_MODULES([HARFBUZZ], [harfbuzz], [HARFBUZZ_FOUND=yes], [HARFBUZZ_FOUND=no])
    if test "x${HARFBUZZ_FOUND}" = "xyes"; then
      # PKG_CHECK_MODULES will set HARFBUZZ_CFLAGS and HARFBUZZ_LIBS
      USE_EXTERNAL_HARFBUZZ=true
    else
      HELP_MSG_MISSING_DEPENDENCY([harfbuzz])
      AC_MSG_ERROR([--with-harfbuzz=system specified, but no harfbuzz found! $HELP_MSG])
    fi
  else
    AC_MSG_ERROR([Invalid value for --with-harfbuzz: ${with_harfbuzz}, use 'system' or 'bundled'])
  fi

  AC_SUBST(USE_EXTERNAL_HARFBUZZ)
  AC_SUBST(HARFBUZZ_CFLAGS)
  AC_SUBST(HARFBUZZ_LIBS)
])
