summaryrefslogtreecommitdiffstats
path: root/configure.ac
diff options
context:
space:
mode:
authorMike Frysinger2007-09-07 16:55:36 +0200
committerKarel Zak2007-09-20 00:22:22 +0200
commit72065909ccd29cd3c7c3105c95ba2434db304552 (patch)
tree0e8705d5cfc36f60fd9d2500b1c9023ed098c5a0 /configure.ac
parentbuild-sys: nls/locale handling in util-linux-ng general (diff)
downloadkernel-qcow2-util-linux-72065909ccd29cd3c7c3105c95ba2434db304552.tar.gz
kernel-qcow2-util-linux-72065909ccd29cd3c7c3105c95ba2434db304552.tar.xz
kernel-qcow2-util-linux-72065909ccd29cd3c7c3105c95ba2434db304552.zip
build-sys: unify method for checking system calls and fallback handling
Co-Author: Stepan Kasal <skasal@redhat.com> Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Stepan Kasal <skasal@redhat.com>
Diffstat (limited to 'configure.ac')
-rw-r--r--configure.ac83
1 files changed, 69 insertions, 14 deletions
diff --git a/configure.ac b/configure.ac
index e7cfca3cd..b23395fd5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -187,24 +187,79 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
])
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+dnl UTIL_CHECK_SYSCALL(SYSCALL, FALLBACK, ...)
+dnl Only specify FALLBACK if the SYSCALL
+dnl you're checking for is a "newish" one
+dnl -------------------------------------
+AC_DEFUN([UTIL_CHECK_SYSCALL], [
+ dnl This macro uses host_cpu.
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([for syscall $1],
+ [util_cv_syscall_$1],
+ [_UTIL_SYSCALL_CHECK_DECL([SYS_$1],
+ [syscall=SYS_$1],
+ [dnl Our libc failed use, so see if we can get the kernel
+ dnl headers to play ball ...
+ _UTIL_SYSCALL_CHECK_DECL([_NR_$1],
+ [syscall=_NR_$1],
+ [
+ syscall=no
+ case $host_cpu in
+ _UTIL_CHECK_SYSCALL_FALLBACK(m4_shift($@))
+ esac
+ ])
+ ])
+ util_cv_syscall_$1=$syscall
+ ])
+ AM_CONDITIONAL([HAVE_]m4_toupper($1), [test $util_cv_syscall_$1 != no])
+ case $util_cv_syscall_$1 in #(
+ no) AC_MSG_WARN([Unable to detect syscall $1.]) ;;
+ SYS_*) ;;
+ *) AC_DEFINE_UNQUOTED([SYS_$1], [$util_cv_syscall_$1],
+ [Fallback syscall number for $1]) ;;
+ esac
+])
+
+dnl _UTIL_SYSCALL_CHECK_DECL(SYMBOL, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
+dnl Check if SYMBOL is declared, using the headers needed for syscall checks.
+dnl -------------------------------------
+m4_define([_UTIL_SYSCALL_CHECK_DECL],
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
#include <unistd.h>
-]], [[
-int test = SYS_pivot_root;
-]])],
-[AM_CONDITIONAL(HAVE_PIVOT_ROOT, true)],
-[AM_CONDITIONAL(HAVE_PIVOT_ROOT, false)])
+]], [[int test = $1;]])],
+[$2], [$3])
+])
+dnl _UTIL_CHECK_SYSCALL_FALLBACK(PATTERN, VALUE, ...)
+dnl Helper macro to create the body for the above `case'.
+dnl -------------------------------------
+m4_define([_UTIL_CHECK_SYSCALL_FALLBACK],
+[m4_ifval([$1],
+ [#(
+ $1) syscall="$2" ;;dnl
+ _UTIL_CHECK_SYSCALL_FALLBACK(m4_shiftn(2, $@))])dnl
+])
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
-#include <sys/syscall.h>
-#include <unistd.h>
-]], [[
-int test = SYS_sched_getaffinity;
-]])],
-[AM_CONDITIONAL(HAVE_SCHED_GETAFFINITY, true)],
-[AM_CONDITIONAL(HAVE_SCHED_GETAFFINITY, false)])
+
+UTIL_CHECK_SYSCALL([pivot_root])
+UTIL_CHECK_SYSCALL([sched_getaffinity])
+UTIL_CHECK_SYSCALL([ioprio_set],
+ [alpha], [442],
+ [i*86], [289],
+ [ia64*], [1274],
+ [powerpc*], [273],
+ [s390*], [282],
+ [sparc*], [196],
+ [x86_64*], [251])
+UTIL_CHECK_SYSCALL([ioprio_get],
+ [alpha], [443],
+ [i*86], [290],
+ [ia64*], [1275],
+ [powerpc*], [274],
+ [s390*], [283],
+ [sparc*], [218],
+ [x86_64*], [252])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[