meta-flow: Correctly set destination MAC in mf_set_flow_value().
[sliver-openvswitch.git] / acinclude.m4
index 61d1555..69bb772 100644 (file)
@@ -1,6 +1,6 @@
 # -*- autoconf -*-
 
-# Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks.
+# Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira Networks.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -57,6 +57,8 @@ AC_DEFUN([OVS_CHECK_LINUX], [
     elif test X"$with_l26_source" != X; then
       KSRC=$with_l26_source
       AC_MSG_WARN([--with-l26-source is deprecated, please use --with-linux-source instead])
+    else
+      KSRC=
     fi
   elif test X"$with_linux_source" != X || test X"$with_l26_source" != X; then
     AC_MSG_ERROR([Linux source directory may not be specified without Linux build directory])
@@ -91,38 +93,55 @@ AC_DEFUN([OVS_CHECK_LINUX], [
           *) KSRC=`pwd`/$KSRC ;;
       esac
       if test ! -e $KSRC/include/linux/kernel.h; then
-        AC_MSG_ERROR([$KSRC is not a kernel source directory)])
+        AC_MSG_ERROR([$KSRC is not a kernel source directory])
       fi
     else
       KSRC=$KBUILD
       if test ! -e $KSRC/include/linux/kernel.h; then
-       case `echo "$KBUILD" | sed 's,/*$,,'` in # (
-         */build)
-           KSRC=`echo "$KBUILD" | sed 's,/build/*$,/source,'`
-           ;; # (
-         *)
-           KSRC=`(cd $KBUILD && pwd -P) | sed 's,-[[^-]]*$,-common,'`
-           ;;
-       esac
+        # Debian kernel build Makefiles tend to include a line of the form:
+        # MAKEARGS := -C /usr/src/linux-headers-3.2.0-1-common O=/usr/src/linux-headers-3.2.0-1-486
+        # First try to extract the source directory from this line.
+        KSRC=`sed -n 's/.*-C \([[^ ]]*\).*/\1/p' "$KBUILD"/Makefile`
+        if test ! -e "$KSRC"/include/linux/kernel.h; then
+          # Didn't work.  Fall back to name-based heuristics that used to work.
+          case `echo "$KBUILD" | sed 's,/*$,,'` in # (
+            */build)
+              KSRC=`echo "$KBUILD" | sed 's,/build/*$,/source,'`
+              ;; # (
+            *)
+              KSRC=`(cd $KBUILD && pwd -P) | sed 's,-[[^-]]*$,-common,'`
+              ;;
+          esac
+        fi
       fi
-      if test ! -e $KSRC/include/linux/kernel.h; then
+      if test ! -e "$KSRC"/include/linux/kernel.h; then
         AC_MSG_ERROR([cannot find source directory (please use --with-linux-source)])
       fi
     fi
     AC_MSG_RESULT([$KSRC])
 
     AC_MSG_CHECKING([for kernel version])
+    version=`sed -n 's/^VERSION = //p' "$KSRC/Makefile"`
     patchlevel=`sed -n 's/^PATCHLEVEL = //p' "$KSRC/Makefile"`
     sublevel=`sed -n 's/^SUBLEVEL = //p' "$KSRC/Makefile"`
-    if test -z "$patchlevel" || test -z "$sublevel"; then
+    if test X"$version" = X || test X"$patchlevel" = X; then
        AC_ERROR([cannot determine kernel version])
+    elif test X"$sublevel" = X; then
+       kversion=$version.$patchlevel
+    else
+       kversion=$version.$patchlevel.$sublevel
     fi
-    AC_MSG_RESULT([2.$patchlevel.$sublevel])
-    if test "2.$patchlevel" != '2.6'; then
+    AC_MSG_RESULT([$kversion])
+
+    if test "$version" -ge 3; then
+       : # Linux 3.x
+    elif test "$version" = 2 && test "$patchlevel" -ge 6; then
+       : # Linux 2.6.x
+    else
        if test "$KBUILD" = "$KSRC"; then
-         AC_ERROR([Linux kernel in $KBUILD is not version 2.6])
+         AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version 2.6 or later is required])
        else
-         AC_ERROR([Linux kernel in build tree $KBUILD (source tree $KSRC) is not version 2.6])
+         AC_ERROR([Linux kernel in build tree $KBUILD (source tree $KSRC) is version $kversion, but version 2.6 or later is required])
        fi
     fi
     if test ! -e "$KBUILD"/include/linux/version.h || \
@@ -168,7 +187,7 @@ dnl OVS_DEFINE(NAME)
 dnl
 dnl Defines NAME to 1 in kcompat.h.
 AC_DEFUN([OVS_DEFINE], [
-  echo '#define $1 1' >> datapath/linux-2.6/kcompat.h.new
+  echo '#define $1 1' >> datapath/linux/kcompat.h.new
 ])
 
 AC_DEFUN([OVS_CHECK_LOG2_H], [
@@ -186,9 +205,9 @@ dnl
 dnl Runs various Autoconf checks on the Linux 2.6 kernel source in
 dnl the directory in $KBUILD.
 AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
-  rm -f datapath/linux-2.6/kcompat.h.new
-  mkdir -p datapath/linux-2.6
-  : > datapath/linux-2.6/kcompat.h.new
+  rm -f datapath/linux/kcompat.h.new
+  mkdir -p datapath/linux
+  : > datapath/linux/kcompat.h.new
 
   OVS_GREP_IFELSE([$KSRC/arch/x86/include/asm/checksum_32.h], [src_err,],
                   [OVS_DEFINE([HAVE_CSUM_COPY_DBG])])
@@ -218,6 +237,8 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
                   [OVS_DEFINE([HAVE_SKB_DST_ACCESSOR_FUNCS])])
   OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], 
                   [skb_copy_from_linear_data_offset])
+  OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],
+                  [skb_reset_tail_pointer])
   OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_cow_head])
   OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_transport_header],
                   [OVS_DEFINE([HAVE_SKBUFF_HEADER_HELPERS])])
@@ -242,18 +263,16 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
   OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_get_be16])
   OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_find_nested])
 
-  OVS_GREP_IFELSE([$KSRC/include/linux/if_link.h], [rtnl_link_stats64])
-
   OVS_GREP_IFELSE([$KSRC/include/linux/if_vlan.h], [ADD_ALL_VLANS_CMD],
                   [OVS_DEFINE([HAVE_VLAN_BUG_WORKAROUND])])
 
   OVS_CHECK_LOG2_H
 
-  if cmp -s datapath/linux-2.6/kcompat.h.new \
-            datapath/linux-2.6/kcompat.h >/dev/null 2>&1; then
-    rm datapath/linux-2.6/kcompat.h.new
+  if cmp -s datapath/linux/kcompat.h.new \
+            datapath/linux/kcompat.h >/dev/null 2>&1; then
+    rm datapath/linux/kcompat.h.new
   else
-    mv datapath/linux-2.6/kcompat.h.new datapath/linux-2.6/kcompat.h
+    mv datapath/linux/kcompat.h.new datapath/linux/kcompat.h
   fi
 ])
 
@@ -397,10 +416,30 @@ EOF
       fi])
    AS_IF([test $ovs_cv_gnu_make_if = yes], [$1], [$2])])
 
+dnl OVS_CHECK_SPARSE_TARGET
+dnl
+dnl The "cgcc" script from "sparse" isn't very good at detecting the
+dnl target for which the code is being built.  This helps it out.
+AC_DEFUN([OVS_CHECK_SPARSE_TARGET],
+  [AC_CACHE_CHECK(
+    [target hint for cgcc],
+    [ac_cv_sparse_target],
+    [AS_CASE([`$CC -dumpmachine 2>/dev/null`],
+       [i?86-* | athlon-*], [ac_cv_sparse_target=x86],
+       [x86_64-*], [ac_cv_sparse_target=x86_64],
+       [ac_cv_sparse_target=other])])
+   AS_CASE([$ac_cv_sparse_target],
+     [x86], [SPARSEFLAGS= CGCCFLAGS=-target=i86],
+     [x86_64], [SPARSEFLAGS=-m64 CGCCFLAGS=-target=x86_64],
+     [SPARSEFLAGS= CGCCFLAGS=])
+   AC_SUBST([SPARSEFLAGS])
+   AC_SUBST([CGCCFLAGS])])
+
 dnl OVS_ENABLE_SPARSE
 AC_DEFUN([OVS_ENABLE_SPARSE],
-  [OVS_MAKE_HAS_IF(
+  [AC_REQUIRE([OVS_CHECK_SPARSE_TARGET])
+   OVS_MAKE_HAS_IF(
      [AC_CONFIG_COMMANDS_PRE(
         [: ${SPARSE=sparse}
          AC_SUBST([SPARSE])
-         CC='$(if $(C),REAL_CC="'"$CC"'" CHECK="$(SPARSE) -I $(top_srcdir)/include/sparse" cgcc,'"$CC"')'])])])
+         CC='$(if $(C),REAL_CC="'"$CC"'" CHECK="$(SPARSE) -I $(top_srcdir)/include/sparse $(SPARSEFLAGS)" cgcc $(CGCCFLAGS),'"$CC"')'])])])