added getxidtype.c
[util-vserver.git] / util-vserver / m4 / ensc_dietlibc.m4
index 88e8e64..503320b 100644 (file)
@@ -21,8 +21,8 @@ AC_DEFUN([_ENSC_DIETLIBC_C99],
 
        AC_CACHE_CHECK([whether dietlibc supports C99], [ensc_cv_c_dietlibc_c99],
        [
-               old_CFLAGS=$CFLAGS
-               old_CC=$CC
+               _ensc_dietlibc_c99_old_CFLAGS=$CFLAGS
+               _ensc_dietlibc_c99_old_CC=$CC
 
                CFLAGS="-std=c99"
                CC="${DIET:-diet} $CC"
@@ -42,8 +42,8 @@ AC_DEFUN([_ENSC_DIETLIBC_C99],
                        [ensc_cv_c_dietlibc_c99='skipped (compiler does not support C99)'])
                AC_LANG_POP
 
-               CC=$old_CC
-               CFLAGS=$old_CFLAGS
+               CC=$_ensc_dietlibc_c99_old_CC
+               CFLAGS=$_ensc_dietlibc_c99_old_CFLAGS
        ])
 
        if test x"$ensc_cv_c_dietlibc_c99" = xyes; then
@@ -51,9 +51,12 @@ AC_DEFUN([_ENSC_DIETLIBC_C99],
        fi
 ])
 
-dnl Usage: ENSC_ENABLE_DIETLIBC(<conditional>)
+dnl Usage: ENSC_ENABLE_DIETLIBC(<conditional>[,<min-version>])
 dnl        <conditional> ... automake-conditional which will be set when
 dnl                          dietlibc shall be enabled
+dnl        provides:
+dnl        * $ENSC_VERSION_DIETLIBC_NUM and
+dnl        * $ENSC_VERSION_DIETLIBC
 
 AC_DEFUN([ENSC_ENABLE_DIETLIBC],
 [
@@ -69,11 +72,35 @@ AC_DEFUN([ENSC_ENABLE_DIETLIBC],
                      [: ${DIET:=diet}
                       which "$DIET" >/dev/null 2>/dev/null && use_dietlibc=detected || use_dietlibc=detected_no])
 
+       if test "$use_dietlibc" = detected -a '$2'; then
+           _dietlibc_ver=$(${DIET:-diet} -v 2>&1 | sed '1p;d')
+           _dietlibc_ver=${_dietlibc_ver##*diet version }
+           _dietlibc_ver=${_dietlibc_ver##*dietlibc-}
+           _dietlibc_ver_maj=${_dietlibc_ver%%.*}
+           _dietlibc_ver_min=${_dietlibc_ver##*.}
+           _dietlibc_ver_min=${_dietlibc_ver_min%%[[!0-9]]*}
+           _dietlibc_cmp=$2
+           _dietlibc_cmp_maj=${_dietlibc_cmp%%.*}
+           _dietlibc_cmp_min=${_dietlibc_cmp##*.}
+
+           ENSC_VERSION_DIETLIBC=$_dietlibc_ver_maj.$_dietlibc_ver_min
+
+           let _dietlibc_ver=_dietlibc_ver_maj*1000+_dietlibc_ver_min 2>/dev/null || _dietlibc_ver=0
+           let _dietlibc_cmp=_dietlibc_cmp_maj*1000+_dietlibc_cmp_min
+
+           test $_dietlibc_ver -ge $_dietlibc_cmp || use_dietlibc=detected_old
+       else
+           ENSC_VERSION_DIETLIBC=
+           _dietlibc_ver=-1
+        fi
+
+       ENSC_VERSION_DIETLIBC_NUM=$_dietlibc_ver
        ensc_have_dietlibc=no
+
        case x"$use_dietlibc" in
            xdetected)
                AM_CONDITIONAL($1, true)
-               AC_MSG_RESULT([yes (autodetected)])
+               AC_MSG_RESULT([yes (autodetected, $ENSC_VERSION_DIETLIBC)])
                ensc_have_dietlibc=yes
                ;;
            xforced)
@@ -85,6 +112,10 @@ AC_DEFUN([ENSC_ENABLE_DIETLIBC],
                AM_CONDITIONAL($1, false)
                AC_MSG_RESULT([no (detected)])
                ;;
+           xdetected_old)
+               AM_CONDITIONAL($1, false)
+               AC_MSG_RESULT([no (too old; $2+ required, $ENSC_VERSION_DIETLIBC found)])
+               ;;
            xforced_no)
                AM_CONDITIONAL($1, false)
                AC_MSG_RESULT([no (forced)])
@@ -98,3 +129,19 @@ AC_DEFUN([ENSC_ENABLE_DIETLIBC],
                _ENSC_DIETLIBC_C99
        fi
 ])
+
+
+dnl Usage: ENSC_DIETLIBC_SANITYCHECK
+AC_DEFUN([ENSC_DIETLIBC_SANITYCHECK],
+[
+       AC_REQUIRE([AC_CANONICAL_HOST])
+       AC_REQUIRE([ENSC_ENABLE_DIETLIBC])
+
+       if test "$host_cpu" = x86_64 -a $ENSC_VERSION_DIETLIBC_NUM -le 0027; then
+               AC_MSG_WARN([***                                                             ***])
+               AC_MSG_WARN([*** dietlibc<=0.27 is known to be broken for x86_64 systems     ***])
+               AC_MSG_WARN([*** please make sure that at least the environ.S fix is applied ***])
+               AC_MSG_WARN([*** and lib/__nice.c added                                      ***])
+               AC_MSG_WARN([***                                                             ***])
+       fi
+])