dnl
dnl this macro adds the options
dnl --with-linuxdir to specify a kernel build tree location
+dnl --with-linuxsrcdir to specify a kernel source tree location
dnl --with-linuxconfig to specify a kernel .config file
dnl --with-kernel-release to specify an alternative uname -r
dnl --with-machine to specify an alternative uname -m
dnl this macro defines:
dnl LINUX_DIR
-dnl The directory where the Linux source resides.
+dnl The directory where the Linux build tree resides.
+dnl LINUX_SRC_DIR
+dnl The directory where the Linux source tree resides.
dnl CONFIG_FILE
dnl The Linux config file
dnl LINUX_ARCH
dnl Module extension (.o or .ko)
dnl LINUX_MODPOST
dnl path to modpost script
-dnl modulesdir
+dnl MODULESDIR
dnl base install path for kernel modules
-dnl modulesdeveldir
+dnl MODULESDEVELDIR
dnl base install path for kernel module development files
-dnl
+dnl
dnl End of search list.
dnl main entry point
dnl check if user supplied a uname -r, and if not use the running one
AS_LINUX_KERNEL_RELEASE()
dnl check if user supplied a uname -m, and if not use the running one
- AS_LINUX_MACHINE()
+ AS_LINUX_MACHINE()
dnl check if the user supplied an rpm target arch
dnl override the LINUX_MACHINE value if he did
- AS_LINUX_RPM_TARGET()
-
- dnl find the kernel source tree for the given uname -r
+ AS_LINUX_RPM_TARGET()
+
+ dnl find the kernel build tree for the given uname -r
AS_LINUX_DIR()
+ dnl override kernel release uname -r value with info from build tree
+ AS_LINUX_OVERRIDE_KERNEL_RELEASE($LINUX_DIR)
+ dnl find the kernel source tree from the build tree or --with-linuxsrcdir
+ AS_LINUX_SRC_DIR($LINUX_DIR)
dnl check if user supplied an EXTRAVERSION, and if not get from uname -r
- AS_LINUX_EXTRAVERSION($LINUX_KERNEL_RELEASE)
+ AS_LINUX_EXTRAVERSION($LINUX_KERNEL_RELEASE)
dnl check if user supplied a config file; if not, guess a good one
- AS_LINUX_CONFIG($LINUX_DIR, $LINUX_KERNEL_RELEASE, $LINUX_MACHINE)
+ AS_LINUX_CONFIG($LINUX_DIR, $LINUX_KERNEL_RELEASE, $LINUX_MACHINE)
dnl check if we're building on pre-FC2 Red Hat/Fedora,
- dnl and add some flags if we are
- AS_CHECK_REDHAT_PRE_FC2()
+ dnl and add some flags if we are
+ AS_CHECK_REDHAT_PRE_FC2()
dnl check for where to install modules
AS_LINUX_MODULESDIR($LINUX_KERNEL_RELEASE)
dnl check for where to install module development files
AS_LINUX_MODULESDEVELDIR($LINUX_DIR)
- dnl check for the MAJOR/MINOR version of Linux
+ dnl check for the MAJOR/MINOR version of Linux
AS_LINUX_VERSION_MAJOR_MINOR($LINUX_DIR)
dnl now call the correct macro to get compiler flags
dnl the versioned AS_LINUX macros just use the global variables
dnl this could be cleaned up later on if we feel like it
case $LINUX_VERSION_MAJOR.$LINUX_VERSION_MINOR in
- 2.6)
+ 2.6 | 3.[[0-9]]*)
AS_LINUX_2_6()
;;
2.[[01234]])
])
-dnl check if we can find a source dir for the Linux kernel
-dnl defines LINUX_DIR to the absolute location of a usable kernel source tree
+dnl check if we can find a build dir for the Linux kernel
+dnl defines LINUX_DIR to the absolute location of a usable kernel build tree
AC_DEFUN([AS_LINUX_DIR],
[
AC_ARG_WITH([linuxdir],
[AC_HELP_STRING([--with-linuxdir=DIR],
- [specify path to Linux source directory])],
+ [specify path to Linux build directory])],
[LINUX_DIR="${withval}"],
[LINUX_DIR=default])
if test "${LINUX_DIR}" != "default" ; then
- AS_TRY_LINUX_DIR([${LINUX_DIR}], , AC_MSG_ERROR([Linux dir not found]) )
+ AS_TRY_LINUX_DIR([${LINUX_DIR}], , AC_MSG_ERROR([Linux build dir not found]) )
fi
if test "${LINUX_DIR}" = "default" ; then
fi
if test "${LINUX_DIR}" = "default" ; then
- AC_MSG_ERROR([Linux source directory not found])
+ AC_MSG_ERROR([Linux build directory not found])
fi
AC_SUBST(LINUX_DIR)
])
-dnl check if the given candidate path for a linux source tree is usable
+dnl check if the given candidate path for a linux build tree is usable
AC_DEFUN([AS_TRY_LINUX_DIR],
- [AC_MSG_CHECKING(for Linux in $1)
+ [AC_MSG_CHECKING(for Linux build in $1)
+
+ if test -f "$1/Makefile" ; then
+ result=yes
+ $2
+ else
+ result="not found"
+ $3
+ fi
+
+ AC_MSG_RESULT($result)
+])
+
+dnl get the kernel source directory
+dnl $1 is the kernel build directory
+dnl defines LINUX_SRC_DIR to the absolute location of kernel source tree
+AC_DEFUN([AS_LINUX_SRC_DIR],
+[
+ AC_ARG_WITH([linuxsrcdir],
+ [AC_HELP_STRING([--with-linuxsrcdir=DIR],
+ [specify path to Linux source directory])],
+ [LINUX_SRC_DIR="${withval}"],
+ [LINUX_SRC_DIR=default])
+
+ if test "${LINUX_SRC_DIR}" != "default" ; then
+ AS_TRY_LINUX_SRC_DIR([${LINUX_SRC_DIR}], , AC_MSG_ERROR([Linux source dir not found]) )
+ fi
+
+ if test "${LINUX_SRC_DIR}" = "default" ; then
+ AC_MSG_CHECKING(for separate Linux source and build directory)
+ dir=`sed -n -e 's/^KERNELSRC *:= *\(.*\)/\1/p' "$1/Makefile"`
+ if test -z "$dir"; then
+ # 2.6.25
+ dir=`sed -n -e 's/^MAKEARGS *:= *-C *\([[^[:space:]]]*\).*/\1/p' "$1/Makefile"`
+ fi
+ if test -z "$dir"; then
+ AC_MSG_RESULT([no])
+ LINUX_SRC_DIR="$1"
+ else
+ AC_MSG_RESULT([yes])
+ case "$dir" in
+ .*) dir="$1/$dir" ;;
+ esac
+ AS_TRY_LINUX_SRC_DIR([${dir}], [LINUX_SRC_DIR=${dir}], )
+ fi
+ fi
+
+ if test "${LINUX_SRC_DIR}" = "default" ; then
+ AC_MSG_ERROR([Linux source directory not found])
+ fi
+
+ AC_SUBST(LINUX_SRC_DIR)
+])
+
+dnl check if the given candidate path for a linux source tree is usable
+AC_DEFUN([AS_TRY_LINUX_SRC_DIR],
+ [AC_MSG_CHECKING(for Linux source in $1)
if test -f "$1/Makefile" ; then
result=yes
AC_MSG_NOTICE([Using $LINUX_KERNEL_RELEASE as the uname -r value])
])
+dnl replaces LINUX_KERNEL_RELEASE once the Linux build directory is known
+dnl first argument is the Linux build directory
+AC_DEFUN([AS_LINUX_OVERRIDE_KERNEL_RELEASE],
+[
+ INCDIR="$1/include"
+ UTSINC="${INCDIR}/generated/utsrelease.h"
+ if ! test -f "${UTSINC}"; then
+ UTSINC="${INCDIR}/linux/utsrelease.h"
+ fi
+ if ! test -f "${UTSINC}"; then
+ UTSINC="${INCDIR}/linux/version.h"
+ fi
+ if test -f "${UTSINC}"; then
+ RELEASE=`echo UTS_RELEASE | cat "${UTSINC}" - |
+ /lib/cpp -I "${INCDIR}" | tail -n 1 |
+ sed 's/^"\(.*\)"$/\1/'`
+ if test "${RELEASE}" != "UTS_RELEASE" -a "${RELEASE}" != "" \
+ -a "${RELEASE}" != "${LINUX_KERNEL_RELEASE}"; then
+ AC_MSG_NOTICE([Overriding uname -r value with ${RELEASE}])
+ LINUX_KERNEL_RELEASE="${RELEASE}"
+ fi
+
+ fi
+])
+
dnl allow for specifying a machine (uname -m) to build for
-dnl use uname -, of running one if not specified
+dnl use uname -m, of running one if not specified
dnl store result in LINUX_MACHINE
AC_DEFUN([AS_LINUX_MACHINE],
[
[LINUX_MACHINE=`uname -m`])
if test "x$LINUX_MACHINE" = "xyes";
then
- LINUX_MACHINE=`uname -r`
+ LINUX_MACHINE=`uname -m`
fi
AC_MSG_NOTICE([Using $LINUX_MACHINE as the uname -m value])
])
then
dnl if we have rpm, try to guess the target of the kernel
dnl we want to build for using rpm
- AC_PATH_PROG(RPM, rpm, yes, no)
+ AC_PATH_PROG([RPM], [rpm], [no])
if test "x$RPM" != "xno" ; then
- AC_MSG_CHECKING([if rpm can be used to query packages])
- if rpm -qa >/dev/null 2>/dev/null ; then
- rpm_check=yes
+ if $RPM -q kernel-$RELEASE > /dev/null
+ then
+ LINUX_RPM_TARGET=`$RPM -q --queryformat %{arch} kernel-$RELEASE`
else
- rpm_check=no
- fi
- AC_MSG_RESULT($rpm_check)
-
- if test "x$rpm_check" = yes ; then
- if rpm -q kernel-$RELEASE > /dev/null
- then
- LINUX_RPM_TARGET=`rpm -q --queryformat %{arch} kernel-$RELEASE`
- else
- AC_MSG_NOTICE([Cannot guess target arch, consider setting it using --with-rpm-target])
- fi
+ AC_MSG_NOTICE([Cannot guess target arch, consider setting it using --with-rpm-target])
fi
fi
fi
HAVE_REDHAT_KERNEL=false
ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -I${LINUX_DIR}/include/linux"
- AC_COMPILE_IFELSE(AC_LANG_PROGRAM([
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include "rhconfig.h"
int code = RED_HAT_LINUX_KERNEL;
- ]),
+ ]])],
AC_MSG_RESULT(found); HAVE_REDHAT_KERNEL=true,
AC_MSG_RESULT(not found))
dnl restore CFLAGS
BIGMEM='0'
HUGEMEM='0'
- dnl get variables from the currently running kernel as default
+ dnl get variables from the currently running kernel as default
KERNEL_TYPE=`uname -r | sed 's_^.*\(smp\|enterprise\|bigmem\|hugemem\)$_\1_;t;s_.*__;'`
KERNEL_RELEASE=`uname -r | sed 's|smp\|enterprise\|bigmem\|hugemem||g'`
KERNEL_ARCH=`uname -m`
echo LINUX_CC=\"\$(CC)\" >>\$(obj)/flags
echo LINUX_LD=\"\$(LD) \$(LDFLAGS) \$(LDFLAGS_MODULE)\" >>\$(obj)/flags
echo LINUX_AS=\"\$(AS)\" >>\$(obj)/flags
+ echo LINUX_MODLIB=\"\$(MODLIB)\" >>\$(obj)/flags
EOF
echo ${MAKE-make} -C ${LINUX_DIR} V=1 SUBDIRS=${tmpdir} LINUXDIR=${LINUX_DIR} modules >&5 2>&5
AC_SUBST(LINUX_MODULE_EXT)
AC_SUBST(LINUX_MODULE_STYLE)
AC_SUBST(LINUX_MODPOST)
+ AC_SUBST(LINUX_MODLIB)
AC_MSG_RESULT([$LINUX_CFLAGS])
-
+
AC_PATH_PROG([LINUX_MODPOST], ["modpost"], ["no"], ["$LINUX_DIR/scripts:$LINUX_DIR/scripts/mod"])
])
# Check if kernel source tree is recent enough to support "Kbuild" files.
AC_DEFUN([COMEDI_CHECK_LINUX_KBUILD],
[
- AC_MSG_CHECKING([for Kbuild in $1])
- if test -a $1/Kbuild; then
+ AC_MSG_CHECKING([for Kbuild support in $1])
+ dnl If $1/scripts/Makefile.build refers to $(<something>)/Kbuild
+ dnl then we support Kbuild (2.6.10 onwards).
+ if grep -q '/Kbuild' "$1/scripts/Makefile.build" 2>/dev/null; then
+ AC_MSG_RESULT([yes])
+ $2
+ else
+ AC_MSG_RESULT([no])
+ $3
+ fi
+])
+
+# COMEDI_CHECK_PCMCIA_PROBE([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is new enough to have a probe member in the pcmcia_driver
+# struct.
+AC_DEFUN([COMEDI_CHECK_PCMCIA_DRIVER_PROBE],
+[
+ AC_REQUIRE([AC_PROG_EGREP])
+ AC_MSG_CHECKING([$1 for probe in pcmcia_driver struct])
+ cat "$1/include/pcmcia/ds.h" | tr \\n ' ' | [$EGREP "struct[[:space:]]+pcmcia_driver[[:space:]]*[{][^}]*probe"] > /dev/null
+ if (($?)); then
+ AC_MSG_RESULT([no])
+ $3
+ else
+ AC_MSG_RESULT([yes])
+ $2
+ fi
+])
+
+# COMEDI_CHECK_PCMCIA_DRIVER_NAME([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is new enough to have a name member in the pcmcia_driver
+# struct.
+AC_DEFUN([COMEDI_CHECK_PCMCIA_DRIVER_NAME],
+[
+ AC_REQUIRE([AC_PROG_EGREP])
+ AC_MSG_CHECKING([$1 for name in pcmcia_driver struct])
+ cat "$1/include/pcmcia/ds.h" | tr \\n ' ' | [$EGREP "struct[[:space:]]+pcmcia_driver[[:space:]]*[{][^}]*name"] > /dev/null
+ if (($?)); then
+ AC_MSG_RESULT([no])
+ $3
+ else
+ AC_MSG_RESULT([yes])
+ $2
+ fi
+])
+
+# COMEDI_CHECK_PCMCIA_LOOP_TUPLE([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is new enough to have the pcmcia_loop_tuple
+# function.
+AC_DEFUN([COMEDI_CHECK_PCMCIA_LOOP_TUPLE],
+[
+ AC_MSG_CHECKING([$1 for pcmcia_loop_tuple function])
+ if [grep -q 'int[[:space:]]\+pcmcia_loop_tuple[[:space:]]*(' "$1/include/pcmcia/ds.h"] 2>/dev/null ; then
+ AC_MSG_RESULT([yes])
+ $2
+ else
+ AC_MSG_RESULT([no])
+ $3
+ fi
+])
+
+# COMEDI_CHECK_DS_DEV_NODE_T([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is old enough to have the dev_node_t type
+# in pcmcia/ds.h.
+AC_DEFUN([COMEDI_CHECK_DS_DEV_NODE_T],
+[
+ AC_MSG_CHECKING([$1 for dev_node_t in pcmcia/ds.h (removed in 2.6.35)])
+ if [grep -q dev_node_t "$1/include/pcmcia/ds.h"] 2>/dev/null ; then
+ AC_MSG_RESULT([yes])
+ $2
+ else
+ AC_MSG_RESULT([no])
+ $3
+ fi
+])
+
+# COMEDI_CHECK_CS_IRQ_REQ_T([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is old enough to have the irq_req_t type
+# in pcmcia/cs.h.
+AC_DEFUN([COMEDI_CHECK_CS_IRQ_REQ_T],
+[
+ AC_MSG_CHECKING([$1 for irq_req_t in pcmcia/cs.h (removed in 2.6.35)])
+ if [grep -q irq_req_t "$1/include/pcmcia/cs.h"] 2>/dev/null ; then
+ AC_MSG_RESULT([yes])
+ $2
+ else
+ AC_MSG_RESULT([no])
+ $3
+ fi
+])
+
+# COMEDI_CHECK_CS_IO_REQ_T([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is old enough to have the io_req_t type
+# in pcmcia/cs.h.
+AC_DEFUN([COMEDI_CHECK_CS_IO_REQ_T],
+[
+ AC_MSG_CHECKING([$1 for io_req_t in pcmcia/cs.h (removed in 2.6.36)])
+ if [grep -q io_req_t "$1/include/pcmcia/cs.h"] 2>/dev/null ; then
+ AC_MSG_RESULT([yes])
+ $2
+ else
+ AC_MSG_RESULT([no])
+ $3
+ fi
+])
+
+# COMEDI_CHECK_CS_MEMREQ_T([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel pcmcia support is old enough to have the memreq_t type
+# in pcmcia/cs.h.
+AC_DEFUN([COMEDI_CHECK_CS_MEMREQ_T],
+[
+ AC_MSG_CHECKING([$1 for memreq_t in pcmcia/cs.h (removed in 2.6.36)])
+ if [grep -q memreq_t "$1/include/pcmcia/cs.h"] 2>/dev/null ; then
+ AC_MSG_RESULT([yes])
+ $2
+ else
+ AC_MSG_RESULT([no])
+ $3
+ fi
+])
+
+# COMEDI_CHECK_HAVE_CS_TYPES_H([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel has <pcmcia/cs_types.h> file.
+AC_DEFUN([COMEDI_CHECK_HAVE_CS_TYPES_H],
+[
+ AC_MSG_CHECKING([$1 for include/pcmcia/cs_types.h (removed in 2.6.36)])
+ if test -f "$1/include/pcmcia/cs_types.h"; then
+ AC_MSG_RESULT([yes])
+ $2
+ else
+ AC_MSG_RESULT([no])
+ $3
+ fi
+])
+
+# COMEDI_CHECK_HAVE_CS_H([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel has <pcmcia/cs.h> file.
+AC_DEFUN([COMEDI_CHECK_HAVE_CS_H],
+[
+ AC_MSG_CHECKING([$1 for include/pcmcia/cs.h (removed in 2.6.37)])
+ if test -f "$1/include/pcmcia/cs.h"; then
+ AC_MSG_RESULT([yes])
+ $2
+ else
+ AC_MSG_RESULT([no])
+ $3
+ fi
+])
+
+# COMEDI_CHECK_HAVE_MUTEX_H([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel has <linux/mutex.h> file.
+AC_DEFUN([COMEDI_CHECK_HAVE_MUTEX_H],
+[
+ AC_MSG_CHECKING([$1 for include/linux/mutex.h])
+ if test -f "$1/include/linux/mutex.h"; then
+ AC_MSG_RESULT([yes])
+ $2
+ else
+ AC_MSG_RESULT([no])
+ $3
+ fi
+])
+
+# COMEDI_CHECK_HAVE_LINUX_SEMAPHORE_H([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# -------------------------------------------------------------
+#
+# Check if kernel has <linux/semaphore.h> file.
+AC_DEFUN([COMEDI_CHECK_HAVE_LINUX_SEMAPHORE_H],
+[
+ AC_MSG_CHECKING([$1 for include/linux/semaphore.h])
+ if test -f "$1/include/linux/semaphore.h"; then
AC_MSG_RESULT([yes])
$2
else
$3
fi
])
+
+# COMEDI_CHECK_HAVE_GENERIC_BOOL_TYPE([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# -------------------------------------------------------------
+# Check if kernel is new enough to have generic 'bool' type in <linux/types.h>
+# and 'false' and 'true' enum constants in <linux/stddef.h>. This was added
+# in vanilla 2.6.19, but backported to RHEL5 2.6.18.
+AC_DEFUN([COMEDI_CHECK_HAVE_GENERIC_BOOL_TYPE],
+[
+ AC_MSG_CHECKING([$1 for 'bool' in include/linux/types.h])
+ if grep -q 'bool;' "$1/include/linux/types.h" 2>/dev/null; then
+ AC_MSG_RESULT([yes])
+ $2
+ else
+ AC_MSG_RESULT([no])
+ $3
+ fi
+])
+
+# COMEDI_CHECK_REQUEST_FIRMWARE_NOWAIT_HAS_GFP([LINUX_SOURCE_PATH], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# -------------------------------------------------------------
+# Check if the kernel's request_firmware_nowait() function has the gfp
+# parameter. This was added in vanilla 2.6.33 but Red Hat backported it
+# to their 2.6.32 kernel.
+AC_DEFUN([COMEDI_CHECK_REQUEST_FIRMWARE_NOWAIT_HAS_GFP],
+[
+ AC_REQUIRE([AC_PROG_EGREP])
+ AC_MSG_CHECKING([$1 for gfp parameter in request_firmware_nowait()])
+ $EGREP -q gfp_t "$1/include/linux/firmware.h"
+ if (($?)); then
+ AC_MSG_RESULT([no])
+ $3
+ else
+ AC_MSG_RESULT([yes])
+ $2
+ fi
+])