xref: /Universal-ctags/m4/absolute-header.m4 (revision 820c1a8d46849a90376d8eb15b319ac05439f656)
1*820c1a8dSHiroo HAYASHI# absolute-header.m4 serial 17
2*820c1a8dSHiroo HAYASHIdnl Copyright (C) 2006-2021 Free Software Foundation, Inc.
3*820c1a8dSHiroo HAYASHIdnl This file is free software; the Free Software Foundation
4*820c1a8dSHiroo HAYASHIdnl gives unlimited permission to copy and/or distribute it,
5*820c1a8dSHiroo HAYASHIdnl with or without modifications, as long as this notice is preserved.
6*820c1a8dSHiroo HAYASHI
7*820c1a8dSHiroo HAYASHIdnl From Derek Price.
8*820c1a8dSHiroo HAYASHI
9*820c1a8dSHiroo HAYASHI# gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...)
10*820c1a8dSHiroo HAYASHI# ---------------------------------------
11*820c1a8dSHiroo HAYASHI# Find the absolute name of a header file, testing first if the header exists.
12*820c1a8dSHiroo HAYASHI# If the header were sys/inttypes.h, this macro would define
13*820c1a8dSHiroo HAYASHI# ABSOLUTE_SYS_INTTYPES_H to the '""' quoted absolute name of sys/inttypes.h
14*820c1a8dSHiroo HAYASHI# in config.h
15*820c1a8dSHiroo HAYASHI# (e.g. '#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"').
16*820c1a8dSHiroo HAYASHI# The three "///" are to pacify Sun C 5.8, which otherwise would say
17*820c1a8dSHiroo HAYASHI# "warning: #include of /usr/include/... may be non-portable".
18*820c1a8dSHiroo HAYASHI# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
19*820c1a8dSHiroo HAYASHI# Note: This macro assumes that the header file is not empty after
20*820c1a8dSHiroo HAYASHI# preprocessing, i.e. it does not only define preprocessor macros but also
21*820c1a8dSHiroo HAYASHI# provides some type/enum definitions or function/variable declarations.
22*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_ABSOLUTE_HEADER],
23*820c1a8dSHiroo HAYASHI[AC_REQUIRE([AC_CANONICAL_HOST])
24*820c1a8dSHiroo HAYASHIAC_LANG_PREPROC_REQUIRE()dnl
25*820c1a8dSHiroo HAYASHIm4_foreach_w([gl_HEADER_NAME], [$1],
26*820c1a8dSHiroo HAYASHI  [AS_VAR_PUSHDEF([gl_absolute_header],
27*820c1a8dSHiroo HAYASHI                  [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl
28*820c1a8dSHiroo HAYASHI  AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>],
29*820c1a8dSHiroo HAYASHI    [gl_absolute_header],
30*820c1a8dSHiroo HAYASHI    [AS_VAR_PUSHDEF([ac_header_exists],
31*820c1a8dSHiroo HAYASHI                    [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl
32*820c1a8dSHiroo HAYASHI    AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl
33*820c1a8dSHiroo HAYASHI    if test AS_VAR_GET([ac_header_exists]) = yes; then
34*820c1a8dSHiroo HAYASHI      gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME]))
35*820c1a8dSHiroo HAYASHI    fi
36*820c1a8dSHiroo HAYASHI    AS_VAR_POPDEF([ac_header_exists])dnl
37*820c1a8dSHiroo HAYASHI    ])dnl
38*820c1a8dSHiroo HAYASHI  AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])),
39*820c1a8dSHiroo HAYASHI                     ["AS_VAR_GET([gl_absolute_header])"],
40*820c1a8dSHiroo HAYASHI                     [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.])
41*820c1a8dSHiroo HAYASHI  AS_VAR_POPDEF([gl_absolute_header])dnl
42*820c1a8dSHiroo HAYASHI])dnl
43*820c1a8dSHiroo HAYASHI])# gl_ABSOLUTE_HEADER
44*820c1a8dSHiroo HAYASHI
45*820c1a8dSHiroo HAYASHI# gl_ABSOLUTE_HEADER_ONE(HEADER)
46*820c1a8dSHiroo HAYASHI# ------------------------------
47*820c1a8dSHiroo HAYASHI# Like gl_ABSOLUTE_HEADER, except that:
48*820c1a8dSHiroo HAYASHI#   - it assumes that the header exists,
49*820c1a8dSHiroo HAYASHI#   - it uses the current CPPFLAGS,
50*820c1a8dSHiroo HAYASHI#   - it does not cache the result,
51*820c1a8dSHiroo HAYASHI#   - it is silent.
52*820c1a8dSHiroo HAYASHIAC_DEFUN([gl_ABSOLUTE_HEADER_ONE],
53*820c1a8dSHiroo HAYASHI[
54*820c1a8dSHiroo HAYASHI  AC_REQUIRE([AC_CANONICAL_HOST])
55*820c1a8dSHiroo HAYASHI  AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote([$1])[[>]])])
56*820c1a8dSHiroo HAYASHI  dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
57*820c1a8dSHiroo HAYASHI  dnl that contain only a #include of other header files and no
58*820c1a8dSHiroo HAYASHI  dnl non-comment tokens of their own. This leads to a failure to
59*820c1a8dSHiroo HAYASHI  dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
60*820c1a8dSHiroo HAYASHI  dnl and others. The workaround is to force preservation of comments
61*820c1a8dSHiroo HAYASHI  dnl through option -C. This ensures all necessary #line directives
62*820c1a8dSHiroo HAYASHI  dnl are present. GCC supports option -C as well.
63*820c1a8dSHiroo HAYASHI  case "$host_os" in
64*820c1a8dSHiroo HAYASHI    aix*) gl_absname_cpp="$ac_cpp -C" ;;
65*820c1a8dSHiroo HAYASHI    *)    gl_absname_cpp="$ac_cpp" ;;
66*820c1a8dSHiroo HAYASHI  esac
67*820c1a8dSHiroo HAYASHIchangequote(,)
68*820c1a8dSHiroo HAYASHI  case "$host_os" in
69*820c1a8dSHiroo HAYASHI    mingw*)
70*820c1a8dSHiroo HAYASHI      dnl For the sake of native Windows compilers (excluding gcc),
71*820c1a8dSHiroo HAYASHI      dnl treat backslash as a directory separator, like /.
72*820c1a8dSHiroo HAYASHI      dnl Actually, these compilers use a double-backslash as
73*820c1a8dSHiroo HAYASHI      dnl directory separator, inside the
74*820c1a8dSHiroo HAYASHI      dnl   # line "filename"
75*820c1a8dSHiroo HAYASHI      dnl directives.
76*820c1a8dSHiroo HAYASHI      gl_dirsep_regex='[/\\]'
77*820c1a8dSHiroo HAYASHI      ;;
78*820c1a8dSHiroo HAYASHI    *)
79*820c1a8dSHiroo HAYASHI      gl_dirsep_regex='\/'
80*820c1a8dSHiroo HAYASHI      ;;
81*820c1a8dSHiroo HAYASHI  esac
82*820c1a8dSHiroo HAYASHI  dnl A sed expression that turns a string into a basic regular
83*820c1a8dSHiroo HAYASHI  dnl expression, for use within "/.../".
84*820c1a8dSHiroo HAYASHI  gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
85*820c1a8dSHiroo HAYASHI  gl_header_literal_regex=`echo '$1' \
86*820c1a8dSHiroo HAYASHI                           | sed -e "$gl_make_literal_regex_sed"`
87*820c1a8dSHiroo HAYASHI  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
88*820c1a8dSHiroo HAYASHI      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
89*820c1a8dSHiroo HAYASHI      s|^/[^/]|//&|
90*820c1a8dSHiroo HAYASHI      p
91*820c1a8dSHiroo HAYASHI      q
92*820c1a8dSHiroo HAYASHI    }'
93*820c1a8dSHiroo HAYASHIchangequote([,])
94*820c1a8dSHiroo HAYASHI  dnl eval is necessary to expand gl_absname_cpp.
95*820c1a8dSHiroo HAYASHI  dnl Ultrix and Pyramid sh refuse to redirect output of eval,
96*820c1a8dSHiroo HAYASHI  dnl so use subshell.
97*820c1a8dSHiroo HAYASHI  AS_VAR_SET([gl_cv_absolute_]AS_TR_SH([[$1]]),
98*820c1a8dSHiroo HAYASHI[`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
99*820c1a8dSHiroo HAYASHI  sed -n "$gl_absolute_header_sed"`])
100*820c1a8dSHiroo HAYASHI])
101