# # LB_LINUX_INKERNEL # # in kernel compilation? (2.5 only) # AC_DEFUN([LB_LINUX_INKERNEL], [AC_MSG_CHECKING([if inkernel build support is requested]) AC_ARG_ENABLE([inkernel], AC_HELP_STRING([--enable-inkernel], [set up 2.5 kernel makefiles]), [],[enable_inkernel=no]) AC_MSG_RESULT([$enable_inkernel]) if test x$enable_inkernel = xyes ; then echo ln -s `pwd` $LINUX/fs/lustre rm $LINUX/fs/lustre ln -s `pwd` $LINUX/fs/lustre find portals lustre -name Makefile.mk | sed 's/.mk$//' | xargs -n 1 \ sh -e -x -c '(cp -f $0.mk $0.in)' fi ]) # # LB_LINUX_VERSION # # Set things accordingly for a 2.5 kernel # AC_DEFUN([LB_LINUX_VERSION], [AC_CHECK_FILE([$LINUX/include/linux/namei.h], [ linux25="yes" KMODEXT=".ko" ],[ KMODEXT=".o" linux25="no" ]) AC_MSG_CHECKING([if you are using Linux 2.6]) AC_MSG_RESULT([$linux25]) MODULE_TARGET="SUBDIRS" if test $linux25 = "yes" ; then LB_CONFIG_INKERNEL makerule="$PWD/build" AC_MSG_CHECKING([for external module build support]) rm -f build/conftest.i LB_LINUX_TRY_MAKE([],[], [$makerule LUSTRE_KERNEL_TEST=conftest.i], [test -s build/conftest.i], [ AC_MSG_RESULT([no]) ],[ AC_MSG_RESULT([yes]) makerule="_module_$makerule" MODULE_TARGET="M" ]) else makerule="_dir_$PWD/build" fi AC_SUBST(MODULE_TARGET) AC_SUBST(LINUX25) AC_SUBST(KMODEXT) ]) # # LB_LINUX_PATH # # Find paths for linux, handling kernel-source rpms # AC_DEFUN([LB_LINUX_PATH], [AC_MSG_CHECKING([for Linux sources]) AC_ARG_WITH([linux], AC_HELP_STRING([--with-linux=path], [set path to Linux source (default=/usr/src/linux)]), [LINUX=$with_linux], [LINUX=/usr/src/linux]) AC_MSG_RESULT([$LINUX]) AC_SUBST(LINUX) # -------- linux objects (for 2.6) -- AC_MSG_CHECKING([for Linux objects dir]) AC_ARG_WITH([linux-obj], AC_HELP_STRING([--with-linux-obj=path], [set path to Linux objects dir (default=$LINUX)]), [LINUX_OBJ=$with_linux_obj], [LINUX_OBJ=$LINUX]) AC_MSG_RESULT([$LINUX_OBJ]) AC_SUBST(LINUX_OBJ) # -------- check for .confg -------- AC_ARG_WITH([linux-config], [AC_HELP_STRING([--with-linux-config=path], [set path to Linux .conf (default=$LINUX_OBJ/.config)])], [LINUX_CONFIG=$with_linux_config], [LINUX_CONFIG=$LINUX_OBJ/.config]) AC_SUBST(LINUX_CONFIG) AC_CHECK_FILE([/boot/kernel.h], [KERNEL_SOURCE_HEADER='/boot/kernel.h'], [AC_CHECK_FILE([/var/adm/running-kernel.h]), [KERNEL_SOURCE_HEADER='/var/adm/running-kernel.h']]) AC_ARG_WITH([kernel-source-header], AC_HELP_STRING([--with-kernel-source-header=path], [Use a different kernel version header. Consult README.kernel-source for details.]), [KERNEL_SOURCE_HEADER=$with_kernel_source_header]) # ------------ .config exists ---------------- AC_CHECK_FILE([$LINUX_CONFIG],[], [AC_MSG_ERROR([Kernel config could not be found. If you are building from a kernel-source rpm consult README.kernel-source])]) # ----------- make dep run? ------------------ AC_CHECK_FILES([$LINUX_OBJ/include/linux/autoconf.h $LINUX_OBJ/include/linux/version.h $LINUX/include/linux/config.h],[], [AC_MSG_ERROR([Run make config in $LINUX.])]) # ------------ rhconfig.h includes runtime-generated bits -- # red hat kernel-source checks # we know this exists after the check above. if the user # tarred up the tree and ran make dep etc. in it, then # version.h gets overwritten with a standard linux one. if grep rhconfig $LINUX_OBJ/include/linux/version.h >/dev/null ; then # This is a clean kernel-source tree, we need to # enable extensive workarounds to get this to build # modules AC_CHECK_FILE([$KERNEL_SOURCE_HEADER], [if test $KERNEL_SOURCE_HEADER = '/boot/kernel.h' ; then AC_MSG_WARN([Using /boot/kernel.h from RUNNING kernel.]) AC_MSG_WARN([If this is not what you want, use --with-kernel-source-header.]) AC_MSG_WARN([Consult README.kernel-source for details.]) fi], [AC_MSG_ERROR([$KERNEL_SOURCE_HEADER not found. Consult README.kernel-source for details.])]) EXTRA_KCFLAGS="-include $KERNEL_SOURCE_HEADER $EXTRA_KCFLAGS" fi # this is needed before we can build modules LB_LINUX_VERSION # --- check that we can build modules at all AC_MSG_CHECKING([that modules can be built at all]) LB_LINUX_TRY_COMPILE([],[],[ AC_MSG_RESULT([yes]) ],[ AC_MSG_RESULT([no]) AC_MSG_WARN([Consult config.log for details.]) AC_MSG_WARN([If you are trying to build with a kernel-source rpm, consult README.kernel-source]) AC_MSG_ERROR([Kernel modules could not be built.]) ]) ]) # # LB_LINUX_UML # # check for a uml kernel # AC_DEFUN([LB_LINUX_UML], [ARCH_UM= UML_CFLAGS= AC_MSG_CHECKING([if you are running user mode linux for $target_cpu]) if test -e $LINUX/include/asm-um ; then if test X`ls -id $LINUX/include/asm/ 2>/dev/null | awk '{print [$]1}'` = X`ls -id $LINUX/include/asm-um 2>/dev/null | awk '{print [$]1}'` ; then ARCH_UM='ARCH=um' # see notes in Rules.in UML_CFLAGS='-O0' AC_MSG_RESULT(yes) else AC_MSG_RESULT([no (asm doesn't point at asm-um)]) fi else AC_MSG_RESULT([no (asm-um missing)]) fi AC_SUBST(ARCH_UM) AC_SUBST(UML_CFLAGS) ]) # these are like AC_TRY_COMPILE, but try to build modules against the # kernel, inside the build directory # # LB_LINUX_CONFTEST # # create a conftest.c file # AC_DEFUN([LB_LINUX_CONFTEST], [cat >conftest.c <<_ACEOF $1 _ACEOF ]) # # LB_LINUX_COMPILE_IFELSE # # like AC_COMPILE_IFELSE # AC_DEFUN([LB_LINUX_COMPILE_IFELSE], [m4_ifvaln([$1], [LB_LINUX_CONFTEST([$1])])dnl rm -f build/conftest.o build/conftest.mod.c build/conftest.ko AS_IF([AC_TRY_COMMAND(cp conftest.c build && make [$2] CC="$CC" -f $PWD/build/Makefile LUSTRE_LINUX_CONFIG=$LINUX_CONFIG -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM $MODULE_TARGET=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])], [$4], [_AC_MSG_LOG_CONFTEST m4_ifvaln([$5],[$5])dnl])dnl rm -f build/conftest.o build/conftest.mod.c build/conftest.mod.o build/conftest.ko m4_ifval([$1], [build/conftest.c conftest.c])[]dnl ]) # # LB_LINUX_TRY_COMPILE # # like AC_TRY_COMPILE # AC_DEFUN([LB_LINUX_TRY_COMPILE], [LB_LINUX_COMPILE_IFELSE( [AC_LANG_PROGRAM([[$1]], [[$2]])], [modules], [test -s build/conftest.o], [$3], [$4])]) # # LB_LINUX_CONFIG # # check if a given config option is defined # AC_DEFUN([LB_LINUX_CONFIG], [AC_MSG_CHECKING([if Linux was built with CONFIG_$1]) LB_LINUX_TRY_COMPILE([#include ],[ #ifndef CONFIG_$1 #error CONFIG_$1 not #defined #endif ],[ AC_MSG_RESULT([yes]) $2 ],[ AC_MSG_RESULT([no]) $3 ]) ]) # # LB_LINUX_TRY_MAKE # # like LB_LINUX_TRY_COMPILE, but with different arguments # AC_DEFUN([LB_LINUX_TRY_MAKE], [LB_LINUX_COMPILE_IFELSE([AC_LANG_PROGRAM([[$1]], [[$2]])], [$3], [$4], [$5], [$6])]) # # LB_PROG_LINUX # # linux tests # AC_DEFUN([LB_PROG_LINUX], [LB_LINUX_PATH LB_LINUX_UML LB_LINUX_CONFIG([MODULES],[],[ AC_MSG_ERROR([module support is required to build Lustre kernel modules.]) ]) LB_LINUX_CONFIG([MODVERSIONS]) LB_LINUX_CONFIG([PREEMPT],[ AC_MSG_ERROR([Lustre does not support kernels with preempt enabled.]) ]) LB_LINUX_CONFIG([KALLSYMS],[],[ if test "x$ARCH_UM" = "x" ; then AC_MSG_ERROR([Lustre requires that CONFIG_KALLSYMS is enabled in your kernel.]) fi ]) # Portals tests LP_PROG_LINUX # Lustre tests LC_PROG_LINUX ]) # # LB_LINUX_STRUCT_PAGE_LIST # # 2.6.4 no longer has page->list # AC_DEFUN([LB_LINUX_STRUCT_PAGE_LIST], [AC_MSG_CHECKING([if struct page has a list field]) LB_LINUX_TRY_COMPILE([ #include ],[ struct page page; &page.list; ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_PAGE_LIST, 1, [struct page has a list field]) ],[ AC_MSG_RESULT([no]) ]) ]) # # LB_LINUX_STRUCT_SIGHAND # # red hat 2.4 adds sighand to struct task_struct # AC_DEFUN([LB_LINUX_STRUCT_SIGHAND], [AC_MSG_CHECKING([if task_struct has a sighand field]) LB_LINUX_TRY_COMPILE([ #include ],[ struct task_struct p; p.sighand = NULL; ],[ AC_DEFINE(CONFIG_RH_2_4_20, 1, [this kernel contains Red Hat 2.4.20 patches]) AC_MSG_RESULT([yes]) ],[ AC_MSG_RESULT([no]) ]) ]) # # LB_LINUX_FUNC_CPU_ONLINE # # cpu_online is different in rh 2.4, vanilla 2.4, and 2.6 # AC_DEFUN([LB_LINUX_FUNC_CPU_ONLINE], [AC_MSG_CHECKING([if kernel defines cpu_online()]) LB_LINUX_TRY_COMPILE([ #include ],[ cpu_online(0); ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_CPU_ONLINE, 1, [cpu_online found]) ],[ AC_MSG_RESULT([no]) ]) ]) # # LB_LINUX_TYPE_CPUMASK_T # # same goes for cpumask_t # AC_DEFUN([LB_LINUX_TYPE_CPUMASK_T], [AC_MSG_CHECKING([if kernel defines cpumask_t]) LB_LINUX_TRY_COMPILE([ #include ],[ return sizeof (cpumask_t); ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_CPUMASK_T, 1, [cpumask_t found]) ],[ AC_MSG_RESULT([no]) ]) ]) # # LB_LINUX_FUNC_SHOW_TASK # # we export show_task(), but not all kernels have it (yet) # AC_DEFUN([LB_LINUX_FUNC_SHOW_TASK], [AC_MSG_CHECKING([if kernel exports show_task]) have_show_task=0 for file in ksyms sched ; do if grep -q "EXPORT_SYMBOL(show_task)" \ "$LINUX/kernel/$file.c" 2>/dev/null ; then have_show_task=1 break fi done if test x$have_show_task = x1 ; then AC_DEFINE(HAVE_SHOW_TASK, 1, [show_task is exported]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ]) # # LB_LINUX_CONFIG_EXT3 # # that ext3 is enabled in the kernel # AC_DEFUN([LB_LINUX_CONFIG_EXT3], [LB_LINUX_CONFIG([EXT3_FS],[],[ LB_LINUX_CONFIG([EXT3_FS_MODULE],[],[$2]) ]) LB_LINUX_CONFIG([EXT3_FS_XATTR],[$1],[$3]) ]) # # LB_LINUX_FSHOOKS # # If we have (and can build) fshooks.h # AC_DEFUN([LB_LINUX_FSHOOKS], [AC_MSG_CHECKING([if this compiler can build a SuSE 2.6 kernel]) # an excerpt from fshooks.h, which doesn't build with fedora's gcc 3.4 LB_LINUX_TRY_COMPILE([ /* for the lack of a kernel-wide definition */ typedef enum { false, true } boolean_t __attribute__((__mode__(__QI__))); ],[],[ AC_MSG_RESULT([yes]) ],[ AC_MSG_RESULT([no]) AC_MSG_WARN([We suggest trying gcc 3.3.x.]) AC_MSG_WARN([You can set CC=gcc33 before running configure.]) AC_MSG_ERROR([Your compiler cannot build a SuSE 2.6 kernel.]) ]) AC_MSG_CHECKING([if fshooks are present]) LB_LINUX_TRY_COMPILE([ #include ],[],[ AC_MSG_RESULT([yes]) $1 ],[ AC_MSG_RESULT([no]) $2 ]) ]) # # LB_LINUX_STRUCT_KIOBUF # # rh 2.4.18 has iobuf->dovary, but other kernels do not # AC_DEFUN([LB_LINUX_STRUCT_KIOBUF], [AC_MSG_CHECKING([if struct kiobuf has a dovary field]) LB_LINUX_TRY_COMPILE([ #include ],[ struct kiobuf iobuf; iobuf.dovary = 1; ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_KIOBUF_DOVARY, 1, [struct kiobuf has a dovary field]) ],[ AC_MSG_RESULT([no]) ]) ]) # # LB_LINUX_FUNC_COND_RESCHED # # cond_resched() was introduced in 2.4.20 # AC_DEFUN([LB_LINUX_FUNC_COND_RESCHED], [AC_MSG_CHECKING([if kernel offers cond_resched]) LB_LINUX_TRY_COMPILE([ #include ],[ cond_resched(); ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_COND_RESCHED, 1, [cond_resched found]) ],[ AC_MSG_RESULT([no]) ]) ]) # # LB_LINUX_FUNC_ZAP_PAGE_RANGE # # if zap_page_range() taks a vma arg # AC_DEFUN([LB_LINUX_FUNC_ZAP_PAGE_RANGE], [AC_MSG_CHECKING([if zap_pag_range with vma parameter]) ZAP_PAGE_RANGE_VMA="`grep -c 'zap_page_range.*struct vm_area_struct' $LINUX/include/linux/mm.h`" if test "$ZAP_PAGE_RANGE_VMA" != 0 ; then AC_DEFINE(ZAP_PAGE_RANGE_VMA, 1, [zap_page_range with vma parameter]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ]) # # LB_LINUX_FUNC_PDE # # if proc_fs.h defines PDE() # AC_DEFUN([LB_LINUX_FUNC_PDE], [AC_MSG_CHECKING([if kernel defines PDE]) HAVE_PDE="`grep -c 'proc_dir_entry..PDE' $LINUX/include/linux/proc_fs.h`" if test "$HAVE_PDE" != 0 ; then AC_DEFINE(HAVE_PDE, 1, [the kernel defines PDE]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ]) # # LB_LINUX_FUNC_DIRECT_IO # # if direct_IO takes a struct file argument # AC_DEFUN([LB_LINUX_FUNC_DIRECT_IO], [AC_MSG_CHECKING([if kernel passes struct file to direct_IO]) HAVE_DIO_FILE="`grep -c 'direct_IO.*struct file' $LINUX/include/linux/fs.h`" if test "$HAVE_DIO_FILE" != 0 ; then AC_DEFINE(HAVE_DIO_FILE, 1, [the kernel passes struct file to direct_IO]) AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi ]) # # LB_LINUX_HEADER_MM_INLINE # # RHEL kernels define page_count in mm_inline.h # AC_DEFUN([LB_LINUX_HEADER_MM_INLINE], [AC_MSG_CHECKING([if kernel has mm_inline.h header]) LB_LINUX_TRY_COMPILE([ #include ],[ #ifndef page_count #error mm_inline.h does not define page_count #endif ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_MM_INLINE, 1, [mm_inline found]) ],[ AC_MSG_RESULT([no]) ]) ]) # # LB_LINUX_STRUCT_INODE # # if inode->i_alloc_sem exists # AC_DEFUN([LB_LINUX_STRUCT_INODE], [AC_MSG_CHECKING([if struct inode has i_alloc_sem]) LB_LINUX_TRY_COMPILE([ #include #include ],[ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,24)) #error "down_read_trylock broken before 2.4.24" #endif struct inode i; return (char *)&i.i_alloc_sem - (char *)&i; ],[ AC_MSG_RESULT([yes]) AC_DEFINE(HAVE_I_ALLOC_SEM, 1, [struct inode has i_alloc_sem]) ],[ AC_MSG_RESULT([no]) ]) ])