X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=config%2Flustre-build-linux.m4;h=e1b46a374080a2c1b37d62246dc74f697c884470;hp=a26759e7efd25b0047fc1c31720704fb6e251c7e;hb=2250e072c37855d611aa64027945981fe2c8f4d7;hpb=1e0ab9df0e0d6e166ed1d4c83c3fa919a05d61b1 diff --git a/config/lustre-build-linux.m4 b/config/lustre-build-linux.m4 index a26759e..e1b46a3 100644 --- a/config/lustre-build-linux.m4 +++ b/config/lustre-build-linux.m4 @@ -3,33 +3,35 @@ # # Set things accordingly for a linux kernel # -AC_DEFUN([LB_LINUX_VERSION],[ +AC_DEFUN([LB_LINUX_VERSION], [ KMODEXT=".ko" +AC_SUBST(KMODEXT) -MODULE_TARGET="SUBDIRS" makerule="$PWD/build" -AC_MSG_CHECKING([for external module build support]) +AC_CACHE_CHECK([for external module build target], lb_cv_module_target, [ +lb_cv_module_target="" +MODULE_TARGET="SUBDIRS" rm -f build/conftest.i -LB_LINUX_TRY_MAKE([],[], +LB_LINUX_TRY_MAKE([], [], [$makerule LUSTRE_KERNEL_TEST=conftest.i], [test -s build/conftest.i], - [ - AC_MSG_RESULT([no]) - ],[ - makerule="_module_$makerule" + [lb_cv_module_target="SUBDIRS"], [ MODULE_TARGET="M" - LB_LINUX_TRY_MAKE([],[], + makerule="_module_$PWD/build" + LB_LINUX_TRY_MAKE([], [], [$makerule LUSTRE_KERNEL_TEST=conftest.i], [test -s build/conftest.i], - [ - AC_MSG_RESULT([yes]) - ],[ + [lb_cv_module_target="M"], [ AC_MSG_ERROR([unknown; check config.log for details]) ]) ]) - +]) +AS_IF([test -z "$lb_cv_module_target"], + [AC_MSG_ERROR([unknown external module build target])], +[test "x$lb_cv_module_target" = "xM"], + [makerule="_module_$PWD/build"]) +MODULE_TARGET=$lb_cv_module_target AC_SUBST(MODULE_TARGET) -AC_SUBST(KMODEXT) ]) # @@ -38,146 +40,205 @@ AC_SUBST(KMODEXT) # Determine the Linux kernel version string from the utsrelease # AC_DEFUN([LB_LINUX_UTSRELEASE], [ - AC_MSG_CHECKING([kernel source version]) - - utsrelease1=${LINUX_OBJ}/include/generated/utsrelease.h - utsrelease2=${LINUX_OBJ}/include/linux/utsrelease.h - utsrelease3=${LINUX_OBJ}/include/linux/version.h - AS_IF([test -r ${utsrelease1} && fgrep -q UTS_RELEASE ${utsrelease1}], [ - utsrelease=${utsrelease1} - ], [test -r ${utsrelease2} && fgrep -q UTS_RELEASE ${utsrelease2}], [ - utsrelease=${utsrelease2} - ], [test -r ${utsrelease3} && fgrep -q UTS_RELEASE ${utsrelease3}], [ - utsrelease=${utsrelease3} - ]) - - AS_IF([test ! -z "${utsrelease}"], [ - UTS_RELEASE=$(awk -F \" '/ UTS_RELEASE / { print [$]2 }' \ - ${utsrelease}) - AS_IF([test -z "$UTS_RELEASE"], [ - AC_MSG_RESULT([Not found]) - AC_MSG_ERROR([*** Cannot determine kernel version.]) - ]) - ], [ - AC_MSG_RESULT([Not found]) - AC_MSG_ERROR([ - *** Cannot find UTS_RELEASE definition. - *** This is often provided by the kernel-devel package.]) +AC_CACHE_CHECK([for Linux kernel utsrelease], lb_cv_utsrelease, [ +lb_cv_utsrelease="" +utsrelease1=$LINUX_OBJ/include/generated/utsrelease.h +utsrelease2=$LINUX_OBJ/include/linux/utsrelease.h +utsrelease3=$LINUX_OBJ/include/linux/version.h +AS_IF([test -r $utsrelease1 && fgrep -q UTS_RELEASE $utsrelease1], + [utsrelease=$utsrelease1], +[test -r $utsrelease2 && fgrep -q UTS_RELEASE $utsrelease2], + [utsrelease=$utsrelease2], +[test -r $utsrelease3 && fgrep -q UTS_RELEASE $utsrelease3], + [utsrelease=$utsrelease3]) +AS_IF([test -n "$utsrelease"], + [lb_cv_utsrelease=$(awk -F \" '/ UTS_RELEASE / { print [$]2 }' $utsrelease)], + [AC_MSG_ERROR([ + +Cannot find UTS_RELEASE definition. + +This is often provided by the kernel-devel package. +]) ]) - - AC_MSG_RESULT([${UTS_RELEASE}]) - - LINUX_VERSION=${UTS_RELEASE} - AC_SUBST(LINUX_VERSION) - LINUXRELEASE=${UTS_RELEASE} - AC_SUBST(LINUXRELEASE) ]) - +AS_IF([test -z "$lb_cv_utsrelease"], + [AC_MSG_ERROR([Cannot determine Linux kernel version.])]) +LINUXRELEASE=$lb_cv_utsrelease +AC_SUBST(LINUXRELEASE) +]) # # LB_LINUX_RELEASE # # get the release version of linux # -AC_DEFUN([LB_LINUX_RELEASE], -[ -LB_LINUX_UTSRELEASE - -moduledir='$(CROSS_PATH)/lib/modules/$(LINUXRELEASE)/updates/kernel' -AC_SUBST(moduledir) - -modulefsdir='$(moduledir)/fs/$(PACKAGE)' -AC_SUBST(modulefsdir) - -modulenetdir='$(moduledir)/net/$(PACKAGE)' -AC_SUBST(modulenetdir) - -# ------------ RELEASE -------------------------------- -AC_MSG_CHECKING([for Lustre release]) -AC_ARG_WITH([release],[ - AC_HELP_STRING([--with-release=string], - [set the release string (default=$kvers_YYYYMMDDhhmm)]), - [RELEASE=$withval], - RELEASE="" - if test -n "$DOWNSTREAM_RELEASE"; then - RELEASE="${DOWNSTREAM_RELEASE}_" - fi - RELEASE="$RELEASE`echo ${LINUXRELEASE} | tr '-' '_'`_$BUILDID" -]) -AC_MSG_RESULT($RELEASE) -AC_SUBST(RELEASE) - -# check if the kernel is one from RHEL or SUSE -AC_MSG_CHECKING([for RedHat kernel version]) - AS_IF([fgrep -q RHEL_RELEASE ${LINUX_OBJ}/include/$VERSION_HDIR/version.h], [ +AC_DEFUN([LB_LINUX_RELEASE], [ + LB_LINUX_UTSRELEASE + + # Define default states + RHEL_KERNEL="no" + SUSE_KERNEL="no" + UBUNTU_KERNEL="no" + DEBIAN_KERNEL="no" + # And if any of the above kernels has been detected yet + KERNEL_FOUND="no" + + # Check for RedHat first (no need to check KERNEL_FOUND + AC_CACHE_CHECK([for RedHat kernel release number], lb_cv_rhel_kernel_version, [ + lb_cv_rhel_kernel_version="" + AS_IF([fgrep -q RHEL_RELEASE $LINUX_OBJ/include/$VERSION_HDIR/version.h], [ + lb_cv_rhel_kernel_version=$(awk '/ RHEL_MAJOR / { print [$]3 }' \ + $LINUX_OBJ/include/$VERSION_HDIR/version.h)$(awk \ + '/ RHEL_MINOR / { print [$]3 }' \ + $LINUX_OBJ/include/$VERSION_HDIR/version.h) + ]) + ]) + AS_IF([test -n "$lb_cv_rhel_kernel_version"], [ RHEL_KERNEL="yes" - RHEL_RELEASE=$(expr 0$(awk -F \" '/ RHEL_RELEASE / { print [$]2 }' \ - ${LINUX_OBJ}/include/$VERSION_HDIR/version.h) + 1) - KERNEL_VERSION=$(sed -e 's/\(@<:@23@:>@\.@<:@0-9@:>@*\.@<:@0-9@:>@*\).*/\1/' <<< ${LINUXRELEASE}) - RHEL_KERNEL_VERSION=${KERNEL_VERSION}-${RHEL_RELEASE} - AC_SUBST(RHEL_KERNEL_VERSION) - AC_MSG_RESULT([${RHEL_KERNEL_VERSION}]) - ], [ - AC_MSG_RESULT([not found]) - LB_LINUX_CONFIG([SUSE_KERNEL],[SUSE_KERNEL="yes"],[]) + KERNEL_FOUND="yes" + RHEL_RELEASE_NO=$lb_cv_rhel_kernel_version + ]) + + # Check for SuSE + AS_IF([test "x$KERNEL_FOUND" = "xno"], [ + LB_CHECK_CONFIG([SUSE_KERNEL], [ + SUSE_KERNEL="yes" + KERNEL_FOUND="yes" + ], []) + ]) + + # Check for Ubuntu + AS_IF([test "x$KERNEL_FOUND" = "xno"], [ + AC_CACHE_CHECK([for Ubuntu kernel signature], lb_cv_ubuntu_kernel_sig, [ + lb_cv_ubuntu_kernel_sig="no" + AS_IF([fgrep -q "CONFIG_VERSION_SIGNATURE \"Ubuntu" $LINUX_OBJ/include/generated/autoconf.h], [ + lb_cv_ubuntu_kernel_sig="yes" + ]) + ]) + AS_IF([test "x$lb_cv_ubuntu_kernel_sig" = "xyes"], [ + UBUNTU_KERNEL="yes" + KERNEL_FOUND="yes" + ]) + ]) + + # Check for Debian + AS_IF([test "x$KERNEL_FOUND" = "xno"], [ + AC_CACHE_CHECK([for Debian kernel signature], lb_cv_debian_kernel_sig, [ + lb_cv_debian_kernel_sig="no" + AS_IF([grep -q "LINUX_PACKAGE_ID\s*\"\s*Debian" $LINUX_OBJ/include/generated/package.h], [ + lb_cv_debian_kernel_sig="yes" + ]) + ]) + AS_IF([test "x$lb_cv_debian_kernel_sig" = "xyes"], [ + DEBIAN_KERNEL="yes" + KERNEL_FOUND="yes" + ]) ]) + + # If still no kernel was found, a warning is issued + AS_IF([test "x$KERNEL_FOUND" = "xno"], [ + AC_MSG_WARN([Kernel Distro seems to be neither RedHat, SuSE, Ubuntu nor Debian]) + ]) + + AC_MSG_CHECKING([for Linux kernel module package directory]) + AC_ARG_WITH([kmp-moddir], + AC_HELP_STRING([--with-kmp-moddir=string], + [set the kmod updates or extra directory]), + [KMP_MODDIR=$withval + IN_KERNEL=''],[ + AS_IF([test x$RHEL_KERNEL = xyes], [KMP_MODDIR="extra/kernel"], + [test x$SUSE_KERNEL = xyes], [KMP_MODDIR="updates/kernel"], + [test x$UBUNTU_KERNEL = xyes], [KMP_MODDIR="updates/kernel"], + [test x$DEBIAN_KERNEL = xyes], [KMP_MODDIR="updates/kernel"], + [AC_MSG_WARN([Kernel Distro seems to be neither RedHat, SuSE, Ubuntu nor Debian])] + ) + IN_KERNEL="${PACKAGE}"]) + AC_MSG_RESULT($KMP_MODDIR) + + moduledir="/lib/modules/${LINUXRELEASE}/${KMP_MODDIR}" + + modulefsdir="${moduledir}/fs/${IN_KERNEL}" + AC_SUBST(modulefsdir) + + modulenetdir="${moduledir}/net/${IN_KERNEL}" + AC_SUBST(modulenetdir) + + AC_SUBST(KMP_MODDIR) +]) + +# +# LB_LINUX_SYMVERFILE +# +# SLES 9 uses a different name for this file - unsure about vanilla kernels +# around this version, but it matters for servers only. +AC_DEFUN([LB_LINUX_SYMVERFILE], [ +AC_CACHE_CHECK([for the name of module symbol version file], lb_cv_module_symvers, [ +AS_IF([grep -q Modules.symvers $LINUX/scripts/Makefile.modpost], + [lb_cv_module_symvers=Modules.symvers], + [lb_cv_module_symvers=Module.symvers]) +]) +SYMVERFILE=$lb_cv_module_symvers +AC_SUBST(SYMVERFILE) ]) +# # LB_ARG_REPLACE_PATH(PACKAGE, PATH) -AC_DEFUN([LB_ARG_REPLACE_PATH],[ - new_configure_args= - eval "set x $ac_configure_args" - shift - for arg; do - case $arg in - --with-[$1]=*) - arg=--with-[$1]=[$2] - ;; - *\'*) - arg=$(printf %s\n ["$arg"] | \ - sed "s/'/'\\\\\\\\''/g") - ;; - esac - dnl AS_VAR_APPEND([new_configure_args], [" '$arg'"]) - new_configure_args="$new_configure_args \"$arg\"" - done - ac_configure_args=$new_configure_args +# +AC_DEFUN([LB_ARG_REPLACE_PATH], [ +new_configure_args= +eval set -- $ac_configure_args +for arg; do + case $arg in + --with-[$1]=*) + arg=--with-[$1]=[$2] ;; + *\'*) + arg=$(printf %s\n ["$arg"] | sed "s/'/'\\\\\\\\''/g") ;; + esac + dnl AS_VAR_APPEND([new_configure_args], [" '$arg'"]) + new_configure_args="$new_configure_args '$arg'" +done +ac_configure_args=$new_configure_args ]) +# +# __LB_ARG_CANON_PATH +# # this is the work-horse of the next function +# AC_DEFUN([__LB_ARG_CANON_PATH], [ [$3]=$(readlink -f $with_$2) LB_ARG_REPLACE_PATH([$1], $[$3]) ]) +# +# LB_ARG_CANON_PATH +# # a front-end for the above function that transforms - and . in the # PACKAGE portion of --with-PACKAGE into _ suitable for variable names +# AC_DEFUN([LB_ARG_CANON_PATH], [ __LB_ARG_CANON_PATH([$1], m4_translit([$1], [-.], [__]), [$2]) ]) # -# # LB_LINUX_PATH # # Find paths for linux, handling kernel-source rpms # -AC_DEFUN([LB_LINUX_PATH], -[# prep some default values -for DEFAULT_LINUX in /lib/modules/$(uname -r)/{source,build} /usr/src/linux; do - if readlink -q -e $DEFAULT_LINUX; then - break - fi +AC_DEFUN([LB_LINUX_PATH], [ +for DEFAULT_LINUX in /usr/src/linux-source-* /lib/modules/$(uname -r)/{source,build} /usr/src/linux $(find /usr/src/kernels/ -maxdepth 1 -name @<:@0-9@:>@\* | xargs -r ls -d | tail -n 1); do + AS_IF([readlink -q -e $DEFAULT_LINUX >/dev/null], [break]) done if test "$DEFAULT_LINUX" = "/lib/modules/$(uname -r)/source"; then PATHS="/lib/modules/$(uname -r)/build" +else + PATHS="/usr/src/linux-headers-$(uname -r)" fi PATHS+=" $DEFAULT_LINUX" for DEFAULT_LINUX_OBJ in $PATHS; do - if readlink -q -e $DEFAULT_LINUX_OBJ; then - break - fi + AS_IF([readlink -q -e $DEFAULT_LINUX_OBJ >/dev/null], [break]) done + AC_MSG_CHECKING([for Linux sources]) AC_ARG_WITH([linux], AC_HELP_STRING([--with-linux=path], @@ -189,17 +250,16 @@ AC_MSG_RESULT([$LINUX]) AC_SUBST(LINUX) # -------- check for linux -------- -LB_CHECK_FILE([$LINUX],[], +LB_CHECK_FILE([$LINUX], [], [AC_MSG_ERROR([Kernel source $LINUX could not be found.])]) # -------- linux objects (for 2.6) -- -AC_MSG_CHECKING([for Linux objects dir]) +AC_MSG_CHECKING([for Linux objects]) AC_ARG_WITH([linux-obj], AC_HELP_STRING([--with-linux-obj=path], - [set path to Linux objects dir (default=/lib/modules/$(uname -r)/build,/usr/src/linux)]), + [set path to Linux objects (default=/lib/modules/$(uname -r)/build,/usr/src/linux)]), [LB_ARG_CANON_PATH([linux-obj], [LINUX_OBJ])], [LINUX_OBJ=$DEFAULT_LINUX_OBJ]) - AC_MSG_RESULT([$LINUX_OBJ]) AC_SUBST(LINUX_OBJ) @@ -209,6 +269,14 @@ AC_ARG_WITH([linux-config], [set path to Linux .conf (default=$LINUX_OBJ/.config)])], [LB_ARG_CANON_PATH([linux-config], [LINUX_CONFIG])], [LINUX_CONFIG=$LINUX_OBJ/.config]) + +# -------- check if .config exists -- +LB_CHECK_FILE([$LINUX_CONFIG], [], + [AC_MSG_ERROR([ + +Kernel config could not be found. +]) +]) AC_SUBST(LINUX_CONFIG) LB_CHECK_FILE([/boot/kernel.h], @@ -218,138 +286,237 @@ LB_CHECK_FILE([/boot/kernel.h], AC_ARG_WITH([kernel-source-header], AC_HELP_STRING([--with-kernel-source-header=path], - [Use a different kernel version header. Consult build/README.kernel-source for details.]), + [Use a different kernel version header.]), [LB_ARG_CANON_PATH([kernel-source-header], [KERNEL_SOURCE_HEADER])]) -# ------------ .config exists ---------------- -LB_CHECK_FILE([$LINUX_CONFIG],[], - [AC_MSG_ERROR([Kernel config could not be found. If you are building from a kernel-source rpm consult build/README.kernel-source])]) - # ----------- make dep run? ------------------ # at 2.6.19 # $LINUX/include/linux/config.h is removed -# and at more old has only one line -# include -LB_CHECK_FILE([$LINUX_OBJ/include/generated/autoconf.h],[AUTOCONF_HDIR=generated], - [LB_CHECK_FILE([$LINUX_OBJ/include/linux/autoconf.h],[AUTOCONF_HDIR=linux], - [AC_MSG_ERROR([Run make config in $LINUX.])])]) - AC_SUBST(AUTOCONF_HDIR) -LB_CHECK_FILE([$LINUX_OBJ/include/linux/version.h], [VERSION_HDIR=linux], +# and at more old has only one line include +# +LB_CHECK_FILE([$LINUX_OBJ/include/generated/autoconf.h], + [AUTOCONF_HDIR=generated], + [LB_CHECK_FILE([$LINUX_OBJ/include/linux/autoconf.h], + [AUTOCONF_HDIR=linux], + [AC_MSG_ERROR([Run make config in $LINUX.])])]) +AC_SUBST(AUTOCONF_HDIR) + +LB_CHECK_FILE([$LINUX_OBJ/include/linux/version.h], + [VERSION_HDIR=linux], [LB_CHECK_FILE([$LINUX_OBJ/include/generated/uapi/linux/version.h], [VERSION_HDIR=generated/uapi/linux], - [AC_MSG_ERROR([Run make config in $LINUX.])]) - ]) - AC_SUBST(VERSION_HDIR) + [AC_MSG_ERROR([Run make config in $LINUX.])])]) +AC_SUBST(VERSION_HDIR) # ----------- kconfig.h exists --------------- # kernel 3.1, $LINUX/include/linux/kconfig.h is added # see kernel commit 2a11c8ea20bf850b3a2c60db8c2e7497d28aba99 -LB_CHECK_FILE([$LINUX_OBJ/include/linux/kconfig.h], - [CONFIG_INCLUDE=include/linux/kconfig.h], +# +LB_CHECK_FILE([$LINUX/include/linux/kconfig.h], + [CONFIG_INCLUDE=$LINUX/include/linux/kconfig.h], [CONFIG_INCLUDE=include/$AUTOCONF_HDIR/autoconf.h]) - AC_SUBST(CONFIG_INCLUDE) +AC_SUBST(CONFIG_INCLUDE) # ------------ rhconfig.h includes runtime-generated bits -- -# red hat kernel-source checks +# RedHat 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/$VERSION_HDIR/version.h >/dev/null ; then +AS_IF([grep rhconfig $LINUX_OBJ/include/$VERSION_HDIR/version.h >/dev/null], [ # This is a clean kernel-source tree, we need to - # enable extensive workarounds to get this to build - # modules - LB_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 build/README.kernel-source for details.]) - fi], - [AC_MSG_ERROR([$KERNEL_SOURCE_HEADER not found. Consult build/README.kernel-source for details.])]) + # enable extensive workarounds to get this to build modules + LB_CHECK_FILE([$KERNEL_SOURCE_HEADER], [ + AS_IF([test $KERNEL_SOURCE_HEADER = '/boot/kernel.h'], + [AC_MSG_WARN([ + +Using /boot/kernel.h from RUNNING kernel. + +If this is not what you want, use --with-kernel-source-header. +Consult build/README.kernel-source for details. +]) + ])], + [AC_MSG_ERROR([ + +$KERNEL_SOURCE_HEADER not found. + +Consult build/README.kernel-source for details. +]) + ]) EXTRA_KCFLAGS="-include $KERNEL_SOURCE_HEADER $EXTRA_KCFLAGS" -fi +]) # this is needed before we can build modules -LB_LINUX_CROSS 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 build/README.kernel-source]) - AC_MSG_ERROR([Kernel modules cannot be built.]) +LB_CHECK_COMPILE([that modules can be built at all], build_modules, + [], [], [], [ + AC_MSG_ERROR([ + +Kernel modules cannot be built. Consult config.log for details. + +If you are trying to build with a kernel-source rpm, +consult build/README.kernel-source +]) ]) LB_LINUX_RELEASE ]) # end of LB_LINUX_PATH -# LB_LINUX_SYMVERFILE -# SLES 9 uses a different name for this file - unsure about vanilla kernels -# around this version, but it matters for servers only. -AC_DEFUN([LB_LINUX_SYMVERFILE], - [AC_MSG_CHECKING([name of module symbol version file]) - if grep -q Modules.symvers $LINUX/scripts/Makefile.modpost ; then - SYMVERFILE=Modules.symvers - else - SYMVERFILE=Module.symvers - fi - AC_MSG_RESULT($SYMVERFILE) - AC_SUBST(SYMVERFILE) -]) - -# -# LB_LINUX_CROSS -# -# check for cross compilation -# -AC_DEFUN([LB_LINUX_CROSS], - [AC_MSG_CHECKING([for cross compilation]) -AS_IF([test "x$cross_compiling" = xno], [AC_MSG_RESULT([no])], - [case $host_vendor in - # The K1OM architecture is an extension of the x86 architecture - # and in MPSS 2.1 it's defined in $host_vendor. But in MPSS 3.x - # it's defined in $host_arch. So, try to support both case. - k1om | mpss) - AC_MSG_RESULT([Intel(R) Xeon Phi(TM)]) - CC_TARGET_ARCH=`$CC -v 2>&1 | grep Target: | sed -e 's/Target: //'` - AC_SUBST(CC_TARGET_ARCH) - if test \( $CC_TARGET_ARCH != x86_64-k1om-linux \ - -a $CC_TARGET_ARCH != k1om-mpss-linux \) - then - AC_MSG_ERROR([Cross compiler not found in PATH.]) - fi - CROSS_VARS="ARCH=k1om CROSS_COMPILE=${CC_TARGET_ARCH}-" - CROSS_PATH="${CROSS_PATH:=/opt/lustre/${VERSION}/${CC_TARGET_ARCH}}" - CCAS=$CC - # need to produce special section for debuginfo extraction - LDFLAGS="${LDFLAGS} -Wl,--build-id" - EXTRA_KLDFLAGS="${EXTRA_KLDFLAGS} -Wl,--build-id" - if test x$enable_server != xno ; then - AC_MSG_WARN([Disabling server (not supported for k1om architecture).]) - enable_server='no' - fi - ;; - *) - AC_MSG_RESULT([yes, but no changes]) - ;; - esac +# +# LC_MODULE_LOADING +# +# after 2.6.28 CONFIG_KMOD is removed, and only CONFIG_MODULES remains +# so we test if request_module is implemented or not +AC_DEFUN([LC_MODULE_LOADING], [ +AC_CACHE_CHECK([if Linux kernel module loading is possible], lb_cv_module_loading, [ +LB_LINUX_TRY_MAKE([ + #include +], [ + int myretval=ENOSYS ; + return myretval; +], [ + $makerule LUSTRE_KERNEL_TEST=conftest.i +], [dnl + grep request_module build/conftest.i |dnl + grep -v `grep "int myretval=" build/conftest.i |dnl + cut -d= -f2 | cut -d" " -f1`dnl + >/dev/null dnl +], [lb_cv_module_loading="yes"], [lb_cv_module_loading="no"]) +]) +AS_IF([test "$lb_cv_module_loading" = yes], + [AC_DEFINE(HAVE_MODULE_LOADING_SUPPORT, 1, + [kernel module loading is possible])], + [AC_MSG_WARN([ + +Kernel module loading support is highly recommended. + +]) + ]) +]) + +# +# LB_PROG_LINUX +# +# linux tests +# +AC_DEFUN([LB_PROG_LINUX], [ +LB_LINUX_PATH +LB_LINUX_SYMVERFILE + +LB_CHECK_CONFIG([MODULES], [], [ + AC_MSG_ERROR([ + +module support is required to build Lustre kernel modules. +]) + ]) + +LB_CHECK_CONFIG([MODVERSIONS]) + +LB_CHECK_CONFIG([KALLSYMS], [], [ + AC_MSG_ERROR([ + +Lustre requires that CONFIG_KALLSYMS is enabled in your kernel. +]) ]) -AC_SUBST(CROSS_VARS) -AC_SUBST(CROSS_PATH) + +# 2.6.28 +LC_MODULE_LOADING ]) +# +# LB_USES_DPKG +# +# Determine if the target is a dpkg system or rpm +# +AC_DEFUN([LB_USES_DPKG], [ +AC_CACHE_CHECK([if this distro uses dpkg], lb_cv_uses_dpkg, [ +lb_cv_uses_dpkg="no" +AS_CASE([$(which dpkg 2>/dev/null)],[*/dpkg], [lb_cv_uses_dpkg="yes"]) +]) +uses_dpkg=$lb_cv_uses_dpkg +]) + +# +# LB_CHECK_EXPORT +# +# check symbol exported or not +# $1 - symbol +# $2 - file(s) for find. +# $3 - do 'yes' +# $4 - do 'no' +# +# 2.6 based kernels - put modversion info into $LINUX/Module.modvers or check +# +AC_DEFUN([LB_CHECK_EXPORT], [ +AS_VAR_PUSHDEF([lb_export], [lb_cv_export_$1])dnl +AC_CACHE_CHECK([if Linux kernel exports '$1'], lb_export, [ +AS_VAR_SET([lb_export], [no]) +AS_IF([grep -q -E '[[[:space:]]]$1[[[:space:]]]' $LINUX_OBJ/$SYMVERFILE 2>/dev/null], + [AS_VAR_SET([lb_export], [yes])], + [for file in $2; do + AS_IF([grep -q -E "EXPORT_SYMBOL.*\($1\)" "$LINUX/$file" 2>/dev/null], [ + AS_VAR_SET([lb_export], [yes]) + break + ]) + done]) +]) +AS_VAR_IF([lb_export], [yes], [$3], [$4])[]dnl +AS_VAR_POPDEF([lb_export])dnl +]) # LB_CHECK_EXPORT + +# +# LB_CHECK_CONFIG +# +# check if a given config option is defined +# $1 - CONFIG_ +# $2 - do 'yes' +# $3 - do 'no' +# +AC_DEFUN([LB_CHECK_CONFIG], [ +LB_CHECK_COMPILE([if Linux kernel was built with CONFIG_$1], +config_$1, [ + #include <$AUTOCONF_HDIR/autoconf.h> +], [ + #ifndef CONFIG_$1 + #error CONFIG_$1 not #defined + #endif +], [$2], [$3]) +]) # LB_CHECK_CONFIG + +# +# LB_CHECK_CONFIG_IM +# +# check if a given config option is builtin or as module +# $1 - CONFIG_ or CONFIG__MODULE +# $2 - do 'yes' +# $3 - do 'no' +# +AC_DEFUN([LB_CHECK_CONFIG_IM], [ +LB_CHECK_COMPILE([if Linux kernel was built with CONFIG_$1 in or as module], +config_im_$1, [ + #include <$AUTOCONF_HDIR/autoconf.h> +], [ + #if !(defined(CONFIG_$1) || defined(CONFIG_$1_MODULE)) + #error CONFIG_$1 and CONFIG_$1_MODULE not #defined + #endif +], [$2], [$3]) +]) # LB_CHECK_CONFIG_IM + +# # these are like AC_TRY_COMPILE, but try to build modules against the # kernel, inside the build directory +# +# # LB_LANG_PROGRAM(C)([PROLOGUE], [BODY]) # -------------------------------------- +# m4_define([LB_LANG_PROGRAM], [ #include +#include $1 int main (void) @@ -359,18 +526,25 @@ dnl Don't move the `;' right after for the same reason. $2 ; return 0; -}]) +}; +MODULE_LICENSE("GPL");]) # # LB_LINUX_COMPILE_IFELSE # # like AC_COMPILE_IFELSE # +# $1 - AC_LANG_SOURCE() +# $2 - make target +# $3 - check command +# $4 - do 'yes' +# $5 - do 'no' +# AC_DEFUN([LB_LINUX_COMPILE_IFELSE], -[m4_ifvaln([$1], [AC_LANG_CONFTEST([$1])])dnl +[m4_ifvaln([$1], [AC_LANG_CONFTEST([AC_LANG_SOURCE([$1])])])dnl rm -f build/conftest.o build/conftest.mod.c build/conftest.ko -SUBARCH=$(echo $target_cpu | sed -e 's/powerpc64/powerpc/' -e 's/x86_64/x86/' -e 's/i.86/x86/' -e 's/k1om/x86/') -AS_IF([AC_TRY_COMMAND(cp conftest.c build && make -d [$2] ${LD:+"LD=$LD"} CC="$CC" -f $PWD/build/Makefile LUSTRE_LINUX_CONFIG=$LINUX_CONFIG LINUXINCLUDE="$EXTRA_LNET_INCLUDE -I$LINUX/arch/$SUBARCH/include -I$LINUX/arch/$SUBARCH/include/generated -Iinclude -I$LINUX/include -Iinclude2 -I$LINUX/include/uapi -I$LINUX/include/generated -I$LINUX/arch/$SUBARCH/include/uapi -Iarch/$SUBARCH/include/generated/uapi -I$LINUX/include/uapi -Iinclude/generated/uapi -include $CONFIG_INCLUDE" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $CROSS_VARS $MODULE_TARGET=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])], +SUBARCH=$(echo $target_cpu | sed -e 's/powerpc.*/powerpc/' -e 's/ppc.*/powerpc/' -e 's/x86_64/x86/' -e 's/i.86/x86/' -e 's/k1om/x86/' -e 's/aarch64.*/arm64/' -e 's/armv7.*/arm/') +AS_IF([AC_TRY_COMMAND(cp conftest.c build && make -d [$2] LDFLAGS= ${LD:+LD="$LD"} CC="$CC" -f $PWD/build/Makefile LUSTRE_LINUX_CONFIG=$LINUX_CONFIG LINUXINCLUDE="$EXTRA_CHECK_INCLUDE -I$LINUX/arch/$SUBARCH/include -Iinclude -Iarch/$SUBARCH/include/generated -I$LINUX/include -Iinclude2 -I$LINUX/include/uapi -Iinclude/generated -I$LINUX/arch/$SUBARCH/include/uapi -Iarch/$SUBARCH/include/generated/uapi -I$LINUX/include/uapi -Iinclude/generated/uapi ${SPL_OBJ:+-include $SPL_OBJ/spl_config.h} ${ZFS_OBJ:+-include $ZFS_OBJ/zfs_config.h} ${SPL:+-I$SPL -I$SPL/include } ${ZFS:+-I$ZFS -I$ZFS/include} -include $CONFIG_INCLUDE" -o tmp_include_depends -o scripts -o include/config/MARKER -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $MODULE_TARGET=$PWD/build) >/dev/null && AC_TRY_COMMAND([$3])], [$4], [_AC_MSG_LOG_CONFTEST m4_ifvaln([$5],[$5])dnl]) @@ -378,74 +552,15 @@ rm -f build/conftest.o build/conftest.mod.c build/conftest.mod.o build/conftest. ]) # -# LB_LINUX_ARCH -# -# Determine the kernel's idea of the current architecture -# -AC_DEFUN([LB_LINUX_ARCH], - [AC_MSG_CHECKING([Linux kernel architecture]) - AS_IF([rm -f $PWD/build/arch - make -s --no-print-directory echoarch -f $PWD/build/Makefile \ - LUSTRE_LINUX_CONFIG=$LINUX_CONFIG -C $LINUX $CROSS_VARS \ - ARCHFILE=$PWD/build/arch && LINUX_ARCH=`cat $PWD/build/arch`], - [AC_MSG_RESULT([$LINUX_ARCH])], - [AC_MSG_ERROR([Could not determine the kernel architecture.])]) - rm -f build/arch]) - -# # LB_LINUX_TRY_COMPILE # # like AC_TRY_COMPILE # -AC_DEFUN([LB_LINUX_TRY_COMPILE], -[LB_LINUX_COMPILE_IFELSE( +AC_DEFUN([LB_LINUX_TRY_COMPILE], [ +LB_LINUX_COMPILE_IFELSE( [AC_LANG_SOURCE([LB_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 <$AUTOCONF_HDIR/autoconf.h> - ],[ - #ifndef CONFIG_$1 - #error CONFIG_$1 not #defined - #endif - ],[ - AC_MSG_RESULT([yes]) - $2 - ],[ - AC_MSG_RESULT([no]) - $3 - ]) -]) - -# -# LB_LINUX_CONFIG_IM -# -# check if a given config option is builtin or as module -# -AC_DEFUN([LB_LINUX_CONFIG_IM],[ - AC_MSG_CHECKING([if Linux was built with CONFIG_$1 in or as module]) - LB_LINUX_TRY_COMPILE([ - #include <$AUTOCONF_HDIR/autoconf.h> - ],[ - #if !(defined(CONFIG_$1) || defined(CONFIG_$1_MODULE)) - #error CONFIG_$1 and CONFIG_$1_MODULE not #defined - #endif - ],[ - AC_MSG_RESULT([yes]) - $2 - ],[ - AC_MSG_RESULT([no]) - $3 - ]) + [modules], [test -s build/conftest.o], + [$3], [$4]) ]) # @@ -453,235 +568,45 @@ AC_DEFUN([LB_LINUX_CONFIG_IM],[ # # like LB_LINUX_TRY_COMPILE, but with different arguments # -AC_DEFUN([LB_LINUX_TRY_MAKE], - [LB_LINUX_COMPILE_IFELSE( - [AC_LANG_SOURCE([LB_LANG_PROGRAM([[$1]], [[$2]])])], - [$3], [$4], [$5], [$6] - )] -) - -# -# LB_CONFIG_COMPAT_RDMA -# -AC_DEFUN([LB_CONFIG_COMPAT_RDMA], -[AC_MSG_CHECKING([whether to use Compat RDMA]) -# set default -AC_ARG_WITH([o2ib], - AC_HELP_STRING([--with-o2ib=path], - [build o2iblnd against path]), - [ - case $with_o2ib in - yes) O2IBPATHS="$LINUX $LINUX/drivers/infiniband" - ENABLEO2IB=2 - ;; - no) ENABLEO2IB=0 - ;; - *) O2IBPATHS=$with_o2ib - ENABLEO2IB=3 - ;; - esac - ],[ - O2IBPATHS="$LINUX $LINUX/drivers/infiniband" - ENABLEO2IB=1 - ]) -if test $ENABLEO2IB -eq 0; then - AC_MSG_RESULT([no]) -else - o2ib_found=false - for O2IBPATH in $O2IBPATHS; do - if test \( -f ${O2IBPATH}/include/rdma/rdma_cm.h -a \ - -f ${O2IBPATH}/include/rdma/ib_cm.h -a \ - -f ${O2IBPATH}/include/rdma/ib_verbs.h -a \ - -f ${O2IBPATH}/include/rdma/ib_fmr_pool.h \); then - o2ib_found=true - break - fi - done - compatrdma_found=false - if $o2ib_found; then - if test \( -f ${O2IBPATH}/include/linux/compat-2.6.h \); then - compatrdma_found=true - AC_MSG_RESULT([yes]) - AC_DEFINE(HAVE_COMPAT_RDMA, 1, [compat rdma found]) - else - AC_MSG_RESULT([no]) - fi - fi -fi -]) - -# -# LB_CONFIG_OFED_BACKPORTS -# -# include any OFED backport headers in all compile commands -# NOTE: this does only include the backport paths, not the OFED headers -# adding the OFED headers is done in the lnet portion -AC_DEFUN([LB_CONFIG_OFED_BACKPORTS], -[AC_MSG_CHECKING([whether to use any OFED backport headers]) -if test $ENABLEO2IB -eq 0; then - AC_MSG_RESULT([no]) -else - if ! $o2ib_found; then - AC_MSG_RESULT([no]) - case $ENABLEO2IB in - 1) ;; - 2) AC_MSG_ERROR([kernel OpenIB gen2 headers not present]);; - 3) AC_MSG_ERROR([bad --with-o2ib path]);; - *) AC_MSG_ERROR([internal error]);; - esac - else - if ! $compatrdma_found; then - if test -f $O2IBPATH/config.mk; then - . $O2IBPATH/config.mk - elif test -f $O2IBPATH/ofed_patch.mk; then - . $O2IBPATH/ofed_patch.mk - fi - else - case $RHEL_KERNEL_VERSION in - 2.6.32-358*) - EXTRA_LNET_INCLUDE="$EXTRA_LNET_INCLUDE -DCONFIG_COMPAT_RHEL_6_4";; - esac - fi - if test -n "$BACKPORT_INCLUDES"; then - OFED_BACKPORT_PATH="$O2IBPATH/${BACKPORT_INCLUDES/*\/kernel_addons/kernel_addons}/" - EXTRA_LNET_INCLUDE="-I$OFED_BACKPORT_PATH $EXTRA_LNET_INCLUDE" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - fi -fi -]) - -# LC_MODULE_LOADING -# after 2.6.28 CONFIG_KMOD is removed, and only CONFIG_MODULES remains -# so we test if request_module is implemented or not -AC_DEFUN([LC_MODULE_LOADING], -[AC_MSG_CHECKING([if kernel module loading is possible]) -LB_LINUX_TRY_MAKE([ - #include -],[ - int myretval=ENOSYS ; - return myretval; -],[ - $makerule LUSTRE_KERNEL_TEST=conftest.i -],[dnl - grep request_module build/conftest.i |dnl - grep -v `grep "int myretval=" build/conftest.i |dnl - cut -d= -f2 | cut -d" " -f1`dnl - >/dev/null dnl -],[ - AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_MODULE_LOADING_SUPPORT, 1, - [kernel module loading is possible]) -],[ - AC_MSG_RESULT(no) - AC_MSG_WARN([]) - AC_MSG_WARN([Kernel module loading support is highly recommended.]) - AC_MSG_WARN([]) -]) +AC_DEFUN([LB_LINUX_TRY_MAKE], [ +LB_LINUX_COMPILE_IFELSE( + [AC_LANG_SOURCE([LB_LANG_PROGRAM([[$1]], [[$2]])])], + [$3], [$4], [$5], [$6]) ]) # -# LB_PROG_LINUX -# -# linux tests -# -AC_DEFUN([LB_PROG_LINUX], -[LB_LINUX_PATH -LB_LINUX_ARCH -LB_LINUX_SYMVERFILE - - -LB_LINUX_CONFIG([MODULES],[],[ - AC_MSG_ERROR([module support is required to build Lustre kernel modules.]) -]) - -LB_LINUX_CONFIG([MODVERSIONS]) - -LB_LINUX_CONFIG([KALLSYMS],[],[ - AC_MSG_ERROR([Lustre requires that CONFIG_KALLSYMS is enabled in your kernel.]) -]) - -# 2.6.28 -LC_MODULE_LOADING - -LB_CONFIG_COMPAT_RDMA - -# it's ugly to be doing anything with OFED outside of the lnet module, but -# this has to be done here so that the backports path is set before all of -# the LN_PROG_LINUX checks are done -LB_CONFIG_OFED_BACKPORTS +# LB_CHECK_COMPILE +# $1 - checking message +# $2 - variable name +# $3 - header +# $4 - body +# $5 - do 'yes' +# $6 - do 'no' +# +AC_DEFUN([LB_CHECK_COMPILE], [ +AS_VAR_PUSHDEF([lb_compile], [lb_cv_compile_$2])dnl +AC_CACHE_CHECK([$1], lb_compile, [ + LB_LINUX_TRY_COMPILE([$3], [$4], + [AS_VAR_SET([lb_compile], [yes])], + [AS_VAR_SET([lb_compile], [no])]) ]) +AS_VAR_IF([lb_compile], [yes], [$5], [$6])[]dnl +AS_VAR_POPDEF([lb_compile])dnl +]) # LB_CHECK_COMPILE # -# LB_CHECK_SYMBOL_EXPORT -# check symbol exported or not -# $1 - symbol -# $2 - file(s) for find. -# $3 - do 'yes' -# $4 - do 'no' -# -# 2.6 based kernels - put modversion info into $LINUX/Module.modvers -# or check -AC_DEFUN([LB_CHECK_SYMBOL_EXPORT], -[AC_MSG_CHECKING([if Linux was built with symbol $1 exported]) -grep -q -E '[[[:space:]]]$1[[[:space:]]]' $LINUX/$SYMVERFILE 2>/dev/null -rc=$? -if test $rc -ne 0; then - export=0 - for file in $2; do - grep -q -E "EXPORT_SYMBOL.*\($1\)" "$LINUX/$file" 2>/dev/null - rc=$? - if test $rc -eq 0; then - export=1 - break; - fi - done - if test $export -eq 0; then - AC_MSG_RESULT([no]) - $4 - else - AC_MSG_RESULT([yes]) - $3 - fi -else - AC_MSG_RESULT([yes]) - $3 -fi -]) - +# LB_CHECK_LINUX_HEADER # # Like AC_CHECK_HEADER but checks for a kernel-space header # -m4_define([LB_CHECK_LINUX_HEADER], -[AS_VAR_PUSHDEF([ac_Header], [ac_cv_header_$1])dnl -AC_CACHE_CHECK([for $1], ac_Header, - [LB_LINUX_COMPILE_IFELSE([LB_LANG_PROGRAM([@%:@include <$1>])], - [modules], - [test -s build/conftest.o], - [AS_VAR_SET(ac_Header, [yes])], - [AS_VAR_SET(ac_Header, [no])])]) -AS_IF([test AS_VAR_GET(ac_Header) = yes], [$2], [$3])[]dnl -AS_VAR_POPDEF([ac_Header])dnl -]) - -# -# LB_USES_DPKG -# -# Determine if the target is a dpkg system or rpm -# -AC_DEFUN([LB_USES_DPKG], -[ -AC_MSG_CHECKING([if this distro uses dpkg]) -case `lsb_release -i -s 2>/dev/null` in - Ubuntu | Debian) - AC_MSG_RESULT([yes]) - uses_dpkg=yes - ;; - *) - AC_MSG_RESULT([no]) - uses_dpkg=no - ;; -esac +m4_define([LB_CHECK_LINUX_HEADER], [ +AS_VAR_PUSHDEF([lb_header], [lb_cv_header_$1])dnl +AC_CACHE_CHECK([for $1], lb_header, [ + LB_LINUX_COMPILE_IFELSE([LB_LANG_PROGRAM([@%:@include <$1>])], + [modules], [test -s build/conftest.o], + [AS_VAR_SET([lb_header], [yes])], + [AS_VAR_SET([lb_header], [no])]) ]) +AS_VAR_IF([lb_header], [yes], [$2], [$3])[]dnl +AS_VAR_POPDEF([lb_header])dnl +]) # LB_CHECK_LINUX_HEADER