Blame m4/absolute-header.m4

Packit Service a2489d
# absolute-header.m4 serial 16
Packit Service a2489d
dnl Copyright (C) 2006-2018 Free Software Foundation, Inc.
Packit Service a2489d
dnl This file is free software; the Free Software Foundation
Packit Service a2489d
dnl gives unlimited permission to copy and/or distribute it,
Packit Service a2489d
dnl with or without modifications, as long as this notice is preserved.
Packit Service a2489d
Packit Service a2489d
dnl From Derek Price.
Packit Service a2489d
Packit Service a2489d
# gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...)
Packit Service a2489d
# ---------------------------------------
Packit Service a2489d
# Find the absolute name of a header file, testing first if the header exists.
Packit Service a2489d
# If the header were sys/inttypes.h, this macro would define
Packit Service a2489d
# ABSOLUTE_SYS_INTTYPES_H to the '""' quoted absolute name of sys/inttypes.h
Packit Service a2489d
# in config.h
Packit Service a2489d
# (e.g. '#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"').
Packit Service a2489d
# The three "///" are to pacify Sun C 5.8, which otherwise would say
Packit Service a2489d
# "warning: #include of /usr/include/... may be non-portable".
Packit Service a2489d
# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
Packit Service a2489d
# Note: This macro assumes that the header file is not empty after
Packit Service a2489d
# preprocessing, i.e. it does not only define preprocessor macros but also
Packit Service a2489d
# provides some type/enum definitions or function/variable declarations.
Packit Service a2489d
AC_DEFUN([gl_ABSOLUTE_HEADER],
Packit Service a2489d
[AC_REQUIRE([AC_CANONICAL_HOST])
Packit Service a2489d
AC_LANG_PREPROC_REQUIRE()dnl
Packit Service a2489d
dnl FIXME: gl_absolute_header and ac_header_exists must be used unquoted
Packit Service a2489d
dnl until we can assume autoconf 2.64 or newer.
Packit Service a2489d
m4_foreach_w([gl_HEADER_NAME], [$1],
Packit Service a2489d
  [AS_VAR_PUSHDEF([gl_absolute_header],
Packit Service a2489d
                  [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl
Packit Service a2489d
  AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>],
Packit Service a2489d
    m4_defn([gl_absolute_header]),
Packit Service a2489d
    [AS_VAR_PUSHDEF([ac_header_exists],
Packit Service a2489d
                    [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl
Packit Service a2489d
    AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl
Packit Service a2489d
    if test AS_VAR_GET(ac_header_exists) = yes; then
Packit Service a2489d
      gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME]))
Packit Service a2489d
    fi
Packit Service a2489d
    AS_VAR_POPDEF([ac_header_exists])dnl
Packit Service a2489d
    ])dnl
Packit Service a2489d
  AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])),
Packit Service a2489d
                     ["AS_VAR_GET(gl_absolute_header)"],
Packit Service a2489d
                     [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.])
Packit Service a2489d
  AS_VAR_POPDEF([gl_absolute_header])dnl
Packit Service a2489d
])dnl
Packit Service a2489d
])# gl_ABSOLUTE_HEADER
Packit Service a2489d
Packit Service a2489d
# gl_ABSOLUTE_HEADER_ONE(HEADER)
Packit Service a2489d
# ------------------------------
Packit Service a2489d
# Like gl_ABSOLUTE_HEADER, except that:
Packit Service a2489d
#   - it assumes that the header exists,
Packit Service a2489d
#   - it uses the current CPPFLAGS,
Packit Service a2489d
#   - it does not cache the result,
Packit Service a2489d
#   - it is silent.
Packit Service a2489d
AC_DEFUN([gl_ABSOLUTE_HEADER_ONE],
Packit Service a2489d
[
Packit Service a2489d
  AC_REQUIRE([AC_CANONICAL_HOST])
Packit Service a2489d
  AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote([$1])[[>]])])
Packit Service a2489d
  dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
Packit Service a2489d
  dnl that contain only a #include of other header files and no
Packit Service a2489d
  dnl non-comment tokens of their own. This leads to a failure to
Packit Service a2489d
  dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
Packit Service a2489d
  dnl and others. The workaround is to force preservation of comments
Packit Service a2489d
  dnl through option -C. This ensures all necessary #line directives
Packit Service a2489d
  dnl are present. GCC supports option -C as well.
Packit Service a2489d
  case "$host_os" in
Packit Service a2489d
    aix*) gl_absname_cpp="$ac_cpp -C" ;;
Packit Service a2489d
    *)    gl_absname_cpp="$ac_cpp" ;;
Packit Service a2489d
  esac
Packit Service a2489d
changequote(,)
Packit Service a2489d
  case "$host_os" in
Packit Service a2489d
    mingw*)
Packit Service a2489d
      dnl For the sake of native Windows compilers (excluding gcc),
Packit Service a2489d
      dnl treat backslash as a directory separator, like /.
Packit Service a2489d
      dnl Actually, these compilers use a double-backslash as
Packit Service a2489d
      dnl directory separator, inside the
Packit Service a2489d
      dnl   # line "filename"
Packit Service a2489d
      dnl directives.
Packit Service a2489d
      gl_dirsep_regex='[/\\]'
Packit Service a2489d
      ;;
Packit Service a2489d
    *)
Packit Service a2489d
      gl_dirsep_regex='\/'
Packit Service a2489d
      ;;
Packit Service a2489d
  esac
Packit Service a2489d
  dnl A sed expression that turns a string into a basic regular
Packit Service a2489d
  dnl expression, for use within "/.../".
Packit Service a2489d
  gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
Packit Service a2489d
  gl_header_literal_regex=`echo '$1' \
Packit Service a2489d
                           | sed -e "$gl_make_literal_regex_sed"`
Packit Service a2489d
  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
Packit Service a2489d
      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
Packit Service a2489d
      s|^/[^/]|//&|
Packit Service a2489d
      p
Packit Service a2489d
      q
Packit Service a2489d
    }'
Packit Service a2489d
changequote([,])
Packit Service a2489d
  dnl eval is necessary to expand gl_absname_cpp.
Packit Service a2489d
  dnl Ultrix and Pyramid sh refuse to redirect output of eval,
Packit Service a2489d
  dnl so use subshell.
Packit Service a2489d
  AS_VAR_SET([gl_cv_absolute_]AS_TR_SH([[$1]]),
Packit Service a2489d
[`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
Packit Service a2489d
  sed -n "$gl_absolute_header_sed"`])
Packit Service a2489d
])