Annotation of embedaddon/libiconv/srcm4/include_next.m4, revision 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>