[ovs-dev] [PATCH 1/2] configure: Add macros to check for #include_next and add a workaround.

Gurucharan Shetty shettyg at nicira.com
Thu Dec 12 19:30:49 UTC 2013


Between, what is the difference between NOTICE and COPYING?

On Thu, Dec 12, 2013 at 11:27 AM, Gurucharan Shetty <shettyg at nicira.com> wrote:
> On Wed, Dec 11, 2013 at 3:04 PM, Ben Pfaff <blp at nicira.com> wrote:
>> This will be used for the #include_next in string.h in the following
>> commit.
>>
>> Signed-off-by: Ben Pfaff <blp at nicira.com>
>> ---
>>  NOTICE                |    5 +-
>>  build-aux/.gitignore  |    2 +
>>  debian/copyright.in   |   10 ++-
>>  m4/absolute-header.m4 |  102 ++++++++++++++++++++++
>>  m4/include_next.m4    |  223 +++++++++++++++++++++++++++++++++++++++++++++++++
>>  m4/openvswitch.m4     |    5 ++
>>  6 files changed, 345 insertions(+), 2 deletions(-)
>>  create mode 100644 m4/absolute-header.m4
>>  create mode 100644 m4/include_next.m4
> I get the following error after a 'make':
> The distribution is missing the following files:
> m4/absolute-header.m4
> m4/include_next.m4
> make[2]: *** [dist-hook-git] Error 1
> make[2]: Leaving directory `/root/git/test'
> make[1]: *** [all-recursive] Error 1
> make[1]: Leaving directory `/root/git/test'
> make: *** [all] Error 2
>
> The above problem goes away after adding the second patch though.
>
> I did not review the included files from external sources, otherwise looks good.
>>
>> diff --git a/NOTICE b/NOTICE
>> index dafd25f..7a3d660 100644
>> --- a/NOTICE
>> +++ b/NOTICE
>> @@ -2,7 +2,7 @@ This file is included in compliance with the Apache 2.0 license,
>>  available at http://www.apache.org/licenses/LICENSE-2.0.html
>>
>>  Open vSwitch
>> -Copyright (c) 2007, 2008, 2009, 2010, 2011 Nicira, Inc.
>> +Copyright (c) 2007, 2008, 2009, 2010, 2011, 2013 Nicira, Inc.
>>
>>  Open vSwitch BSD port
>>  Copyright (c) 2011 Gaetano Catalli
>> @@ -19,3 +19,6 @@ Illinois at Urbana-Champaign.
>>
>>  lib/ovs.tmac includes troff macros written by Eric S. Raymond
>>  and Werner Lemberg.
>> +
>> +m4/include_next.m4 and m4/absolute-header.m4
>> +Copyright (C) 2006-2013 Free Software Foundation, Inc.
>> diff --git a/build-aux/.gitignore b/build-aux/.gitignore
>> index 999eae2..3cb4071 100644
>> --- a/build-aux/.gitignore
>> +++ b/build-aux/.gitignore
>> @@ -1,4 +1,6 @@
>>  /compile
>> +/config.guess
>> +/config.sub
>>  /depcomp
>>  /install-sh
>>  /missing
>> diff --git a/debian/copyright.in b/debian/copyright.in
>> index 986f7a1..0676387 100644
>> --- a/debian/copyright.in
>> +++ b/debian/copyright.in
>> @@ -8,7 +8,7 @@ Upstream Authors (from AUTHORS):
>>
>>  Upstream Copyright Holders:
>>
>> -       Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012 Nicira, Inc.
>> +       Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
>>         Copyright (c) 2010 Jean Tourrilhes - HP-Labs.
>>         Copyright (c) 2008,2009,2010 Citrix Systems, Inc.
>>         and authors listed above.
>> @@ -182,6 +182,14 @@ License:
>>      .\" Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc.
>>      .\" You may freely use, modify and/or distribute this file.
>>
>> +* m4/absolute-header.m4, by Derek Price, and m4/include_next.m4, by
>> +  Paul Eggert and Derek Price bear the following notices:
>> +
>> +    Copyright (C) 2006-2013 Free Software Foundation, Inc.
>> +    This file is free software; the Free Software Foundation
>> +    gives unlimited permission to copy and/or distribute it,
>> +    with or without modifications, as long as this notice is preserved.
>> +
>>  * All other components of this package are licensed under
>>    The Apache License Version 2.0.
>>
>> diff --git a/m4/absolute-header.m4 b/m4/absolute-header.m4
>> new file mode 100644
>> index 0000000..89ff5be
>> --- /dev/null
>> +++ b/m4/absolute-header.m4
>> @@ -0,0 +1,102 @@
>> +# absolute-header.m4 serial 16
>> +dnl Copyright (C) 2006-2013 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.
>> +
>> +dnl From Derek Price.
>> +
>> +# gl_ABSOLUTE_HEADER(HEADER1 HEADER2 ...)
>> +# ---------------------------------------
>> +# Find the absolute name of a header file, testing first if the header exists.
>> +# If the header were sys/inttypes.h, this macro would define
>> +# ABSOLUTE_SYS_INTTYPES_H to the '""' quoted absolute name of sys/inttypes.h
>> +# in config.h
>> +# (e.g. '#define ABSOLUTE_SYS_INTTYPES_H "///usr/include/sys/inttypes.h"').
>> +# The three "///" are to pacify Sun C 5.8, which otherwise would say
>> +# "warning: #include of /usr/include/... may be non-portable".
>> +# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
>> +# Note: This macro assumes that the header file is not empty after
>> +# preprocessing, i.e. it does not only define preprocessor macros but also
>> +# provides some type/enum definitions or function/variable declarations.
>> +AC_DEFUN([gl_ABSOLUTE_HEADER],
>> +[AC_REQUIRE([AC_CANONICAL_HOST])
>> +AC_LANG_PREPROC_REQUIRE()dnl
>> +dnl FIXME: gl_absolute_header and ac_header_exists must be used unquoted
>> +dnl until we can assume autoconf 2.64 or newer.
>> +m4_foreach_w([gl_HEADER_NAME], [$1],
>> +  [AS_VAR_PUSHDEF([gl_absolute_header],
>> +                  [gl_cv_absolute_]m4_defn([gl_HEADER_NAME]))dnl
>> +  AC_CACHE_CHECK([absolute name of <]m4_defn([gl_HEADER_NAME])[>],
>> +    m4_defn([gl_absolute_header]),
>> +    [AS_VAR_PUSHDEF([ac_header_exists],
>> +                    [ac_cv_header_]m4_defn([gl_HEADER_NAME]))dnl
>> +    AC_CHECK_HEADERS_ONCE(m4_defn([gl_HEADER_NAME]))dnl
>> +    if test AS_VAR_GET(ac_header_exists) = yes; then
>> +      gl_ABSOLUTE_HEADER_ONE(m4_defn([gl_HEADER_NAME]))
>> +    fi
>> +    AS_VAR_POPDEF([ac_header_exists])dnl
>> +    ])dnl
>> +  AC_DEFINE_UNQUOTED(AS_TR_CPP([ABSOLUTE_]m4_defn([gl_HEADER_NAME])),
>> +                     ["AS_VAR_GET(gl_absolute_header)"],
>> +                     [Define this to an absolute name of <]m4_defn([gl_HEADER_NAME])[>.])
>> +  AS_VAR_POPDEF([gl_absolute_header])dnl
>> +])dnl
>> +])# gl_ABSOLUTE_HEADER
>> +
>> +# gl_ABSOLUTE_HEADER_ONE(HEADER)
>> +# ------------------------------
>> +# Like gl_ABSOLUTE_HEADER, except that:
>> +#   - it assumes that the header exists,
>> +#   - it uses the current CPPFLAGS,
>> +#   - it does not cache the result,
>> +#   - it is silent.
>> +AC_DEFUN([gl_ABSOLUTE_HEADER_ONE],
>> +[
>> +  AC_REQUIRE([AC_CANONICAL_HOST])
>> +  AC_LANG_CONFTEST([AC_LANG_SOURCE([[#include <]]m4_dquote([$1])[[>]])])
>> +  dnl AIX "xlc -E" and "cc -E" omit #line directives for header files
>> +  dnl that contain only a #include of other header files and no
>> +  dnl non-comment tokens of their own. This leads to a failure to
>> +  dnl detect the absolute name of <dirent.h>, <signal.h>, <poll.h>
>> +  dnl and others. The workaround is to force preservation of comments
>> +  dnl through option -C. This ensures all necessary #line directives
>> +  dnl are present. GCC supports option -C as well.
>> +  case "$host_os" in
>> +    aix*) gl_absname_cpp="$ac_cpp -C" ;;
>> +    *)    gl_absname_cpp="$ac_cpp" ;;
>> +  esac
>> +changequote(,)
>> +  case "$host_os" in
>> +    mingw*)
>> +      dnl For the sake of native Windows compilers (excluding gcc),
>> +      dnl treat backslash as a directory separator, like /.
>> +      dnl Actually, these compilers use a double-backslash as
>> +      dnl directory separator, inside the
>> +      dnl   # line "filename"
>> +      dnl directives.
>> +      gl_dirsep_regex='[/\\]'
>> +      ;;
>> +    *)
>> +      gl_dirsep_regex='\/'
>> +      ;;
>> +  esac
>> +  dnl A sed expression that turns a string into a basic regular
>> +  dnl expression, for use within "/.../".
>> +  gl_make_literal_regex_sed='s,[]$^\\.*/[],\\&,g'
>> +  gl_header_literal_regex=`echo '$1' \
>> +                           | sed -e "$gl_make_literal_regex_sed"`
>> +  gl_absolute_header_sed="/${gl_dirsep_regex}${gl_header_literal_regex}/"'{
>> +      s/.*"\(.*'"${gl_dirsep_regex}${gl_header_literal_regex}"'\)".*/\1/
>> +      s|^/[^/]|//&|
>> +      p
>> +      q
>> +    }'
>> +changequote([,])
>> +  dnl eval is necessary to expand gl_absname_cpp.
>> +  dnl Ultrix and Pyramid sh refuse to redirect output of eval,
>> +  dnl so use subshell.
>> +  AS_VAR_SET([gl_cv_absolute_]AS_TR_SH([[$1]]),
>> +[`(eval "$gl_absname_cpp conftest.$ac_ext") 2>&AS_MESSAGE_LOG_FD |
>> +  sed -n "$gl_absolute_header_sed"`])
>> +])
>> diff --git a/m4/include_next.m4 b/m4/include_next.m4
>> new file mode 100644
>> index 0000000..f09dbe6
>> --- /dev/null
>> +++ b/m4/include_next.m4
>> @@ -0,0 +1,223 @@
>> +# include_next.m4 serial 23
>> +dnl Copyright (C) 2006-2013 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.
>> +
>> +dnl From Paul Eggert and Derek Price.
>> +
>> +dnl Sets INCLUDE_NEXT and PRAGMA_SYSTEM_HEADER.
>> +dnl
>> +dnl INCLUDE_NEXT expands to 'include_next' if the compiler supports it, or to
>> +dnl 'include' otherwise.
>> +dnl
>> +dnl INCLUDE_NEXT_AS_FIRST_DIRECTIVE expands to 'include_next' if the compiler
>> +dnl supports it in the special case that it is the first include directive in
>> +dnl the given file, or to 'include' otherwise.
>> +dnl
>> +dnl PRAGMA_SYSTEM_HEADER can be used in files that contain #include_next,
>> +dnl so as to avoid GCC warnings when the gcc option -pedantic is used.
>> +dnl '#pragma GCC system_header' has the same effect as if the file was found
>> +dnl through the include search path specified with '-isystem' options (as
>> +dnl opposed to the search path specified with '-I' options). Namely, gcc
>> +dnl does not warn about some things, and on some systems (Solaris and Interix)
>> +dnl __STDC__ evaluates to 0 instead of to 1. The latter is an undesired side
>> +dnl effect; we are therefore careful to use 'defined __STDC__' or '1' instead
>> +dnl of plain '__STDC__'.
>> +dnl
>> +dnl PRAGMA_COLUMNS can be used in files that override system header files, so
>> +dnl as to avoid compilation errors on HP NonStop systems when the gnulib file
>> +dnl is included by a system header file that does a "#pragma COLUMNS 80" (which
>> +dnl has the effect of truncating the lines of that file and all files that it
>> +dnl includes to 80 columns) and the gnulib file has lines longer than 80
>> +dnl columns.
>> +
>> +AC_DEFUN([gl_INCLUDE_NEXT],
>> +[
>> +  AC_LANG_PREPROC_REQUIRE()
>> +  AC_CACHE_CHECK([whether the preprocessor supports include_next],
>> +    [gl_cv_have_include_next],
>> +    [rm -rf conftestd1a conftestd1b conftestd2
>> +     mkdir conftestd1a conftestd1b conftestd2
>> +     dnl IBM C 9.0, 10.1 (original versions, prior to the 2009-01 updates) on
>> +     dnl AIX 6.1 support include_next when used as first preprocessor directive
>> +     dnl in a file, but not when preceded by another include directive. Check
>> +     dnl for this bug by including <stdio.h>.
>> +     dnl Additionally, with this same compiler, include_next is a no-op when
>> +     dnl used in a header file that was included by specifying its absolute
>> +     dnl file name. Despite these two bugs, include_next is used in the
>> +     dnl compiler's <math.h>. By virtue of the second bug, we need to use
>> +     dnl include_next as well in this case.
>> +     cat <<EOF > conftestd1a/conftest.h
>> +#define DEFINED_IN_CONFTESTD1
>> +#include_next <conftest.h>
>> +#ifdef DEFINED_IN_CONFTESTD2
>> +int foo;
>> +#else
>> +#error "include_next doesn't work"
>> +#endif
>> +EOF
>> +     cat <<EOF > conftestd1b/conftest.h
>> +#define DEFINED_IN_CONFTESTD1
>> +#include <stdio.h>
>> +#include_next <conftest.h>
>> +#ifdef DEFINED_IN_CONFTESTD2
>> +int foo;
>> +#else
>> +#error "include_next doesn't work"
>> +#endif
>> +EOF
>> +     cat <<EOF > conftestd2/conftest.h
>> +#ifndef DEFINED_IN_CONFTESTD1
>> +#error "include_next test doesn't work"
>> +#endif
>> +#define DEFINED_IN_CONFTESTD2
>> +EOF
>> +     gl_save_CPPFLAGS="$CPPFLAGS"
>> +     CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1b -Iconftestd2"
>> +dnl We intentionally avoid using AC_LANG_SOURCE here.
>> +     AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
>> +       [gl_cv_have_include_next=yes],
>> +       [CPPFLAGS="$gl_save_CPPFLAGS -Iconftestd1a -Iconftestd2"
>> +        AC_COMPILE_IFELSE([AC_LANG_DEFINES_PROVIDED[#include <conftest.h>]],
>> +          [gl_cv_have_include_next=buggy],
>> +          [gl_cv_have_include_next=no])
>> +       ])
>> +     CPPFLAGS="$gl_save_CPPFLAGS"
>> +     rm -rf conftestd1a conftestd1b conftestd2
>> +    ])
>> +  PRAGMA_SYSTEM_HEADER=
>> +  if test $gl_cv_have_include_next = yes; then
>> +    INCLUDE_NEXT=include_next
>> +    INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
>> +    if test -n "$GCC"; then
>> +      PRAGMA_SYSTEM_HEADER='#pragma GCC system_header'
>> +    fi
>> +  else
>> +    if test $gl_cv_have_include_next = buggy; then
>> +      INCLUDE_NEXT=include
>> +      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include_next
>> +    else
>> +      INCLUDE_NEXT=include
>> +      INCLUDE_NEXT_AS_FIRST_DIRECTIVE=include
>> +    fi
>> +  fi
>> +  AC_SUBST([INCLUDE_NEXT])
>> +  AC_SUBST([INCLUDE_NEXT_AS_FIRST_DIRECTIVE])
>> +  AC_SUBST([PRAGMA_SYSTEM_HEADER])
>> +  AC_CACHE_CHECK([whether system header files limit the line length],
>> +    [gl_cv_pragma_columns],
>> +    [dnl HP NonStop systems, which define __TANDEM, have this misfeature.
>> +     AC_EGREP_CPP([choke me],
>> +       [
>> +#ifdef __TANDEM
>> +choke me
>> +#endif
>> +       ],
>> +       [gl_cv_pragma_columns=yes],
>> +       [gl_cv_pragma_columns=no])
>> +    ])
>> +  if test $gl_cv_pragma_columns = yes; then
>> +    PRAGMA_COLUMNS="#pragma COLUMNS 10000"
>> +  else
>> +    PRAGMA_COLUMNS=
>> +  fi
>> +  AC_SUBST([PRAGMA_COLUMNS])
>> +])
>> +
>> +# gl_CHECK_NEXT_HEADERS(HEADER1 HEADER2 ...)
>> +# ------------------------------------------
>> +# For each arg foo.h, if #include_next works, define NEXT_FOO_H to be
>> +# '<foo.h>'; otherwise define it to be
>> +# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
>> +# Also, if #include_next works as first preprocessing directive in a file,
>> +# define NEXT_AS_FIRST_DIRECTIVE_FOO_H to be '<foo.h>'; otherwise define it to
>> +# be
>> +# '"///usr/include/foo.h"', or whatever other absolute file name is suitable.
>> +# That way, a header file with the following line:
>> +#       #@INCLUDE_NEXT@ @NEXT_FOO_H@
>> +# or
>> +#       #@INCLUDE_NEXT_AS_FIRST_DIRECTIVE@ @NEXT_AS_FIRST_DIRECTIVE_FOO_H@
>> +# behaves (after sed substitution) as if it contained
>> +#       #include_next <foo.h>
>> +# even if the compiler does not support include_next.
>> +# The three "///" are to pacify Sun C 5.8, which otherwise would say
>> +# "warning: #include of /usr/include/... may be non-portable".
>> +# Use '""', not '<>', so that the /// cannot be confused with a C99 comment.
>> +# Note: This macro assumes that the header file is not empty after
>> +# preprocessing, i.e. it does not only define preprocessor macros but also
>> +# provides some type/enum definitions or function/variable declarations.
>> +#
>> +# This macro also checks whether each header exists, by invoking
>> +# AC_CHECK_HEADERS_ONCE or AC_CHECK_HEADERS on each argument.
>> +AC_DEFUN([gl_CHECK_NEXT_HEADERS],
>> +[
>> +  gl_NEXT_HEADERS_INTERNAL([$1], [check])
>> +])
>> +
>> +# gl_NEXT_HEADERS(HEADER1 HEADER2 ...)
>> +# ------------------------------------
>> +# Like gl_CHECK_NEXT_HEADERS, except do not check whether the headers exist.
>> +# This is suitable for headers like <stddef.h> that are standardized by C89
>> +# and therefore can be assumed to exist.
>> +AC_DEFUN([gl_NEXT_HEADERS],
>> +[
>> +  gl_NEXT_HEADERS_INTERNAL([$1], [assume])
>> +])
>> +
>> +# The guts of gl_CHECK_NEXT_HEADERS and gl_NEXT_HEADERS.
>> +AC_DEFUN([gl_NEXT_HEADERS_INTERNAL],
>> +[
>> +  AC_REQUIRE([gl_INCLUDE_NEXT])
>> +  AC_REQUIRE([AC_CANONICAL_HOST])
>> +
>> +  m4_if([$2], [check],
>> +    [AC_CHECK_HEADERS_ONCE([$1])
>> +    ])
>> +
>> +dnl FIXME: gl_next_header and gl_header_exists must be used unquoted
>> +dnl until we can assume autoconf 2.64 or newer.
>> +  m4_foreach_w([gl_HEADER_NAME], [$1],
>> +    [AS_VAR_PUSHDEF([gl_next_header],
>> +                    [gl_cv_next_]m4_defn([gl_HEADER_NAME]))
>> +     if test $gl_cv_have_include_next = yes; then
>> +       AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>'])
>> +     else
>> +       AC_CACHE_CHECK(
>> +         [absolute name of <]m4_defn([gl_HEADER_NAME])[>],
>> +         m4_defn([gl_next_header]),
>> +         [m4_if([$2], [check],
>> +            [AS_VAR_PUSHDEF([gl_header_exists],
>> +                            [ac_cv_header_]m4_defn([gl_HEADER_NAME]))
>> +             if test AS_VAR_GET(gl_header_exists) = yes; then
>> +             AS_VAR_POPDEF([gl_header_exists])
>> +            ])
>> +           gl_ABSOLUTE_HEADER_ONE(gl_HEADER_NAME)
>> +           AS_VAR_COPY([gl_header], [gl_cv_absolute_]AS_TR_SH(gl_HEADER_NAME))
>> +           AS_VAR_SET(gl_next_header, ['"'$gl_header'"'])
>> +          m4_if([$2], [check],
>> +            [else
>> +               AS_VAR_SET(gl_next_header, ['<'gl_HEADER_NAME'>'])
>> +             fi
>> +            ])
>> +         ])
>> +     fi
>> +     AC_SUBST(
>> +       AS_TR_CPP([NEXT_]m4_defn([gl_HEADER_NAME])),
>> +       [AS_VAR_GET(gl_next_header)])
>> +     if test $gl_cv_have_include_next = yes || test $gl_cv_have_include_next = buggy; then
>> +       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include_next'
>> +       gl_next_as_first_directive='<'gl_HEADER_NAME'>'
>> +     else
>> +       # INCLUDE_NEXT_AS_FIRST_DIRECTIVE='include'
>> +       gl_next_as_first_directive=AS_VAR_GET(gl_next_header)
>> +     fi
>> +     AC_SUBST(
>> +       AS_TR_CPP([NEXT_AS_FIRST_DIRECTIVE_]m4_defn([gl_HEADER_NAME])),
>> +       [$gl_next_as_first_directive])
>> +     AS_VAR_POPDEF([gl_next_header])])
>> +])
>> +
>> +# Autoconf 2.68 added warnings for our use of AC_COMPILE_IFELSE;
>> +# this fallback is safe for all earlier autoconf versions.
>> +m4_define_default([AC_LANG_DEFINES_PROVIDED])
>> diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4
>> index e7281ad..02d473e 100644
>> --- a/m4/openvswitch.m4
>> +++ b/m4/openvswitch.m4
>> @@ -535,3 +535,8 @@ dnl OVS_CHECK_POSIX_AIO
>>  AC_DEFUN([OVS_CHECK_POSIX_AIO],
>>    [AC_SEARCH_LIBS([aio_write], [rt])
>>     AM_CONDITIONAL([HAVE_POSIX_AIO], [test "$ac_cv_search_aio_write" != no])])
>> +
>> +dnl OVS_CHECK_INCLUDE_NEXT
>> +AC_DEFUN([OVS_CHECK_INCLUDE_NEXT],
>> +  [AC_REQUIRE([gl_CHECK_NEXT_HEADERS])
>> +   gl_CHECK_NEXT_HEADERS([$1])])
>> --
>> 1.7.10.4
>>
>> _______________________________________________
>> dev mailing list
>> dev at openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list