Whamcloud - gitweb
b=21452 kABI tracking
authorBrian J. Murrell <brian@sun.com>
Fri, 25 Jun 2010 13:49:11 +0000 (09:49 -0400)
committerJohann Lombardi <johann@sun.com>
Fri, 25 Jun 2010 14:05:28 +0000 (16:05 +0200)
Changes required to build packages that properly interact with
the kABI tracking included in SLES and RHEL kernels:
- take local copies of the find_requires generators and make modif-
  ications to them so that they can find the kernel artifacts installed
  in our build tree
  + thusly, override the __find_requires macro in all of the RPM
    build operations

Fix package versioning of patchless packages to also include the
timestamp, just like patched packages do, for non-release builds.
Also, remove the _lustre from the kernel version in the lustre
package names for patchless packages.

Note that changes needed to enable the external dependency checker
and thus include kABI dependencies in the RPM are not included here
for RHEL5.  Once RH have updated their kABI whitelist to include the
symbols we need, the patches in bz attachments 30546-7 need to land
for RHEL5 weak modules to work and a bug needs to be filed with OFA
to land the change in bz attachment 30547.

i=wangyb
i=mjmac

build/lbuild
build/lbuild-rhel5
build/lbuild-sles
build/lbuild-sles10
lustre.spec.in

index 15b78be..32b4f5d 100755 (executable)
@@ -637,11 +637,10 @@ load_target() {
     elif ! $RELEASE; then
         # if there is no patch series, then this is not a lustre specific
         # kernel.  don't make it look like one
-        if [ -n "$SERIES" ]; then
-            #remove the @VERSION@ (lustre version)
-#            EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
+        if $PATCHLESS || [ -n "$SERIES" ]; then
+            EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
 #            EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
-            ! ( $PATCHLESS ) && EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
+            EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
         fi
     fi
     # EXTRA_VERSION=${EXTRA_VERSION//-/_}
@@ -856,6 +855,7 @@ build_lustre() {
     $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
         ${is_patchless:+--define "lustre_name lustre-client"} \
         ${lustre_tests:+--define "build_lustre_tests 0"} \
+        ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
         --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
         --define "_tmppath $TMPDIR" \
         --define "_topdir $TOPDIR" 2>&1 || \
@@ -1085,7 +1085,7 @@ build_kernel_ib() {
         rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
         SOURCE="${TOPDIR}/SPECS/ofa_kernel.spec"
         local file ed_fragment1 ed_fragment2 n=1
-        for file in ${TOPDIR}/lustre/build/patches/ofed/*; do
+        for file in $(ls ${TOPDIR}/lustre/build/patches/ofed/*); do
             ed_fragment1="$ed_fragment1
 Patch$n: ${file%%*/}"
             ed_fragment2="$ed_fragment2
@@ -1094,7 +1094,8 @@ Patch$n: ${file%%*/}"
             let n=$n+1
         done
 
-        ed $SOURCE <<EOF
+        if [ $n -gt 1 ]; then
+            ed $SOURCE <<EOF
 /^Source: /a
 $ed_fragment1
 .
@@ -1103,10 +1104,12 @@ $ed_fragment2
 .
 wq
 EOF
+        fi
     fi
 
     local linuxrelease=$(find_linux_release "$linux")
     if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
+                  ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
                   --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
                   --define "KVERSION ${linuxrelease}" \
                   --define "$K_SRC ${linux}" \
@@ -1403,6 +1406,7 @@ build_mptlinux() {
     fi
 
     if ! $RPMBUILD $targets $rpmbuildopt \
+                  ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
                   --define "_tmppath /var/tmp" \
                   --define "_topdir ${TOPDIR}" \
                   --define "kernel_obj $linux" \
@@ -1411,6 +1415,7 @@ build_mptlinux() {
     fi
     if $DO_SRC; then
         if ! $RPMBUILD -bs \
+                      ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
                       --define "_tmppath /var/tmp" \
                       --define "_topdir ${TOPDIR}" \
                       --define "kernel_obj $linux" \
@@ -1459,6 +1464,7 @@ build_rdac() {
                 ;;
     esac
     if ! $RPMBUILD $targets $rpmbuildopt --define "dist $distro" \
+                  ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
                   --define "_tmppath /var/tmp" \
                   --define "_topdir ${TOPDIR}" \
                   --define "kernel_obj $linux" \
@@ -1467,6 +1473,7 @@ build_rdac() {
     fi
     if $DO_SRC; then
         if ! $RPMBUILD -bs --define "dist $distro" \
+                      ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
                       --define "_tmppath /var/tmp" \
                       --define "_topdir ${TOPDIR}" \
                       --define "kernel_obj $linux" \
@@ -1573,7 +1580,7 @@ build_with_srpm() {
                 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
             fi
 
-            # install the -devel RPM in preparation for the lustre build
+            # install the -devel RPM in preparation for modules builds
             if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
                            "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
                 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
@@ -1591,6 +1598,38 @@ build_with_srpm() {
         fi
     fi
 
+    # ~sigh~  have to make copies of and modify some of the rpm
+    # infrastructure files so that find-requires can find our unpacked
+    # kernel-devel artifacts
+    cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
+    FIND_REQUIRES="$(pwd)/find-requires"
+    chmod 755 {symset-table,find-requires{,.ksyms}}
+    local tmp="$(pwd)"
+    tmp="${tmp//\//\\/}"
+    ed find-requires <<EOF
+1a
+set -x
+.
+/|.*find-requires.ksyms/s/|/| bash -x/
+g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
+wq
+EOF
+    ed find-requires.ksyms <<EOF
+1a
+set -x
+.
+g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
+wq
+EOF
+    ed symset-table <<EOF
+1a
+set -x
+.
+g/\(\/boot\/\)/s//$tmp\/reused\1/g
+g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
+wq
+EOF
+
     build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
         fatal 1 "error building OFED"
 
index bcf9f4a..ebd70f0 100644 (file)
@@ -7,6 +7,7 @@
 BUILD_GEN=3    # bz19975 enable the building of src.rpms by default
 
 DEVEL_KERNEL_TYPE="devel"
+RPM_HELPERS_DIR="/usr/lib/rpm/redhat"
 
 prepare_and_build_srpm() {
 
@@ -213,3 +214,20 @@ find_linux_devel_paths() {
 
     return 0
 }
+
+unpack_linux_devel_rpm-rhel5() {
+    local callers_rpm="$1"
+
+    # now just sanity check that everything needed to build properly versioned
+    # modules is in place
+    if [ ! -f usr/src/kernels/${lnxmaj}${lnxmin}-${lnxrel}-$TARGET_ARCH/Module.symvers ]; then
+        fatal 1 "cannot build kernel modules: the Kernel's Module.symvers is missing."
+    fi
+
+    if [ ! -f usr/src/kernels/${lnxmaj}${lnxmin}-${lnxrel}-$TARGET_ARCH/symsets-${lnxmaj}${lnxmin}-${lnxrel}.tar.gz ]; then
+        fatal 1 "cannot build modules: the Kernel's symsets is missing."
+    fi
+
+    return 0
+
+}
index ad774d9..1f1bb8f 100644 (file)
@@ -1,6 +1,7 @@
 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
 
 DEVEL_KERNEL_TYPE="source"
+RPM_HELPERS_DIR="/usr/lib/rpm"
 
 prepare_and_build_srpm() {
 
index 4c72777..3441a01 100644 (file)
@@ -53,10 +53,19 @@ unpack_linux_devel_rpm-sles10() {
     # get the Module.symvers out of the kenrel-flavor RPM
     local kernelrpm=${callers_rpm/-source-/-$RPMSMPTYPE-}
 
-    if ! rpm2cpio < "$kernelrpm" | cpio -id ./usr/src/linux-${lnxmaj}${lnxmin}-${lnxrel}-obj/$TARGET_ARCH/$RPMSMPTYPE/Module.symvers > /dev/null 2>&1; then
+    if ! rpm2cpio < "$kernelrpm" | cpio -id ./usr/src/linux-${lnxmaj}${lnxmin}-${lnxrel}-obj/$TARGET_ARCH/$RPMSMPTYPE/Module.symvers ./boot/sym\* > /dev/null 2>&1; then
         return 255
     fi
 
+    # now just sanity check that everything needed to build properly versioned
+    # modules is in place
+    if [ ! -f usr/src/linux-${lnxmaj}${lnxmin}-${lnxrel}-obj/$TARGET_ARCH/$RPMSMPTYPE/Module.symvers ]; then
+        fatal 1 "cannot build kernel modules: the Kernel's Module.symvers is missing."
+    fi
+    if [ ! -f boot/symsets-${lnxmaj}${lnxmin}-${lnxrel}-$RPMSMPTYPE.tar.gz ]; then
+        fatal 1 "cannot build modules: the Kernel's symsets is missing."
+    fi
+
     return 0
 
 }
index a7b0d71..d557a0d 100644 (file)
@@ -5,6 +5,26 @@
 %{!?lustre_name: %define lustre_name lustre}
 %{!?build_lustre_tests: %define build_lustre_tests 1}
 
+# in order to get kernel symset and/or kernel module dependencies into
+# the RPM, in order to support weak-modules, the internal dependency gen-
+# erator needs to be disabled
+# this is done with (reduce the double % down to a single %):
+#
+# %%global _use_internal_dependency_generator 0
+#
+# on SLES10, /usr/lib/rpm/macros already sets this, so no harm in also
+# defining it here (until Suse changes their mind)
+#
+# on RHEL5, however, we do need to explicitly disable the internal dep-
+# endency generator and allow the external one be used
+# but since RedHat's kABI is only a subset of the total kernel ABI, it
+# doesn't include all of the symbols we (or OFED for that matter) need
+# until RedHat includes all of the symbols we need in their symsets we
+# cannot support weak-modules
+# we did e-mail the maintainer of all of this stuff @redhat but got no
+# response from them
+#%%global _use_internal_dependency_generator 0
+
 %define is_client %(bash -c "if [[ %{lustre_name} = *-client ]]; then echo -n '1'; else echo -n '0'; fi")
 # for those uses that don't want the -smp/-bigsmp on the end of %kversion
 %define krequires %(bash -c "echo %{kversion} | sed -e 's/-smp$//' -e 's/-bigsmp$//' -e 's/-ppc64$//' -e 's/-default$//'")