# libunistring.m4 serial 13
dnl Copyright (C) 2009-2024 Free Software Foundation, Inc.
dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved.

AC_PREREQ([2.64])

dnl gl_LIBUNISTRING
dnl Searches for an installed libunistring.
dnl If found, it sets and AC_SUBSTs HAVE_LIBUNISTRING=yes and the LIBUNISTRING
dnl and LTLIBUNISTRING variables, sets the LIBUNISTRING_VERSION variable, and
dnl augments the CPPFLAGS variable, and #defines HAVE_LIBUNISTRING to 1.
dnl Otherwise, it sets and AC_SUBSTs HAVE_LIBUNISTRING=no and LIBUNISTRING and
dnl LTLIBUNISTRING to empty.

dnl Define gl_LIBUNISTRING using AC_DEFUN_ONCE, in order dnl to avoid warnings
dnl like
dnl "warning: AC_REQUIRE: `gl_LIBUNISTRING' was expanded before it was required".
dnl This is tricky because of the way 'aclocal' is implemented:
dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
dnl   Otherwise aclocal's initial scan pass would miss the macro definition.
dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
dnl   Otherwise aclocal would emit many "Use of uninitialized value $1"
dnl   warnings.
AC_DEFUN_ONCE([gl_LIBUNISTRING],
[
  AC_BEFORE([$0], [gl_LIBUNISTRING_MODULE])
  AC_BEFORE([$0], [gl_LIBUNISTRING_LIBHEADER])
  AC_BEFORE([$0], [gl_LIBUNISTRING_LIB_PREPARE])

  m4_ifdef([gl_LIBUNISTRING_OPTIONAL],
    [
      AC_MSG_CHECKING([whether included libunistring is requested])
      AC_ARG_WITH([included-libunistring],
        [  --with-included-libunistring  use the libunistring parts included here],
        [gl_libunistring_force_included=$withval],
        [gl_libunistring_force_included=no])
      AC_MSG_RESULT([$gl_libunistring_force_included])
      gl_libunistring_use_included="$gl_libunistring_force_included"
      if test "$gl_libunistring_use_included" = yes; then
        dnl Assume that libunistring is not installed until some other macro
        dnl explicitly invokes gl_LIBUNISTRING_CORE.
        if test -z "$HAVE_LIBUNISTRING"; then
          HAVE_LIBUNISTRING=no
        fi
        LIBUNISTRING=
        LTLIBUNISTRING=
      else
        gl_LIBUNISTRING_CORE
        if test $HAVE_LIBUNISTRING = no; then
          gl_libunistring_use_included=yes
          LIBUNISTRING=
          LTLIBUNISTRING=
        fi
      fi
    ],
    [gl_LIBUNISTRING_CORE])
])

AC_DEFUN([gl_LIBUNISTRING_CORE],
[
  AC_REQUIRE([AM_ICONV])
  if test -n "$LIBICONV"; then
    dnl First, try to link without -liconv. libunistring often depends on
    dnl libiconv, but we don't know (and often don't need to know) where
    dnl libiconv is installed.
    AC_LIB_HAVE_LINKFLAGS([unistring], [],
      [#include <uniconv.h>], [u8_strconv_from_locale((char*)0);],
      [no, trying again together with libiconv])
    if test "$ac_cv_libunistring" != yes; then
      dnl Second try, with -liconv.
      dnl We have to erase the cached result of the first AC_LIB_HAVE_LINKFLAGS
      dnl invocation, otherwise the second one will not be run.
      unset ac_cv_libunistring
      glus_saved_LIBS="$LIBS"
      LIBS="$LIBS $LIBICONV"
      AC_LIB_HAVE_LINKFLAGS([unistring], [],
        [#include <uniconv.h>], [u8_strconv_from_locale((char*)0);],
        [no, consider installing GNU libunistring])
      if test -n "$LIBUNISTRING"; then
        LIBUNISTRING="$LIBUNISTRING $LIBICONV"
        LTLIBUNISTRING="$LTLIBUNISTRING $LTLIBICONV"
      fi
      LIBS="$glus_saved_LIBS"
    fi
  else
    AC_LIB_HAVE_LINKFLAGS([unistring], [],
      [#include <uniconv.h>], [u8_strconv_from_locale((char*)0);],
      [no, consider installing GNU libunistring])
  fi
  if test $HAVE_LIBUNISTRING = yes; then
    dnl Determine the installed version.
    AC_CACHE_CHECK([for libunistring version], [gl_cv_libunistring_version],
      [AC_COMPUTE_INT([gl_libunistring_hexversion],
                      [_LIBUNISTRING_VERSION],
                      [#include <unistring/version.h>])
       dnl Versions <= 0.9.3 had a hexversion of 0x0009.
       dnl Use other tests to distinguish them.
       if test $gl_libunistring_hexversion = 9; then
         dnl Version 0.9.2 introduced the header <unistring/cdefs.h>.
         AC_COMPILE_IFELSE(
           [AC_LANG_PROGRAM([[#include <unistring/cdefs.h>]], [[]])],
           [gl_cv_libunistring_version092=true],
           [gl_cv_libunistring_version092=false])
         if $gl_cv_libunistring_version092; then
           dnl Version 0.9.3 changed a comment in <unistr.h>.
           gl_ABSOLUTE_HEADER_ONE([unistr.h])
           if test -n "$gl_cv_absolute_unistr_h" \
              && grep 'Copy no more than N units of SRC to DEST.  Return a pointer' $gl_cv_absolute_unistr_h > /dev/null; then
             dnl Detected version 0.9.3.
             gl_libunistring_hexversion=2307
           else
             dnl Detected version 0.9.2.
             gl_libunistring_hexversion=2306
           fi
         else
           dnl Version 0.9.1 introduced the type casing_suffix_context_t.
           AC_COMPILE_IFELSE(
             [AC_LANG_PROGRAM(
                [[#include <unicase.h>
                  casing_suffix_context_t ct;]],
                [[]])],
             [gl_cv_libunistring_version091=true],
             [gl_cv_libunistring_version091=false])
           if $gl_cv_libunistring_version091; then
             dnl Detected version 0.9.1.
             gl_libunistring_hexversion=2305
           else
             dnl Detected version 0.9.
             gl_libunistring_hexversion=2304
           fi
         fi
       fi
       dnl Transform into the usual major.minor.subminor notation.
       gl_libunistring_major=`expr $gl_libunistring_hexversion / 65536`
       gl_libunistring_minor=`expr $gl_libunistring_hexversion / 256 % 256`
       gl_libunistring_subminor=`expr $gl_libunistring_hexversion % 256`
       gl_cv_libunistring_version="$gl_libunistring_major.$gl_libunistring_minor.$gl_libunistring_subminor"
      ])
    LIBUNISTRING_VERSION="$gl_cv_libunistring_version"
  fi
])