From 549c57e77b7f3a4cae5a7381d612a499c2ca3dcc Mon Sep 17 00:00:00 2001 From: Bruno Faccini Date: Mon, 20 Oct 2014 16:00:01 +0200 Subject: [PATCH] LU-1032 build: DKMS RPM for Lustre Client modules Permit Lustre Client (only) modules DKMS RPM creation. This patch is a follow on to the first set of patches for LU-1032 that only allowed for the creation of Lustre Server (zfs only) modules DKMS RPM. It also changes original behavior by allowing to dynamically modify dkms.conf on-target. This particularly helps to change configure and list of modules to be built/installed list, like to configure with gss to build ptlrpc_gss.ko module when krb5_devel is present instead to have it been a mandatory required dependency. Also implements feature of DKMS RPM creation from Makefile (thanks to mjmac), now in 2 separate SRPM/RPM steps and for both Client and Server versions. Also use an auto-increment (Array[${#Array[@]}]=) operator in dkms.conf modules declarations to help for future changes when there will be a need to add/delete modules. Change in lustre/utils Makefile has been required to allow building of ptlrpc_gss module with --enable-gss and without the need to specify --enable-utils which was causing an unexpected zfs user-land dependency for DKMS Server build. To satisfy lustre rpm requirement of a package providing lustre-osd, provides has been added to DKMS Server RPM since it does actually generate osd-zfs module. Signed-off-by: Michael MacDonald Signed-off-by: Bruno Faccini Change-Id: I278d50307a17fe49a06392351890946b7dd3557a Reviewed-on: http://review.whamcloud.com/12347 Reviewed-by: Dmitry Eremin Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- autoMakefile.am | 33 +++++++ config/lustre-build.m4 | 4 +- contrib/lbuild/lbuild | 11 ++- lustre-dkms.spec.in | 99 +++++++++++++++++--- lustre/scripts/dkms.mkconf | 159 -------------------------------- lustre/scripts/dkms.mkconf.in | 210 ++++++++++++++++++++++++++++++++++++++++++ lustre/utils/Makefile.am | 9 +- 7 files changed, 345 insertions(+), 180 deletions(-) delete mode 100755 lustre/scripts/dkms.mkconf create mode 100644 lustre/scripts/dkms.mkconf.in diff --git a/autoMakefile.am b/autoMakefile.am index 689bee7..effac1e 100644 --- a/autoMakefile.am +++ b/autoMakefile.am @@ -119,6 +119,39 @@ rpm-local: $(MKDIR_P) $(rpmbuilddir)/SPECS && \ $(MKDIR_P) $(rpmbuilddir)/SOURCES) +if SERVER +DKMS_PACKAGE=$(PACKAGE) +DKMS_SERVER=--with servers +else +DKMS_PACKAGE=$(PACKAGE)-client +DKMS_SERVER=--without servers +endif + +# Only zfs Lustre DKMS Server is supported, so previous configure command +# must use related parameters for success. +dkms-srpm: $(PACKAGE)-dkms.spec dist Makefile + rpmbuilddir=`mktemp -t -d rpmbuild-@PACKAGE@-$$USER-XXXXXXXX`; \ + $(MAKE) $(AM_MAKEFLAGS) \ + rpmbuilddir="$$rpmbuilddir" rpm-local || exit 1; \ + $(RPMBUILD) \ + --define "_tmppath $$rpmbuilddir/TMP" \ + --define "_topdir $$rpmbuilddir" \ + --define "_sourcedir $(top_srcdir)" \ + $(DKMS_SERVER) \ + --bs $(PACKAGE)-dkms.spec || exit 1; \ + cp $$rpmbuilddir/SRPMS/*.src.rpm $(top_srcdir) || exit 1; \ + rm -rf $$rpmbuilddir + +dkms-rpm: dkms-srpm + rpmbuilddir=`mktemp -t -d rpmbuild-@PACKAGE@-$$USER-XXXXXXXX`; \ + $(RPMBUILD) \ + --define "_tmppath $$rpmbuilddir/TMP" \ + --define "_topdir $$rpmbuilddir" \ + @RPMBUILD_BINARY_ARGS@ \ + --rebuild $(DKMS_PACKAGE)-dkms-*.src.rpm || exit 1; \ + cp $$rpmbuilddir/RPMS/*/*.rpm $(top_srcdir) || exit 1; \ + rm -rf $$rpmbuilddir + rpms: srpm rpmbuilddir=`mktemp -t -d rpmbuild-@PACKAGE@-$$USER-XXXXXXXX`; \ $(MAKE) $(AM_MAKEFLAGS) \ diff --git a/config/lustre-build.m4 b/config/lustre-build.m4 index 4957050..11ca27a 100644 --- a/config/lustre-build.m4 +++ b/config/lustre-build.m4 @@ -449,6 +449,7 @@ AC_DEFUN([LB_CONFIG_FILES], [ [Rules:build/Rules.in] AC_PACKAGE_TARNAME[.spec] AC_PACKAGE_TARNAME[-dkms.spec] + lustre/scripts/dkms.mkconf contrib/Makefile contrib/lbuild/Makefile contrib/scripts/Makefile @@ -460,7 +461,8 @@ AC_DEFUN([LB_CONFIG_FILES], [ lustre-iokit/sgpdd-survey/Makefile lustre-iokit/mds-survey/Makefile lustre-iokit/ior-survey/Makefile - lustre-iokit/stats-collect/Makefile + lustre-iokit/stats-collect/Makefile, + [chmod +x lustre/scripts/dkms.mkconf] ) ]) diff --git a/contrib/lbuild/lbuild b/contrib/lbuild/lbuild index 07494c5..09a634c 100755 --- a/contrib/lbuild/lbuild +++ b/contrib/lbuild/lbuild @@ -1020,13 +1020,20 @@ build_lustre() { } +# Only zfs Lustre DKMS Server is supported build_lustre_dkms() { [ -n "$MPSS_VERSION" ] && return 0 local ver=$(eval echo $(awk '/LUSTRE_VERSION_STRING/ {print $3}' lustre/include/lustre_ver.h)) echo "Building Lustre DKMS RPMs for: $BUILD_ARCHS..." ./configure --enable-dist || return 255 - $RPMBUILD --define="_topdir $TOPDIR" -bs lustre-dkms.spec || return 255 - $RPMBUILD --rebuild --define="_topdir $TOPDIR" $TOPDIR/SRPMS/lustre-dkms-$ver-*.src.rpm || return 255 + + if $PATCHLESS; then + $RPMBUILD --define="_topdir $TOPDIR" --without servers -bs lustre-dkms.spec || return 255 + $RPMBUILD --rebuild --define="_topdir $TOPDIR" --without servers $TOPDIR/SRPMS/lustre-client-dkms-$ver-*.src.rpm || return 255 + else + $RPMBUILD --define="_topdir $TOPDIR" -bs lustre-dkms.spec || return 255 + $RPMBUILD --rebuild --define="_topdir $TOPDIR" $TOPDIR/SRPMS/lustre-dkms-$ver-*.src.rpm || return 255 + fi return 0 } diff --git a/lustre-dkms.spec.in b/lustre-dkms.spec.in index 1197438..788b74a 100644 --- a/lustre-dkms.spec.in +++ b/lustre-dkms.spec.in @@ -1,6 +1,13 @@ -%define module @PACKAGE@ +%bcond_without servers + +# Set the package name prefix +%if %{with servers} + %define module @PACKAGE@ +%else + %define module @PACKAGE@-client +%endif + %define buildid 1 -%define mkconf lustre/scripts/dkms.mkconf Name: %{module}-dkms @@ -11,7 +18,7 @@ Summary: Kernel module(s) (dkms) Group: System Environment/Kernel License: GPLv2+ URL: http://lustre.opensfs.org/ -Source0: %{module}-%{version}.tar.gz +Source0: @PACKAGE@-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildArch: noarch @@ -19,27 +26,84 @@ BuildArch: noarch # (ie, "BUILD_DEPENDS[#]="), and have latest DKMS fixes integrated # for bugs that prevented our module to build/install. Requires: dkms >= 2.2.0.3-28.git.7c3e7c5 +%if %{with servers} +# Only zfs Lustre DKMS Server is supported Requires: spl-dkms >= 0.6.1 Requires: zfs-dkms >= 0.6.1 +Requires: %{module}-osd-zfs-mount +%endif Requires: gcc, make, perl -Requires: python-docutils Requires: kernel-devel -Requires: @PACKAGE@-osd-zfs-mount -Provides: @PACKAGE@-kmod = %{version} -Provides: @PACKAGE@-modules = %{version} -Provides: @PACKAGE@-osd-zfs -Conflicts: @PACKAGE@-modules -Conflicts: @PACKAGE@-client-modules -Conflicts: @PACKAGE@-osd-zfs +Provides: %{module}-kmod = %{version} +Provides: %{module}-modules = %{version} +%if %{with servers} +# Only zfs Lustre DKMS Server is supported +Provides: %{module}-osd-zfs = %{version} +Provides: %{module}-osd +%endif %description This package contains the dkms Lustre kernel modules. %prep -%setup -q -n %{module}-%{version} +%setup -q -n @PACKAGE@-%{version} %build -%{mkconf} -n %{module} -v %{version} -f dkms.conf +cat << EOF > dkms.conf +# Embryonic lustre-dkms dkms.conf to allow for on-target accurate and full +# version re-create during first dkms add stage. +PACKAGE_NAME=%{module} +PACKAGE_VERSION=%{version} +POST_ADD="lustre-dkms_post-add.sh \$module \$module_version \$kernelver \ + \$kernel_source_dir \$arch \$source_tree \$dkms_tree" +# at least one DEST_MODULE_LOCATION[] element, along with an install +# path made of either "extra" or "updates" subdir, are required during +# dkms.conf validity check of "dkms add" step. +DEST_MODULE_LOCATION[${#DEST_MODULE_LOCATION[@]}]="/extra/lnet/" +EOF + +cat << EOF > lustre-dkms_post-add.sh +#!/bin/bash +# \$1 : \$module +# \$2 : \$module_version +# \$3 : \$kernelver +# \$4 : \$kernel_source_dir +# \$5 : \$arch +# \$6 : \$source_tree +# \$7 : \$dkms_tree + +if [ \$1 = "lustre-client" ] ; then + SERVER="--disable-server" +else + SPL_VERSION=\$(dkms status -m spl -k \$3/\$5 | awk -F', ' '{print \$2; exit 0}' | sed 's/: added\\\$//') + ZFS_VERSION=\$(dkms status -m zfs -k \$3/\$5 | awk -F', ' '{print \$2; exit 0}' | sed 's/: added\\\$//') + + SERVER="--enable-server --disable-ldiskfs --with-linux=\$4 --with-linux-obj=\$4 \\ + --with-spl=\$6/spl-\${SPL_VERSION} \\ + --with-spl-obj=\$7/spl/\${SPL_VERSION}/\$3/\$5 \\ + --with-zfs=\$6/zfs-\${ZFS_VERSION} \\ + --with-zfs-obj=\$7/zfs/\${ZFS_VERSION}/\$3/\$5" +fi + +rpm -qa | grep krb5-devel >/dev/null +if [ \$? == 0 ] ; then + GSS="--enable-gss" +else + GSS="--disable-gss" +fi + +# run a configure pass to clean "--enable-dist" only effect and also to +# ensure local/on-target environment to be taken into account +./configure --enable-modules --disable-iokit --disable-snmp --disable-doc \\ + --disable-utils --disable-tests --disable-maintainer-mode \\ + \$GSS \$SERVER \\ + --disable-manpages --disable-dlc +# re-create dkms.conf based on this +lustre/scripts/dkms.mkconf -n \$1 -v \$2 -f ./dkms.conf +EOF + +chmod 755 lustre-dkms_post-add.sh + sed -i 's/BUILDID[[:print:]]*/BUILDID = %{buildid}/' META sed -i 's/PRISTINE[[:print:]]*/PRISTINE = 1/' META cp META ldiskfs/META @@ -49,7 +113,11 @@ if [ "$RPM_BUILD_ROOT" != "/" ]; then rm -rf $RPM_BUILD_ROOT fi mkdir -p $RPM_BUILD_ROOT/usr/src/ -cp -rfp ${RPM_BUILD_DIR}/%{module}-%{version} $RPM_BUILD_ROOT/usr/src/ +cp -rfp ${RPM_BUILD_DIR}/@PACKAGE@-%{version} $RPM_BUILD_ROOT/usr/src/ +%if %{without servers} +# To have the directory reflect the DKMS RPM name! +mv $RPM_BUILD_ROOT/usr/src/@PACKAGE@-%{version} $RPM_BUILD_ROOT/usr/src/%{module}-%{version} +%endif %clean if [ "$RPM_BUILD_ROOT" != "/" ]; then @@ -79,5 +147,8 @@ dkms remove -m %{module} -v %{version} --all --rpm_safe_upgrade exit 0 %changelog +* Wed Oct 7 2015 Bruno Faccini + - adapted for Lustre Client DKMS creation + - allow for on-target reconfig to prevent static deps requires * Fri Apr 8 2013 Brian Behlendorf - 2.3.63-1 - First DKMS packages. diff --git a/lustre/scripts/dkms.mkconf b/lustre/scripts/dkms.mkconf deleted file mode 100755 index 8b3e2a4..0000000 --- a/lustre/scripts/dkms.mkconf +++ /dev/null @@ -1,159 +0,0 @@ -#!/bin/sh - -PROG=$0 - -pkgcfg=/etc/sysconfig/lustre - -while getopts "n:v:c:f:" opt; do - case $opt in - n) pkgname=$OPTARG ;; - v) pkgver=$OPTARG ;; - c) pkgcfg=$OPTARG ;; - f) filename=$OPTARG ;; - esac -done - -if [ -z "${pkgname}" -o -z "${pkgver}" -o -z "${filename}" ]; then - echo "Usage: $PROG -n -v -c -f " - exit 1 -fi - -cat >${filename} < -v -c -f " + exit 1 +fi + +rpm -qa | grep krb5-devel >/dev/null +if [ $? == 0 ] ; then + GSS="--enable-gss" +else + GSS="--disable-gss" +fi + +cat >${filename} <>${filename} <>${filename} <>${filename} <>${filename} <>${filename} <>${filename} <>${filename} <>${filename} <>${filename} <