Annotation of embedaddon/libiconv/srcm4/include_next.m4, revision 1.1.1.1

1.1       misho       1: # include_next.m4 serial 14
                      2: dnl Copyright (C) 2006-2009 Free Software Foundation, Inc.
                      3: dnl This file is free software; the Free Software Foundation
                      4: dnl gives unlimited permission to copy and/or distribute it,
                      5: dnl with or without modifications, as long as this notice is preserved.
                      6: 
                      7: dnl From Paul Eggert and Derek Price.
                      8: 
                      9: dnl Sets INCLUDE_NEXT and PRAGMA_SYSTEM_HEADER.
                     10: dnl
                     11: dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to
                     12: dnl 'include' otherwise.
                     13: dnl
                     14: dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler
                     15: dnl supports it in the special case that it is the first include directive in
                     16: dnl the given file, or to 'include' otherwise.
                     17: dnl
                     18: dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next,
                     19: dnl so as to avoid GCC warnings when the gcc option -pedantic is used.
                     20: dnl '#pragma GCC system_header' has the same effect as if the file was found
                     21: dnl through the include search path specified with '-isystem' options (as
                     22: dnl opposed to the search path specified with '-I' options). Namely, gcc
                     23: dnl does not warn about some things, and on some systems (Solaris and Interix)
                     24: dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side
                     25: dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead
                     26: dnl of plain '__STDC__'.
                     27: 
                     28: AC_DEFUN([gl_INCLUDE_NEXT],
                     29: [
                     30:   AC_LANG_PREPROC_REQUIRE()
                     31:   AC_CACHE_CHECK([whether the preprocessor supports include_next],
                     32:     [gl_cv_have_include_next],
                     33:     [rm -rf conftestd1a conftestd1b conftestd2
                     34:      mkdir conftestd1a conftestd1b conftestd2
                     35:      dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on
                     36:      dnl AIX 6.1 support include_next when used as first preprocessor directive
                     37:      dnl in a file, but not when preceded by another include directive. Check
                     38:      dnl for this bug by including <stdio.h>.
                     39:      dnl Additionally, with this same compiler, include_next is a no-op when
                     40:      dnl used in a header file that was included by specifying its absolute
                     41:      dnl file name. Despite these two bugs, include_next is used in the
                     42:      dnl compiler's <math.h>. By virtue of the second bug, we need to use
                     43:      dnl include_next as well in this case.
                     44:      cat <<EOF > conftestd1a/conftest.h
                     45: #define DEFINED_IN_CONFTESTD1
                     46: #include_next <conftest.h>
                     47: #ifdef DEFINED_IN_CONFTESTD2
                     48: int foo;
                     49: #else
                     50: #error "include_next doesn't work"
                     51: #endif
                     52: EOF
                     53:      cat <<EOF > conftestd1b/conftest.h
                     54: #define DEFINED_IN_CONFTESTD1
                     55: #include <stdio.h>
                     56: #include_next <conftest.h>
                     57: #ifdef DEFINED_IN_CONFTESTD2
                     58: int foo;
                     59: #else
                     60: #error "include_next doesn't work"
                     61: #endif
                     62: EOF
                     63:      cat <<EOF > conftestd2/conftest.h
                     64: #ifndef DEFINED_IN_CONFTESTD1
                     65: #error "include_next test doesn't work"
                     66: #endif
                     67: #define DEFINED_IN_CONFTESTD2
                     68: EOF
                     69:      gl_save_CPPFLAGS="$CPPFLAGS"
                     70:      CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
                     71:      AC_COMPILE_IFELSE([#include <conftest.h>],
                     72:        [gl_cv_have_include_next=yes],
                     73:        [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
                     74:         AC_COMPILE_IFELSE([#include <conftest.h>],
                     75:           [gl_cv_have_include_next=buggy],
                     76:           [gl_cv_have_include_next=no])
                     77:        ])
                     78:      CPPFLAGS="$gl_save_CPPFLAGS"
                     79:      rm -rf conftestd1a conftestd1b conftestd2
                     80:     ])
                     81:   PRAGMA_SYSTEM_HEADER=
                     82:   if test $gl_cv_have_include_next = yes; then
                     83:     INCLUDE_NEXT=include_next
                     84:     INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
                     85:     if test -n "$GCC"; then
                     86:       PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
                     87:     fi
                     88:   else
                     89:     if test $gl_cv_have_include_next = buggy; then
                     90:       INCLUDE_NEXT=include
                     91:       INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
                     92:     else
                     93:       INCLUDE_NEXT=include
                     94:       INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
                     95:     fi
                     96:   fi
                     97:   AC_SUBST([INCLUDE_NEXT])
                     98:   AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE])
                     99:   AC_SUBST([PRAGMA_SYSTEM_HEADER])
                    100: ])
                    101: 
                    102: # gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...)
                    103: # ------------------------------------------
                    104: # For each arg foo.h, if #include_next works, define NEXT_FOO_H to be
                    105: # '<foo.h>'; otherwise define it to be
                    106: # '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
                    107: # Also, if #include_next works as first preprocessing directive in a file,
                    108: # define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be '<foo.h>'; otherwise define it to
                    109: # be
                    110: # '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
                    111: # That way, a header file with the following line:
                    112: #      #@INCLUDE_NEXT@ @NEXT_FOO_H@
                    113: # or
                    114: #      #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@
                    115: # behaves (after sed substitution) as if it contained
                    116: #      #include_next <foo.h>
                    117: # even if the compiler does not support include_next.
                    118: # The three "///" are to pacify Sun C 5.8, which otherwise would say
                    119: # "warning: #include of /usr/include/... may be non-portable".
                    120: # Use `""', not `<>', so that the /// cannot be confused with a C99 comment.
                    121: # Note: This macro assumes that the header file is not empty after
                    122: # preprocessing, i.e. it does not only define preprocessor macros but also
                    123: # provides some type/enum definitions or function/variable declarations.
                    124: AC_DEFUN([gl_CHECK_NEXT_HEADERS],
                    125: [
                    126:   AC_REQUIRE([gl_INCLUDE_NEXT])
                    127:   AC_REQUIRE([AC_CANONICAL_HOST])
                    128:   AC_CHECK_HEADERS_ONCE([$1])
                    129: 
                    130:   m4_foreach_w([gl_HEADER_NAME], [$1],
                    131:     [AS_VAR_PUSHDEF([gl_next_header],
                    132:                    [gl_cv_next_]m4_defn([gl_HEADER_NAME]))
                    133:      if test $gl_cv_have_include_next = yes; then
                    134:        AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>'])
                    135:      else
                    136:        AC_CACHE_CHECK(
                    137:         [absolute name of <]m4_defn([gl_HEADER_NAME])[>],
                    138:         m4_defn([gl_next_header]),
                    139:         [AS_VAR_PUSHDEF([gl_header_exists],
                    140:                         [ac_cv_header_]m4_defn([gl_HEADER_NAME]))
                    141:          if test AS_VAR_GET(gl_header_exists) = yes; then
                    142:            AC_LANG_CONFTEST(
                    143:              [AC_LANG_SOURCE(
                    144:                 [[#include <]]m4_dquote(m4_defn([gl_HEADER_NAME]))[[>]]
                    145:               )])
                    146:            dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
                    147:            dnl that contain only a #include of other header files and no
                    148:            dnl non-comment tokens of their own. This leads to a failure to
                    149:            dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
                    150:            dnl and others. The workaround is to force preservation of comments
                    151:            dnl through option -C. This ensures all necessary #line directives
                    152:            dnl are present. GCC supports option -C as well.
                    153:            case "$host_os" in
                    154:              aix*) gl_absname_cpp="$ac_cpp -C" ;;
                    155:              *)    gl_absname_cpp="$ac_cpp" ;;
                    156:            esac
                    157:            dnl eval is necessary to expand gl_absname_cpp.
                    158:            dnl Ultrix and Pyramid sh refuse to redirect output of eval,
                    159:            dnl so use subshell.
                    160:            AS_VAR_SET([gl_next_header],
                    161:              ['"'`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
                    162:               sed -n '\#/]m4_defn([gl_HEADER_NAME])[#{
                    163:                 s#.*"\(.*/]m4_defn([gl_HEADER_NAME])[\)".*#\1#
                    164:                 s#^/[^/]#//&#
                    165:                 p
                    166:                 q
                    167:               }'`'"'])
                    168:          else
                    169:            AS_VAR_SET([gl_next_header], ['<'gl_HEADER_NAME'>'])
                    170:          fi
                    171:          AS_VAR_POPDEF([gl_header_exists])])
                    172:      fi
                    173:      AC_SUBST(
                    174:        AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])),
                    175:        [AS_VAR_GET([gl_next_header])])
                    176:      if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
                    177:        # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
                    178:        gl_next_as_first_directive='<'gl_HEADER_NAME'>'
                    179:      else
                    180:        # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
                    181:        gl_next_as_first_directive=AS_VAR_GET([gl_next_header])
                    182:      fi
                    183:      AC_SUBST(
                    184:        AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])),
                    185:        [$gl_next_as_first_directive])
                    186:      AS_VAR_POPDEF([gl_next_header])])
                    187: ])

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>