3 # vim:expandtab:shiftwidth=4:softtabstop=4:tabstop=4:
5 # this is an alternative FD for stdout, to be used especially when we are
6 # taking stdout from a function as it's return value. i.e. foo=$(bar)
7 # this is a workaround until a version of bash where we can put xtrace
13 if [[ $SHELLOPTS = *xtrace* ]]; then
18 # Assume that lbuild's support files can be found in the same
19 # canonicalized path as this very script.
20 LBUILD_SCRIPT=$(readlink -f ${0})
21 LBUILD_DIR=${LBUILD_DIR:-$(dirname ${LBUILD_SCRIPT})}
23 # include the exit_traps library
24 . ${LBUILD_DIR}/exit_traps.sh
25 . ${LBUILD_DIR}/funcs.sh
27 # our children should die when we do
28 push_exit_trap "kill -INT -$$ || true" kill_children
30 # increment this if you have made a change that should force a new kernel
33 #BUILD_GEN=2 # bz19952: remove -lustre tag from kernel RPM names
34 #BUILD_GEN=3 # bz19975: enable the building of src.rpms by default
35 #BUILD_GEN=4 # bz22281: use the git hash in the kernel extra version
36 #BUILD_GEN=5 # TT-107: don't cache the BUILD dir
37 BUILD_GEN=6 # TT-1092: don't cache the BUILD dir, to rebuild external OFED
45 # XXX - some recent hacking has pretty much neutered this option.
46 # search through this file for "-bb" and see how many places
47 # simply don't account for this option
52 TARGET_ARCH="$(uname -m)"
53 # change default behavior to only build for the current arch
54 TARGET_ARCHS="$TARGET_ARCH"
55 TARGET_ARCHS_ALL="$TARGET_ARCH"
56 [ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
61 TMPDIR=${TMPDIR:-"/var/tmp"}
63 # this is a dir to try reuse old kernel RPMs in (although, it seems to be
64 # unused in any real manner
66 # this is the dir that should be used to store reuse products
68 # should cached products be used or force rebuilding?
70 # what does this do exactly? does it imply no kernel build?
75 SMPTYPES="smp bigsmp default ''"
81 # default to not adding -lustre- into the kernel RPM package names
82 KERNEL_LUSTRE_NAMING=false
83 # default not use kabi check.
101 # not in the target file any more
104 # build the lustre-tests rpm?
113 # Readlink is not present on some older distributions: emulate it.
117 if [ -L "$path" ]; then
118 ll="$(LC_ALL=C ls -l "$path" 2> /dev/null)" &&
127 Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
129 --external-patches=EXTERNAL_PATCHES
130 Directory similar to lustre/lustre/kernel_patches/ that lbuild should
131 look for seres and config files in before looking in the lustre
134 --extraversion=EXTRAVERSION
135 Text to use for the rpm release and kernel extraversion.
137 --timestamp=TIMESTAMP
138 Date of building lustre in format YYYYMMDDhhmmss
141 Try to reuse old kernel RPMs from DIR
144 Try to reuse old kernel builds from DIR
147 Path to distro kernel RPM collection
153 Do not build RPMs (compile only mode)
156 Build lustre client only
159 Which distro using. Autodetect by default
161 --kerneldir=KERNELDIR
162 Directory containing Linux source tarballs referenced by target
165 --kerneltree=KERNELTREE
166 Directory containing dirs with Linux source tarballs referenced by target
167 files. Dir names in format kernel version ('2.6.9', etc.)
169 --linux=LINUX --with-linux=LINUX
170 Directory of Linux kernel sources. When this option is used, only
171 Lustre modules and userspace are built.
174 Path to an existing lustre source tarball to use.
177 Do not try to download a kernel from downloads.lustre.org
180 Do not build a .src.rpm, a full kernel patch, or a patched kernel
184 Build with ldiskfs support. (Deprecated, always true)
187 Do not build lustre-iokit RPM. Now true by default
193 Specifies that the files generated do not include timestamps, and
194 that this is an official release.
197 Build a .src.rpm, a full kernel patch, and a patched kernel tarball.
200 Directory used to stage packages for release. RPMs will be placed
201 more or less in DIR/<target>-<arch>, and the tarball will be
205 The name of the target to build. The available targets are listed
208 --target-archs=TARGET_ARCHS
209 A (space delimited) list of architectures to build. By default,
210 all of the archs supported by the TARGET will be built, in
211 addition to a .src.rpm. This option can limit those, for machines
212 that can only build certain archs or if you only want a certain
213 arch built (for testing, or a one-off kernel).
215 Also note that by using a non-"base" arch (eg, i386) only kernels
216 will be built - there will be no lustre-lite-utils package.
219 Builds a Xen domX kernel.
222 Sets a variable to a given value.
231 # canonicalize a relative path to a file
235 if [ ! -f "$PATH" ]; then
239 local FILE=${PATH##*/}
242 echo $(canon_path "$DIR")/$FILE
246 # canonicalize a relative path to a dir
250 if [ ! -d "$PATH" ]; then
254 pushd "$PATH" >/dev/null || return 1
264 if [ -z "$LUSTRE" -o ! -r "$LUSTRE" ]; then
265 usage 1 "Could not find Lustre source tarball '$LUSTRE'."
268 if [ -z "$DISTRO" ] ; then
269 DISTRO=$(autodetect_distro)
270 # remove minor version only for rhel and oel
271 [[ $DISTRO =~ "el-" ]] && DISTRO=${DISTRO%%.*}
276 [ -z "$TARGET" ] && TARGET=$(autodetect_target "$DISTRO")
278 if [ -z "$LINUX" ]; then
279 [ "$KERNELDIR" -o "$KERNELTREE" ] || \
280 usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
282 [ -d "$KERNELDIR" -o -d "$KERNELTREE" ] || \
283 usage 1 "$KERNELDIR and $KERNELTREE are not a directory."
285 # TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
286 # [ -r "$TARGET_FILE" ] || \
287 # usage 1 "Target '$TARGET' was not found."
292 CANONICAL_TARGET="rhel6"
295 CANONICAL_TARGET="rhel5"
298 CANONICAL_TARGET="rhel-2.6"
301 CANONICAL_TARGET="sles-2.6"
304 CANONICAL_TARGET="sles10-2.6"
306 2.6-sles11 | 3.0-sles11)
307 CANONICAL_TARGET="sles11"
310 CANONICAL_TARGET="oel5"
313 CANONICAL_TARGET="hp-pnnl-2.4"
321 CANONICAL_TARGET="$TARGET"
325 local timestampnodig=$(echo $TIMESTAMP | sed -e s/[0-9]*//g)
326 [ "$timestampnodig" = "" ] || TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
327 local timestamplength="${#TIMESTAMP}"
328 if [ $timestamplength -eq 12 ]; then
329 TIMESTAMP="${TIMESTAMP}00"
330 elif [ $timestamplength -ne 14 ]; then
331 TIMESTAMP=$(date -d "$DATE" "+%Y%m%d%H%M%S")
334 RPMBUILD=$(which rpmbuild 2>/dev/null | head -1)
335 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
336 RPMBUILD=$(which rpm 2>/dev/null | head -1)
337 if [ ! "$RPMBUILD" -o "$RPMBUILD" == "" ]; then
338 usage 1 "Could not find binary for making rpms (tried rpmbuild and rpm)."
342 if [ -n "$CCACHE" ]; then
343 which "$DISTCC" &>/dev/null && export DISTCC RPM_BUILD_NCPUS
345 if which "$CCACHE" &>/dev/null; then
346 local ccache=$(which "$CCACHE")
347 local bindir="$TOPDIR/bin"
349 if [ ! -d $bindir ]; then
350 mkdir -p $bindir || fatal 1 "error trying to create $bindir"
352 rm ${bindir}/* > /dev/null 2>&1 || true
354 ln -s "$ccache" ${bindir}/ccache
355 ln -s "$ccache" ${bindir}/cc
356 ln -s "$ccache" ${bindir}/$CC
357 export PATH=$bindir:$PATH
358 export CCACHE && export CC="ccache $CC"
359 # zero the cache so we can see how effective we are being with it
363 # get some ccache stats when we are done
364 push_exit_trap '[ -n "$CCACHE" ] && ccache -s' "ccache_summary"
365 # should remove the ccache trap if lbuild is interrupted
366 trap 'echo "Received an INT TERM or HUP signal, terminating."; delete_exit_trap "ccache_summary"; exit 1' INT TERM HUP
374 # compare two versions $1 and $2. if $1 < $2, return 0 otherwise return 1.
376 [[ $1 == $2 ]] && return 1
378 local i val1=($1) val2=($2)
380 # padding zero to val1 if it needs
381 for ((i=${#val1[@]}; i<${#val2[@]}; i++)); do
384 for ((i=0; i<${#val1[@]}; i++)); do
385 [[ -z ${val2[i]} ]] && return 1
387 if [[ ${val1[i]} < ${val2[i]} ]]; then
389 elif [[ ${val1[i]} > ${val2[i]} ]]; then
397 echo $(echo "$*" | xargs -n 1 | sort -u)
405 if [ -z "$target" ]; then
406 fatal 1 "fetch_url() called without a target to fetch to"
409 if [ -d $target ]; then
410 target+="/${url##*/}"
414 if which wget >/dev/null 2>&1; then
415 if ! wget -nv "$url" -O "$target"; then
418 elif which curl >/dev/null 2>&1; then
419 if ! curl -n -L -s -o "$target" "$url"; then
423 fatal 1 "Could not find either wget or curl to fetch URLs."
433 local force="${3:-false}"
435 if $force || [ ! -r "$KERNELDIR/$srpm" ] ||
436 [ ! -s "$KERNELDIR/$srpm" ]; then
438 local location="http://downloads.lustre.org/public/kernels/$target/old"
439 # get the location from a distro specific method if it exists
440 if type -p kernel_srpm_location; then
441 location=$(kernel_srpm_location)
443 echo "Downloading $location/$srpm..."
444 if ! fetch_url "$location/$srpm" "$KERNELDIR/$srpm" 2>&1 ||
445 [ ! -s "$KERNELDIR/$srpm" ]; then
446 rm -f $KERNELDIR/$srpm
447 # punt to a distro specific method if it exists
448 if ! type -p download_srpm-$DISTRO; then
449 fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
451 if ! download_srpm-$DISTRO "$target" "$srpm" "$force"; then
452 fatal 1 "Could not download target $target's kernel SRPM $srpm using download_srpm-$DISTRO."
457 fatal 1 "$srpm not found in directory $KERNELDIR."
468 local file=${from##*/}
474 local semaphore="$to-downloading"
477 if [ ! -f $semaphore ]; then
481 # make sure the download has not been aborted
482 local now=$(date +%s)
483 local file_mtime=$(stat -c %Y "$to")
484 local staleness=$((now - file_mtime))
485 # let's assume an active download will write at least once a minute
486 if [ $staleness -gt 60 ]; then
494 # if the semaphore file exists, the file is either still downloading
495 # or a download was aborted and we cannot trust the target file
496 if [ -f $semaphore ]; then
500 if ! is_downloading && [ -r "$to" ] && [ -s "$to" ]; then
507 if $force || ! is_downloaded; then
508 if is_downloading; then
509 echo "Somebody else is downloading $from..."
510 while is_downloading; do
511 echo "Waiting for $to to finish downloading"
514 if is_downloaded; then
517 echo "The download we were waiting for seems to have been aborted"
523 echo "Downloading $from..."
524 # flag others so they don't try to download also
525 push_exit_trap "rm -f $to $semaphore" "download"
527 if ! fetch_url "$from" "$to" || [ ! -s "$to" ]; then
528 # the trap will remove the files via the fatal below
529 fatal 1 "Could not download ${to##*/} from ${from%/*}/."
532 delete_exit_trap "download"
534 fatal 1 "${to##*/} not found in directory ${to%/*}."
543 local force="${1:-false}"
545 if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
549 local OFED_BASE_VERSION=$OFED_VERSION
550 if [[ $OFED_VERSION = *.*.*.* ]]; then
551 OFED_BASE_VERSION=${OFED_VERSION%.*}
554 local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_BASE_VERSION}/"
556 if [[ $OFED_VERSION = *-[rR][cC][0-9] ]]; then
558 Mmv=${OFED_VERSION%%-[rR][cC][0-9]}
559 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}/"
562 if [[ $OFED_VERSION = daily-* ]]; then
564 OFED_VERSION=${OFED_VERSION/daily-/}
565 Mmv=${OFED_VERSION%%-*}
566 daily=${OFED_VERSION##$Mmv-}
567 location="http://www.openfabrics.org/downloads/OFED/ofed-${Mmv}-daily/"
568 # find the filename for the version for the date specified
569 OFED_VERSION=$(curl -s "$location" | sed -nre "/${daily}-/s/.*href=\"OFED-(${Mmv//./\\.}-${daily}-[0-9]{4,4}).tgz.*$/\1/p" | tail -1)
570 if [ -z "$OFED_VERSION" ]; then
571 fatal 1 "Could not determine the filename of the OFED snapshot for ${daily}"
575 local file="OFED-${OFED_VERSION}.tgz"
576 download_file "$location/$file" "$KERNELTREE" "$force"
585 [ -r "$file" ] || fatal 1 "Could not find MPSS info file"
587 # convert to MPSS distro naming
588 distro=${distro/sles/suse}
589 distro_name=${distro%%-*}
591 # extract links from MPSS info file
592 local urls=$(cat "$file" | \
593 tr -d '\t\r\n' | sed -e 's?\(</[a-zA-Z]*>\)?\1\n?g' | \
594 grep '.intel.com/' | \
595 sed -e 's/^.*[hH][rR][eE][fF]="\([^>"]\+\)".*$/\1/g' | \
602 # Try to match with MPSS 3.x or 3.x.x distro package
603 if [[ $url =~ mpss-[0-9].[0-9](.[0-9]*)?-$distro.tar ]]; then
605 ver3=${ver3%%-$distro.tar}
606 # Try to match with MPSS 3.x or 3.x.x source package
607 elif [[ $url =~ mpss-src-[0-9].[0-9](.[0-9]*)?.tar ]]; then
608 ver3=${url##*mpss-src-}
610 # Try to match with MPSS 3.x or 3.x.x cross compiler package
611 elif [[ $url =~ mpss-[0-9].[0-9](.[0-9]*)?-k1om.tar ]]; then
613 ver3=${ver3%%-k1om.tar}
614 # Try to match with MPSS 2.1.x source package
615 elif [[ $url =~ _src-[0-9].[0-9].[0-9]*-[0-9]*_$distro_name.tar ]]; then
617 ver2=${ver2%%_$distro_name.tar}
620 if [ -n "$ver3" ]; then
621 # Check for MPSS 3.x or MPSS 3.x.x
622 if [[ $ver3 =~ [0-9].[0-9].[0-9]* ]]; then
627 if [ -z "$build" ]; then
629 elif [ "$build" = "$ver3" ]; then
632 elif [ -n "$ver2" ]; then
633 if [ -z "$build" ]; then
635 elif [ "$build" = "$ver2" ]; then
642 if [ -z "$build" ]; then
643 # return a last version of MPSS
644 if [ -n "$res3" ]; then
649 elif [ "${build%%.*}" = "3" ]; then
650 local ver=${build%%-*}
651 local bid=${build##*-}
652 if [ $bid -eq 0 ]; then
653 # return URLs from MPSS info file
656 # Check for MPSS 3.x or MPSS 3.x.x
657 if [ ${ver##*.} -eq 0 ]; then
660 # return URLs from internal site with MPSS builds
662 echo "${MPSS_BUILDS:-"http://mic-bld.pdx.intel.com/release"}/$ver/$bid/release/knightscorner/package/mpss-src-$ver.tar"
664 echo "${MPSS_BUILDS:-"http://mic-bld.pdx.intel.com/release"}/$ver/$bid/release/knightscorner/package/mpss-$ver-k1om.tar"
666 echo "${MPSS_BUILDS:-"http://mic-bld.pdx.intel.com/release"}/$ver/$bid/release/knightscorner/package/mpss-$ver-$distro.tar"
669 # return URLs from MPSS info file
674 # Get public information about last releases of
675 # Intel Manycore Platform Software Stack (MPSS)
676 download_mpss_info() {
678 local force="${2:-true}"
679 local url=${MPSS_URL:-"http://software.intel.com/en-us/articles/intel-manycore-platform-software-stack-mpss"}
681 download_file "$url" "$file" "$force"
686 local force="${2:-false}"
687 local urls=$(parse_mpss_info "$file" ${MPSS_VERSION} ${MPSS_DISTRO})
689 [ -z "$urls" ] && fatal 1 "Could not determine the URLs of MPSS $MPSS_VERSION"
691 # force re-download if build number is zero
692 [[ $MPSS_VERSION = [0-9].[0-9].[0-9]*-0 ]] && force=true
697 file="$KERNELTREE/mpss_src-${MPSS_VERSION}-${MPSS_DISTRO}-part$i.tar"
698 download_file "$url" "$file" "$force"
705 EXTRA_VERSION_save="$EXTRA_VERSION"
706 for patchesdir in "$EXTERNAL_PATCHES" \
707 "$TOPDIR/lustre/lustre/kernel_patches"; do
708 TARGET_FILE="$patchesdir/targets/$TARGET.target"
709 [ -r "$TARGET_FILE" ] && break
711 [ -r "$TARGET_FILE" ] || fatal 1 "Target $TARGET was not found."
713 echo "Loading target config file $TARGET.target..."
715 # if the caller specified an OFED_VERSION it should override whatever
716 # the target file specifies
717 local env_OFED_VERSION="$OFED_VERSION"
721 if [ -n "$env_OFED_VERSION" ]; then
722 OFED_VERSION="$env_OFED_VERSION"
725 # doesn't make any sense to build OFED for xen domX's
730 # XXX - set_rpm_smp_type is an ugly undeterministic hack. it needs to
731 # go away and the target just specify the $RPMSMPTYPE
732 [ -z "$RPMSMPTYPE" ] && set_rpm_smp_type
734 # CC might have been overwriten in TARGET_FILE
735 if [[ $CC != ccache\ * ]] && which "$CCACHE" &>/dev/null; then
736 export CCACHE && export CC="ccache $CC"
739 if [ ! "$KERNELTREE" = "" ] && [ -d "$KERNELTREE" ]; then
740 KERNELDIR="$KERNELTREE/${lnxmaj}"
741 [ -d "$KERNELDIR" ] || mkdir "$KERNELDIR"
744 # verify the series is available
745 if [ "$SERIES" ]; then
746 for series in $SERIES; do
747 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
748 [ -r "$patchesdir/series/$series" ] && continue 2
750 fatal 1 "Target $TARGET's series $SERIES could not be found.\nSearched:\n\t$EXTERNAL_PATCHES/series\n\t$TOPDIR/lustre/lustre/kernel_patches/series."
754 # set the location of the .config file
760 if [ -f $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET-$TARGET_ARCH.config ]; then
761 CONFIG_FILE="$TOPDIR/lustre/lustre/kernel_patches/kernel_configs/kernel-$lnxmaj-$TARGET$XENPOSTFIX-$TARGET_ARCH.config"
764 local lnxrelnew=${lnxrel//-/_}
766 # remember the EXTRA_VERSION before we diddle it here
767 # XXX - we really should not diddle with any values read in from the
768 # target file. if we want to modify a value, we should create
770 PRISTINE_EXTRA_VERSION=$EXTRA_VERSION
772 if ! $PATCHLESS && [ ! -f "$CONFIG_FILE" ]; then
773 fatal 1 "Config file for target $TARGET missing from $TOPDIR/lustre/lustre/kernel_patches/kernel_configs/."
776 if [ "$EXTRA_VERSION_save" ]; then
777 EXTRA_VERSION="$EXTRA_VERSION_save"
778 elif ! $RELEASE; then
779 # if there is no patch series, then this is not a lustre specific
780 # kernel. don't make it look like one
781 if $PATCHLESS || [ -n "$SERIES" ]; then
782 EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
783 if ! $PATCHLESS && [ -n "$BUILDID" ]; then
784 EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
788 # EXTRA_VERSION=${EXTRA_VERSION//-/_}
790 ALL_ARCHS="$BASE_ARCHS $BIGMEM_ARCHS $BOOT_ARCHS $JENSEN_ARCHS $SMP_ARCHS $BIGSMP_ARCHS $PSERIES64_ARCHS $UP_ARCHS"
793 for arch in $(uniqify "$ALL_ARCHS"); do
794 if [ -z "$TARGET_ARCHS" ] ||
795 [[ \ $TARGET_ARCHS\ = *\ $arch\ * ]]; then
796 BUILD_ARCHS="$BUILD_ARCHS $arch"
799 [ "$BUILD_ARCHS" ] || usage 1 "No available target archs to build."
800 echo "Building for: $BUILD_ARCHS"
808 fatal 1 "tarflags(): File name argument missing."
820 fatal 1 "tarflags(): Unrecognized tar extension in file: $1"
829 local extractfile="$@"
831 echo "Untarring ${tarfile##*/}..."
832 tar $(tarflags "$tarfile") "$tarfile" $extractfile
838 if ! untar "$KERNELTREE/OFED-${OFED_VERSION}.tgz"; then
841 [ -d OFED ] || ln -sf OFED-[0-9].[0-9]* OFED
847 untar "$LUSTRE" || fatal 1 "Error unpacking Lustre tarball"
848 [ -d lustre ] || ln -sf lustre-[0-9].[0-9]* lustre
854 [ -d mpss ] && return 0
856 if [ "${MPSS_VERSION%%.*}" = "3" ]; then
857 local ver=${MPSS_VERSION%%-*}
860 # Check for MPSS 3.x or MPSS 3.x.x
861 if [ ${ver##*.} -eq 0 ]; then
864 for i in $(seq 0 9); do
865 file="$KERNELTREE/mpss_src-${MPSS_VERSION}-${MPSS_DISTRO}-part$i.tar"
866 if [ -r "$file" ]; then
868 "mpss-$ver/*/linux-*.tar.bz2" \
869 "mpss-$ver/*/kernel-dev-*.rpm" \
870 "mpss-$ver/*/ofed-driver-*-devel-*.rpm"
873 # Extract kernel configs
874 file=$(find mpss-$ver -type f -path "*/kernel-dev-*.rpm")
875 if ! rpm2cpio "$file" | cpio -idm; then
876 echo "Error extracting MPSS kernel configs"
879 # Unpack kernel sources
880 file=$(find mpss-$ver -type f -path "*/linux-*.tar.bz2")
881 if ! untar "$file"; then
882 echo "Error unpacking MPSS kernel sources"
885 # Extract OFED headers
886 file=$(find mpss-$ver -type f -path "*/ofed-driver-*-devel-*.rpm")
887 if ! rpm2cpio "$file" | cpio -idm; then
888 echo "Error extracting MPSS OFED headers"
891 # Remove unpacked archives to save space
893 # Make link to MPSS kernel sources
896 local dir="mpss-${MPSS_VERSION}-${MPSS_DISTRO%%-*}"
898 mkdir $dir || return 255
899 pushd $dir >/dev/null || return 255
900 if ! untar "$KERNELTREE/mpss_src-${MPSS_VERSION}-${MPSS_DISTRO}-part0.tar" "*/gpl/*full_src*"; then
903 echo "Error unpacking MPSS tarball 1"
906 local file=$(find . -type f -path "*/gpl/*full_src*")
907 if ! untar "$file"; then
910 echo "Error unpacking MPSS tarball 2"
921 local do_patch=${1:-true}
923 FULL_PATCH="$PWD/lustre-kernel-${TARGET}-${EXTRA_VERSION}.patch"
924 [ -f "$FULL_PATCH" ] && rm -f "$FULL_PATCH"
925 $do_patch && pushd linux >/dev/null
926 for series in $SERIES; do
927 echo -n "Applying series $series:"
928 for patchesdir in "$EXTERNAL_PATCHES" "$TOPDIR/lustre/lustre/kernel_patches"; do
929 [ -r "$patchesdir/series/$series" ] || continue
930 SERIES_FILE="$patchesdir/series/$series"
931 for patch in $(<"$SERIES_FILE"); do
933 PATCH_FILE="$patchesdir/patches/$patch"
934 [ -r "$PATCH_FILE" ] || \
935 fatal 1 "Patch $patch does not exist in Lustre tree."
936 cat "$PATCH_FILE" >> "$FULL_PATCH" || {
938 fatal 1 "Error adding patch $patch to full patch."
941 patch -s -p1 < "$PATCH_FILE" 2>&1 || {
943 fatal 1 "Error applying patch $patch."
951 $do_patch && popd >/dev/null
952 echo "Full patch has been saved in ${FULL_PATCH##*/}."
962 pushd lustre >/dev/null
964 echo "Building Lustre RPMs for: $BUILD_ARCHS..."
966 for arch in $BUILD_ARCHS; do
967 targets="--target $arch $targets"
973 confoptions="$confoptions --disable-server"
976 local rpmbuildopt='-tb'
979 echo NORPM mode. Only compiling.
982 # If server we now build the spl and zfs modules against the lustre kernel.
983 # These are required prior to the building of lustre server. Client does
984 # not require spl/zfs. Use !PATCHLESS to indicate server which follows the
985 # line above so is at least consistant.
986 if [ $PATCHLESS == false ] && [ "x$ZFSNOTSUPPORTED" == "x" ]; then
987 if ! build_spl_zfs; then
988 popd >/dev/null # pushd lustre
994 RPMBUILD_DEFS="$RPMBUILD_DEFS --without servers"
995 if [ -n "$CROSS_SUFFIX" ]; then
996 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"lustre_name lustre-client$CROSS_SUFFIX\""
1000 # ditto for the lustre-tests boolean
1001 if ! $LUSTRE_TESTS; then
1002 RPMBUILD_DEFS="$RPMBUILD_DEFS --without lustre_tests"
1005 if ! $IOKITRPM; then
1006 RPMBUILD_DEFS="$RPMBUILD_DEFS --without lustre_iokit"
1014 local osd_ldiskfs=""
1015 if $OSDLDISKFSRPM; then
1019 RPMBUILD_DEFS="$RPMBUILD_DEFS ${FIND_REQUIRES:+--define \"__find_requires $FIND_REQUIRES\"}"
1020 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"configure_args $confoptions ${CONFIGURE_FLAGS}\""
1021 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"kdir $linux\""
1022 RPMBUILD_DEFS="$RPMBUILD_DEFS ${linuxobj:+--define \"kobjdir $linuxobj\"}"
1023 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_tmppath $TMPDIR\""
1024 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_topdir $TOPDIR\""
1026 eval $RPMBUILD $targets $rpmbuildopt "$LUSTRE" $RPMBUILD_DEFS \
1027 ${osd_zfs:+--with zfs} \
1028 ${osd_ldiskfs:+--with ldiskfs} 2>&1 || \
1029 fatal 1 "Error building rpms for $BUILD_ARCHS."
1032 if ! eval $RPMBUILD -ts "$LUSTRE" $RPMBUILD_DEFS 2>&1; then
1044 # Fetch spl/zfs from the git repo and prepare for lustre build
1047 # SPLZFSGITREPO - URI of directory where spl.git and zfs.git are located
1048 # SPLZFSTAG - Tag to checkout of clone repositories
1049 # SPLZFSVER - Version to checkout of both (format zfs/spl-$SPLZFSVER)
1051 # return 0 if successful, else 255
1053 # make sure the RPM build environment is set up
1055 create_rpmbuild_dirs
1058 # The spl/zfs spec files expect RPM_BUILD_ROOT to point to the root of the
1059 # destination for the rpms
1060 export RPM_BUILD_ROOT=$TOPDIR
1061 SPLZFSVER=${SPLZFSVER:-0.6.2}
1062 SPLZFSTAG=${SPLZFSTAG:-upstream-master}
1064 # The files expect a kver to be set to the kernel version .
1065 local kver=$(find_linux_release)
1067 # build and install the spl and zfs (and -devel) RPMs for lustre to use
1069 for pkg in spl zfs; do
1073 [ "$pkg" == "zfs" ] && spldir="$(ls -d $TOPDIR/usr/src/spl-*/|tail -1)"
1075 # need to fetch the repo in order to build it.
1076 # default to github but allow override
1077 git clone ${SPLZFSGITREPO:-"https://github.com/zfsonlinux"}/$pkg.git $pkg 2>&1
1079 pushd $pkg || return 255
1080 if [ -n "$SPLZFSTAG" ]; then
1081 git checkout $SPLZFSTAG
1083 git checkout -b lbuild $pkg-$SPLZFSVER
1086 # This differentiates between older zfs versions
1087 if [ -f $pkg-modules.spec.in ]; then
1090 speclist="$pkg.spec $rpmpkg.spec"
1092 rpmpkg=kmod-$pkg-devel
1094 speclist="$pkg.spec $pkg-kmod.spec $pkg-dkms.spec"
1097 sh autogen.sh || return 255
1099 if ! ./configure --with-linux=${LINUX} --with-linux-obj=${LINUXOBJ:-$LINUX} \
1100 ${spldir:+--with-spl="${spldir}"} 2>&1 ||
1101 ! make dist 2>&1; then
1107 ln -f $pkg/$pkg-*.tar.gz $TOPDIR/SOURCES ||
1108 error "failed to link $pkg/$pkg-*.tar.gz into $TOPDIR/SOURCES"
1109 if [ -f $pkg/scripts/kmodtool ]; then
1110 ln -f $pkg/scripts/kmodtool $TOPDIR/SOURCES/
1120 # set search dir for our own kmodtool to find correct
1122 export KERNELSOURCE=$(dirname ${LINUX})
1123 # Manually build rpms
1124 for spec in $speclist; do
1125 echo "Building RPMs from $pkg/$specdir/$spec"
1126 if ! $RPMBUILD $rpmb $pkg/$specdir/$spec \
1128 --define "require_kdir ${LINUX}" \
1129 ${LINUXOBJ:+--define "require_kobj ${LINUXOBJ}"} \
1130 ${spldir:+--define "require_spldir ${spldir}"} \
1131 --define "kver $kver" \
1132 --define "kernels $kver" \
1133 --define "_tmppath /var/tmp" \
1134 --define "kernelbuildroot $TOPDIR/reused" \
1135 --define "_topdir $TOPDIR" 2>&1; then
1140 # We have built the rpms for the package. Now we need to extract the
1141 # contained files so we can build further things against them
1142 local rpms=$(ls -1 $TOPDIR/RPMS/*/$rpmpkg-*.rpm)
1144 # cpio only extract to pwd so we need to go there.
1147 for rpm in $rpms; do
1148 rpm2cpio $rpm | cpio -id
1151 if [ "$pkg" == "zfs" ]; then
1152 # We also need to extract both the zfs and zfs-devel rpms
1153 # the zfs rpm is needed because it has the actual libraries in
1154 # it and the zfs-devel rpm only has unversioned symlinks to the
1155 # libraries in the zfs rpm
1156 # this will all change one day when we have a libzfs rpm per
1157 # https://github.com/zfsonlinux/zfs/issues/2329
1158 # and it looks like it could be one day soon:
1159 # https://github.com/zfsonlinux/zfs/pull/2341
1160 local devel_rpms=$(ls -1 $TOPDIR/RPMS/*/{$pkg-devel,$pkg-$SPLZFSVER}-*.rpm)
1161 for rpm in $devel_rpms; do
1162 rpm2cpio $rpm | cpio -id
1164 CONFIGURE_FLAGS="--with-$pkg-devel=$TOPDIR ${CONFIGURE_FLAGS}"
1168 CONFIGURE_FLAGS="--with-$pkg=$(ls -d $TOPDIR/usr/src/$pkg-*/|tail -1) ${CONFIGURE_FLAGS}"
1169 CONFIGURE_FLAGS="--with-$pkg-obj=$(ls -d $TOPDIR/usr/src/$pkg-*/$kver*|tail -1) ${CONFIGURE_FLAGS}"
1179 pushd mpss >/dev/null || return 255
1180 if [ "${MPSS_VERSION%%.*}" = "3" ]; then
1181 cp -f ../boot/config-* .config
1182 if ! make ARCH=k1om silentoldconfig ; then
1186 if ! make ARCH=k1om modules_prepare ; then
1190 cp -f ../boot/Module.symvers-* Module.symvers
1192 if ! make defconfig-miclinux; then
1196 if ! make -C card/kernel ARCH=k1om modules_prepare ; then
1207 [ "$STAGEDIR" ] || return 0
1209 for arch in $BUILD_ARCHS; do
1210 rpmdir="${STAGEDIR}/${CANONICAL_TARGET}-${arch}"
1211 echo "${0##*/}: Copying RPMs into ${rpmdir}"
1212 mkdir -p "${rpmdir}"
1213 cp -v RPMS/${arch}/*.rpm "${rpmdir}"
1214 if [ -d RPMS/noarch ]; then
1215 cp -v RPMS/noarch/*.rpm "${rpmdir}"
1219 cp -v "$LUSTRE" "$STAGEDIR"
1223 set_rpm_smp_type() {
1225 local infact_arch="${TARGET_ARCH}"
1228 [ "$infact_arch" == "i586" ] && infact_arch="i686"
1231 for smp_type in $SMP_ARCHS; do
1232 [ $infact_arch == $smp_type ] && RPMSMPTYPE=smp && break
1235 for smp_type in $BIGSMP_ARCHS; do
1236 [ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
1239 for smp_type in $PPC64_ARCHS; do
1240 [ $infact_arch == $smp_type ] && RPMSMPTYPE=ppc64 && break
1243 for smp_type in $DEFAULT_ARCHS; do
1244 [ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
1249 # This function takes a linux include tree and digs out the linux release
1250 # from it. It is never called directly, only called from the distro
1251 # specific function find_linux_release() in lbuild-{rhel,sles}.
1252 _find_linux_release() {
1254 local LINUXRELEASEHEADER=""
1256 LINUXRELEASEHEADER=$SRC/include/linux/version.h
1257 if [ -s $SRC/include/generated/utsrelease.h ]; then
1258 LINUXRELEASEHEADER=$SRC/include/generated/utsrelease.h
1259 elif [ -s $SRC/include/linux/utsrelease.h ]; then
1260 LINUXRELEASEHEADER=$SRC/include/linux/utsrelease.h
1263 if [ ! -s $LINUXRELEASEHEADER ]; then
1264 fatal 1 "could not find UTS_RELEASE"
1267 sed -ne 's/#define UTS_RELEASE "\(.*\)"$/\1/p' $LINUXRELEASEHEADER
1270 # unpack kernel(/source/devel) RPM
1272 # This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
1273 # needs to completely refactored. It completely ingores that $BUILD_ARCHS may
1274 # contain a list of arches for which rpmbuild commands (including the one for
1276 unpack_linux_devel_rpm() {
1277 local kernelrpm="${1}"
1279 [ -f "$kernelrpm" ] || return 255
1280 [ -d $TOPDIR/reused ] || mkdir $TOPDIR/reused || return 255
1282 pushd $TOPDIR/reused &>/dev/null || return 255
1284 if ! rpm2cpio < "$kernelrpm" | cpio -id > /dev/null 2>&1; then
1288 # call a distro specific hook, if available
1289 if type -p unpack_linux_devel_rpm-$DISTRO; then
1290 if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
1297 find_linux_devel_paths $TOPDIR/reused
1305 local kib_prefix="$2"
1308 # build kernel-ib{,-devel}/compat-rdma{,-devel}
1310 # ofed 1.3 had a bug in the rpm spec
1311 if [ "$OFED_VERSION" = "1.3" ]; then
1315 local OFED_CORE="--with-core-mod --with-ipoib-mod --with-sdp-mod --with-user_mad-mod --with-user_access-mod --with-addr_trans-mod"
1316 local OFED_HARDWARE="--with-mthca-mod --with-mlx4-mod --with-mlx4_en-mod --with-cxgb3-mod --with-nes-mod"
1318 if compare_version $OFED_VERSION 3.0; then
1319 OFED_CORE="$OFED_CORE --with-madeye-mod --with-rds-mod"
1321 OFED_HARDWARE="$OFED_HARDWARE --with-cxgb4-mod"
1324 # some I/B drivers are architecture dependent and kernel-ib's configure
1325 # does not figure it out for us ~sigh~
1326 case "$TARGET_ARCH" in
1328 OFED_HARDWARE="$OFED_HARDWARE --with-ehca-mod"
1331 # we're no longer shipping the OFED iSCSI target
1332 #OFED_ISCSI="--with-srp-mod --with-srp-target-mod"
1333 OFED_ISCSI="--with-srp-mod"
1334 ## ISER module has no backport support as of OFED 1.5 (i.e. only builds on
1335 ##kernels >= 2.6.30)
1336 #if [[ $OFED_VERSION = 1.[0-4]* ]]; then
1337 # OFED_ISCSI="$OFED_ISCSI --with-iser-mod"
1340 # assume we are just rebuilding the SRPM
1341 local BUILD_TYPE=${BUILD_TYPE:-"--rebuild"}
1342 local SOURCE="${TOPDIR}/OFED/SRPMS/${kib_prefix}-*.src.rpm"
1344 # but switch to building from the SPEC if we need to apply patches
1345 if ls ${TOPDIR}/lustre/contrib/patches/ofed/* >/dev/null; then
1347 rpm --define "_topdir ${TOPDIR}" -ivh $SOURCE
1348 SOURCE="${TOPDIR}/SPECS/${kib_prefix}.spec"
1349 local file ed_fragment1 ed_fragment2 n=1
1350 for file in $(ls ${TOPDIR}/lustre/contrib/patches/ofed/*.patch); do
1351 ed_fragment1="$ed_fragment1
1352 Patch$n: ${file%%*/}"
1353 ed_fragment2="$ed_fragment2
1355 cp $file ${TOPDIR}/SOURCES
1358 for file in $(ls ${TOPDIR}/lustre/contrib/patches/ofed/*.ed); do
1359 # Only apply the ed-scripts that should be used for the canonical target
1360 # ed-files in ${TOPDIR}/lustre/contrib/patches/ofed/ have to follow the naming
1362 # <two-digits>-<descriptive-name>:<canonical_target_1>: ...:<canonical_target_N>.ed
1363 # To apply the same change to multiple canonical target simply specify
1364 # a list of colon separated canoncial target names in the file name.
1365 echo "$file" | grep -q -e ":${CANONICAL_TARGET}:" \
1366 -e ":${CANONICAL_TARGET}.ed$"
1367 if [ $? -eq 0 ] ; then
1368 ed_fragment3="$ed_fragment3
1374 if [ $n -gt 1 ]; then
1388 local linuxrelease=$(find_linux_release)
1389 if compare_version $OFED_VERSION 3.0; then
1390 local OFA_KERNEL_RELEASE=$(echo -n ${linuxrelease} | sed -e 's/-/_/g')
1392 if ! $RPMBUILD $BUILD_TYPE --define 'build_kernel_ib 1' --define 'build_kernel_ib_devel 1' \
1393 ${FIND_REQUIRES:+--define "__find_requires $FIND_REQUIRES"} \
1394 --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
1395 --define "KVERSION ${linuxrelease}" \
1396 --define "$K_SRC ${linux}" \
1397 --define "LIB_MOD_DIR /lib/modules/${linuxrelease}/updates" \
1398 ${OFA_KERNEL_RELEASE:+--define "_release $OFA_KERNEL_RELEASE"} \
1399 --define "configure_options --without-quilt $OFED_CORE $OFED_HARDWARE $OFED_ISCSI" \
1400 ${SOURCE} 2>&1; then
1401 fatal 1 "Error building ${kib_rpm}"
1410 local signature="$4"
1411 local use_links="$5"
1418 local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
1419 if [ -z "$default_iface" ]; then
1420 fatal 1 "Failed to determine the default route interface"
1422 local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
1423 if [ -z "$unique_id" ]; then
1424 fatal 1 "Failed to determine a unique id from interface $default_interface"
1427 local finallocation="$location"/"$signature"/"$module"
1428 location="$location"/"$signature-${unique_id}"/"$module"
1429 mkdir -p "$location"
1430 # the cleanup script removes any directory that doesn't have a
1431 # .lastused, so let's try to prevent that as soon as we can
1432 # this solution still slightly racy with the cleanup script
1433 # but the race is a lot tighter now
1434 touch -t 197001010000 "$location/.lastused"
1435 ## use eval/echo here to make sure shell expansions are performed
1436 #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
1438 for article in $(eval echo $articles); do
1439 if ! cp -a${linkflag} "$article" "$location"; then
1440 error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
1441 # rename the cache location so that it's not cached
1442 # product, but is around for analysis
1443 mv "$location"{,-bad-$(date +%s)} ||
1444 error "failed to clean up a failed cache attempt" \
1445 "in \"$location\" -- manual cleanup will be" \
1451 # flag the cache as complete (i.e. in case lbuild was previously
1452 # interrupted while caching)
1453 touch "$location/.lastused"
1455 # put the temporary location into the final location
1457 mkdir -p "${finallocation%/*}"
1458 mv "$location" "$finallocation"
1459 rmdir "${location%/*}"
1467 local use_links="${3:-false}"
1468 local signature="$4"
1470 if [ -n "$REUSEBUILD" ] && [ -d "$REUSEBUILD/$signature/$module" ]; then
1471 if [ ! -f "$REUSEBUILD/$signature/$module/.lastused" ]; then
1472 # the .lastused flag is populated at the end of the caching to
1473 # signal that the caching was completed. if that flag is not
1474 # there, then the cache is invalid (and should be removed in fact)
1475 mv "$REUSEBUILD/$signature/$module"{,-bad-$(date +%s)} ||
1476 fatal 1 "failed to clean up a bad cache in location $REUSEBUILD/$signature/$module\" -- manual cleanup will be necessary"
1480 # so that we know how stale this entry is
1481 touch $REUSEBUILD/$signature/$module/.lastused
1484 if ls $REUSEBUILD/$signature/$module/* >/dev/null 2>&1; then
1485 cp -al $REUSEBUILD/$signature/$module/* $dest/
1488 # copying is pretty heavy
1489 # cp -a $REUSEBUILD/$signature/$module/* $dest/
1490 # do some creative symlinking instead
1492 for dir in BUILD SRPMS SPECS; do
1493 if ls $REUSEBUILD/$signature/$module/$dir/* >/dev/null 2>&1; then
1494 ln -s $REUSEBUILD/$signature/$module/$dir/* $dest/$dir
1497 # sources have to be copied by file because we need SOURCES to
1498 # be a dir we can write into
1499 # could overrun ls's arg list here
1500 #ls $REUSEBUILD/$signature/$module/SOURCES/* |
1501 find $REUSEBUILD/$signature/$module/SOURCES/ -type f |
1502 xargs ln -t $dest/SOURCES -s
1504 # same for RPMS/* dirs
1505 # could overrun ls's arg list here
1506 #ls $REUSEBUILD/$signature/$module/RPMS/$TARGET_ARCH/* |
1508 for dir in $REUSEBUILD/$signature/$module/RPMS/*; do
1509 mkdir -p $dest/RPMS/${dir##*/}
1511 xargs ln -t $dest/RPMS/${dir##*/} -s
1523 if [[ $arch = i[3456]86 ]]; then
1531 build_kernel_with_srpm() {
1534 if [ -z "$outfd" ] || [ $outfd = 1 ]; then
1535 fatal 1 "You must supply a file descriptor to ${FUNCNAME[0]} and it cannot be 1"
1538 # need to generate the patch for this target
1539 do_patch_linux false >&${outfd} # sets global $FULL_PATCH (yeah, yuck)
1541 # get an md5sum of the kernel patch + config for reuse check
1542 # XXX really, there needs to be a signature and a CONFIG_FILE per arch
1546 local release_str="RELEASE=$RELEASE\n"
1549 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1550 local REUSE_SIGNATURE=$({ echo -en $release_str;
1552 cat $CONFIG_FILE $TARGET_FILE $FULL_PATCH;
1553 cat $LBUILD_DIR/lbuild $LBUILD_DIR/lbuild-${DISTRO}; } |
1554 md5sum | cut -d" " -f1)
1555 # see if we can link to the reuse pool
1556 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1558 local CAN_LINK_FOR_REUSE=false
1559 touch $REUSEBUILD/$$
1560 if cp -al $REUSEBUILD/$$ $TOPDIR/ 2>/dev/null; then
1561 CAN_LINK_FOR_REUSE=true
1566 # the extra version string to use for the kernel (which might be a reused
1568 local kernel_extra_version=""
1569 if ! $USE_BUILD_CACHE || ! reuse kernel "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1570 "$REUSE_SIGNATURE"; then
1571 # nothing cached, build from scratch
1572 if [ ! -r "$KERNELDIR/$KERNEL_SRPM" ]; then
1573 echo "Downloading kernel SRPM" >&${outfd}
1574 download_srpm "$CANONICAL_TARGET" "$KERNEL_SRPM" >&${outfd}
1577 if ! rpm -ivh $KERNELDIR/$KERNEL_SRPM \
1578 --define "_topdir $TOPDIR" >&${outfd} 2>&1; then
1579 # should we clean this up or leave it for analysis?
1581 fatal 1 "Error installing kernel SRPM."
1584 # put the Lustre kernel patch into the RPM build tree
1585 cp $FULL_PATCH $TOPDIR/SOURCES/linux-${lnxmaj}-lustre.patch
1586 prepare_and_build_srpm >&${outfd} ||
1587 fatal 1 "failed to prepare_and_build_srpm"
1589 if [ -z "$REUSE_SIGNATURE" ]; then
1590 echo "No reuse signature was caculated so not storing the built kernel" >&${outfd}
1592 # store the resulting kernel RPM build tree for future use
1593 echo "Storing the built kernel for future reuse" >&${outfd}
1594 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,SRPMS,RPMS}" \
1595 "kernel" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1596 "$CAN_LINK_FOR_REUSE"; then
1597 error "Failed to store kernel RPMS for reuse"
1598 echo "unknown" >&${outfd}
1604 # figure out the EXTRA_VERSION of the kernel we built or are re-using
1606 if ! KERNEL_RPM=$(find_rpm "$TOPDIR/RPMS/$TARGET_ARCH/" provides "^kernel(-default)? ="); then
1607 fatal 1 "Failed to find a kernel RPM in $TOPDIR/RPMS/$TARGET_ARCH/"
1609 kernel_extra_version=$(rpm -q --queryformat "%{RELEASE}" -p $TOPDIR/RPMS/$TARGET_ARCH/$KERNEL_RPM)
1611 # should now have the following RPMs
1612 # $TOPDIR/RPMS/$arch/kernel-lustre-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1613 # $TOPDIR/RPMS/$arch/kernel-lustre-devel-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1614 # $TOPDIR/RPMS/$arch/kernel-lustre-headers-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1615 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-common-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1616 # $TOPDIR/RPMS/$arch/kernel-lustre-debuginfo-2.6.18-53.1.21.el5_lustre.1.6.5.1.$arch.rpm
1618 echo $kernel_extra_version
1626 # REUSEBUILD, USE_BUILD_CACHE
1631 local ofed_version="$2"
1635 # if an ofed version is given, then it means use OFED proper,
1636 # not any vendor specific "inkernel" version
1637 if [ -z "$ofed_version" ]; then
1641 if [ "$ofed_version" = "inkernel" ]; then
1642 # see if there is a distro specific override for this and use
1644 # XXX we need to better integrate a distro specific override with
1645 # the rest of this function so that all of the reuse cache
1646 # stuff is leveraged given that 80% of this function is reuse
1647 if type -p build_ofed-${DISTRO}; then
1649 ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
1650 local rc=${PIPESTATUS[0]}
1651 CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
1656 elif compare_version $OFED_VERSION 3.0; then
1657 kib_prefix="ofa_kernel"
1660 kib_prefix="compat-rdma"
1661 kib_rpm="compat-rdma"
1664 # build kernel-ib/compat-rdma
1665 if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
1666 local REUSE_SIGNATURE=$({ echo "$ofed_version";
1667 echo "$(find_linux_release;
1668 echo "$BUILD_GEN")";
1669 cat "${linux}/include/linux/autoconf.h";
1670 cat "$LBUILD_DIR/lbuild" ;
1671 cat "$LBUILD_DIR/lbuild-${DISTRO}"; } |
1672 md5sum | cut -d" " -f1)
1673 # see if we can link to the reuse pool
1674 # XXX - hrm. i'm not convinced this doesn't belong in the reuse
1676 local CAN_LINK_FOR_REUSE=false
1677 touch $REUSEBUILD/$$
1678 if cp -al $REUSEBUILD/$$ $TOPDIR/; then
1679 CAN_LINK_FOR_REUSE=true
1684 if ! $USE_BUILD_CACHE || ! reuse ofed "$TOPDIR" "$CAN_LINK_FOR_REUSE" \
1685 "$REUSE_SIGNATURE"; then
1686 if [ -n "$REUSE_SIGNATURE" ]; then
1687 # stash away the existing built articles for a moment
1689 mv {BUILD,{S,}RPMS,S{OURCE,PEC}S} bak
1692 find . | cpio -pudlm ..
1696 create_rpmbuild_dirs
1699 build_kernel_ib "${linux}" "${kib_prefix}" "${kib_rpm}"
1701 if [ -z "$REUSE_SIGNATURE" ]; then
1702 echo "No reuse signature was caculated so not storing the built ofed"
1704 # store the resulting RPM build tree for future use
1705 echo "Storing the built ofed for future reuse"
1706 if ! store_for_reuse "$TOPDIR/{SPECS,SOURCES,BUILD,SRPMS,RPMS}" \
1707 "ofed" "$REUSEBUILD" "$REUSE_SIGNATURE" \
1708 "$CAN_LINK_FOR_REUSE"; then
1709 error "Failed to store OFED RPMS for reuse"
1713 # put the stuff we stashed away back
1718 pushd "$TOPDIR" >/dev/null
1719 rm -rf ${kib_rpm}-devel
1720 mkdir ${kib_rpm}-devel
1722 # the actual ofed RPMs don't have the -rc$n or -$date string appened that
1723 # might be present on the file
1724 #local linuxrelease=$(find_linux_release)
1725 #ofed_version=$(echo $ofed_version |
1726 # sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
1728 # OFED version will have 'hyphen' for minor release. (e.g. 3.5-1, instead
1729 # of 3.5.1) compat-rdma and compat-rdma-devel could have same version
1730 # number, but currectly not. Once OFED fix this in the future release, we
1731 # can remove following filter.
1732 #ofed_version=$(echo $ofed_version |
1733 # sed -re 's/-([0-9]*-[rR][cC][0-9]*)$//')
1734 #local rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
1735 # I dont' know why we have gone through the trouble to filter out the name
1736 # of the rpm there should only be one ${kib_rpm}-devel built
1737 local rpm=$(ls $TOPDIR/RPMS/*/${kib_rpm}-devel-*.rpm)
1738 if ! rpm2cpio < $rpm | cpio -id; then
1739 fatal 1 "could not unpack the ${kib_rpm}-devel rpm."
1741 CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/${kib_prefix} ${CONFIGURE_FLAGS}"
1748 if ! $PATCHLESS; then
1749 local kernel_extra_version
1750 if ! kernel_extra_version=$(build_kernel_with_srpm ${STDOUT}); then
1751 fatal 1 "Failed to build the kernel from it's SRPM"
1754 for arch in $BUILD_ARCHS; do
1755 local kernel_devel_rpm
1756 if ! kernel_devel_rpm=$(find_rpm "$TOPDIR/RPMS/$arch/" provides "^$(devel_kernel_name $KERNEL_LUSTRE_NAMING) ="); then
1757 fatal 1 "Failed to find a kernel development RPM in $TOPDIR/RPMS/$arch/"
1760 # install the -devel RPM in preparation for modules builds
1761 if ! lnxrel="$kernel_extra_version" unpack_linux_devel_rpm \
1762 "$TOPDIR/RPMS/$arch/$kernel_devel_rpm"; then
1763 fatal 1 "Could not find the Linux tree in $TOPDIR/RPMS/$arch/$kernel_devel_rpm"
1767 # need to find and unpack the vendor's own kernel-devel for patchless
1770 if ! kernelrpm=$(find_linux_rpm "-$DEVEL_KERNEL_TYPE"); then
1771 fatal 1 "Could not find the kernel-$DEVEL_KERNEL_TYPE RPM in ${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
1773 if ! lnxrel="$lnxrel" unpack_linux_devel_rpm "$kernelrpm" "-"; then
1774 fatal 1 "Could not find the Linux tree in $kernelrpm"
1778 # ~sigh~ have to make copies of and modify some of the rpm
1779 # infrastructure files so that find-requires can find our unpacked
1780 # kernel-devel artifacts
1781 cp $RPM_HELPERS_DIR/{symset-table,find-requires{,.ksyms}} .
1782 FIND_REQUIRES="$(pwd)/find-requires"
1783 chmod 755 {symset-table,find-requires{,.ksyms}}
1785 tmp="${tmp//\//\\/}"
1786 ed find-requires <<EOF
1790 /|.*find-requires.ksyms/s/|/| bash -x/
1791 g/ [^ ]*\/\(find-requires\.ksyms\)/s// $tmp\/\1/g
1794 ed find-requires.ksyms <<EOF
1798 g/\/.*\/\(symset-table\)/s//$tmp\/\1/g
1801 ed symset-table <<EOF
1805 g/\(\/boot\/\)/s//$tmp\/reused\1/g
1806 g/\(\/usr\/src\/kernels\/\)/s//$tmp\/reused\1/g
1810 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
1811 fatal 1 "error building OFED"
1814 if build_lustre "$LINUX" "$LINUXOBJ"; then
1815 # the build worked. resolve any symlinked files (i.e. from reuse)
1816 # in RPMS/$arch to real files so that that that huge mess of
1817 # complication known as LTS can copy them yet somewhere else.
1818 # is it any wonder this whole process is so damn so? anyone ever
1819 # heard of hardlinks? it's this cool new thing that allows you save
1820 # tons of time and space by creating... well you can go read about
1821 # them if you have not heard about them yet.
1822 # can i say how much the implemenation of all of this really impedes
1825 for dir in RPMS/*; do
1827 for file in $(ls); do
1828 if [ -h $file ]; then
1835 # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
1836 # as that's where LTS expects to find them
1837 for dir in RPMS/*; do
1838 if [ $dir = RPMS/$TARGET_ARCH ]; then
1843 if [ -n "$files" ]; then
1844 cp -al $files ../$TARGET_ARCH
1854 create_rpmbuild_dirs() {
1856 [ -d RPMS ] || mkdir RPMS
1857 for arch in $BUILD_ARCHS; do
1858 if [[ $arch = i?86 ]]; then
1859 # some stupidity in the sles11 kernel spec requires an RPMS/i386
1860 # even if the target arch is i686
1861 [ -d RPMS/i386 ] || mkdir RPMS/i386
1863 [ -d RPMS/$arch ] || mkdir RPMS/$arch
1865 [ -d RPMS/noarch ] || mkdir RPMS/noarch
1866 [ -d BUILD ] || mkdir BUILD
1867 [ -d SOURCES ] || mkdir SOURCES
1868 [ -d SPECS ] || mkdir SPECS
1869 [ -d SRPMS ] || mkdir SRPMS
1891 [[ $list\ == *\ $item\ * ]]
1895 #########################################################################
1896 # Generate a backtrace through the call stack.
1900 #########################################################################
1904 local funcname="" sourcefile="" lineno="" n
1906 echo "Call stack: (most recent first)"
1907 for (( n = $strip ; n < ${#FUNCNAME[@]} ; ++n )) ; do
1908 funcname=${FUNCNAME[$n - 1]}
1909 sourcefile=$(basename ${BASH_SOURCE[$n]})
1910 lineno=${BASH_LINENO[$n - 1]}
1914 # Display function arguments
1915 if [[ ! -z "${BASH_ARGV[@]}" ]]; then
1916 local args newarg j p=0
1917 for (( j = ${BASH_ARGC[$n - 1]}; j > 0; j-- )); do
1918 newarg=${BASH_ARGV[$j + $p - 1]}
1919 args="${args:+${args} }'${newarg}'"
1921 let p+=${BASH_ARGC[$n - 1]}
1923 echo " ${funcname} ${args:+${args} }at ${sourcefile}:${lineno}"
1927 echo "BEGIN BACKTRACE"
1929 #echo ${BASH_LINENO[*]}
1930 #echo ${BASH_SOURCE[*]}
1931 #echo ${FUNCNAME[*]}
1932 local i=$((${#FUNCNAME[@]} - 1))
1933 while [ $i -ge 0 ]; do
1934 local lineno=${BASH_LINENO[$i]}
1938 local SOURCELINE="${BASH_SOURCE[$i + 1]}:${lineno}"
1939 # Can't figure out how to get function args from other frames...
1940 local FUNCTION="${FUNCNAME[$i]}()"
1941 echo "$SOURCELINE:$FUNCTION"
1945 echo "END BACKTRACE"
1951 seen_list=$(new_list)
1953 echo "An unexpected error has occurred at ${BASH_SOURCE[0]##*/}:$((LINENO-1)).
1954 Unfortunately the above line number in the message may or may not be correct,
1955 but details have been send to the lbuild maintainer. Attempting to continue."; (echo "Untrapped error"
1957 # have we seen this one
1958 echo "checking seen list for ${BASH_SOURCE[0]}:${BASH_LINENO[0]}"
1960 if is_list_member "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"; then
1961 echo "seen this one already"
1963 seen_list=$(add_list "$seen_list" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}")
1966 ) ; set $xtrace' ERR
1969 [ -r ~/.lbuildrc ] && . ~/.lbuildrc
1971 options=$(getopt -o D:h -l kerneltree:,distro:,kernelrpm:,reusebuild:,patchless,ldiskfs,ccache,reuse:,norpm,disable-datestamp,external-patches:,timestamp:,extraversion:,kerneldir:,linux:,lustre:,nodownload,nosrc,noiokit,ofed-version:,mpss-version:,publish,release,set-value:,src,stage:,tag:,target:,target-archs:,with-linux:,xen -- "$@")
1973 if [ $? != 0 ]; then
1977 eval set -- "$options"
2008 if ! KERNELTREE=$(canon_path "$2"); then
2009 fatal 1 "Could not determine the canonical location of $2"
2013 --linux | --with-linux)
2014 if ! LINUX=$(canon_path "$2"); then
2015 fatal 1 "Could not determine the canonical location of $2"
2028 if ! REUSEBUILD=$(canon_path "$2"); then
2029 fatal 1 "Could not determine the canonical location of $2"
2038 echo "WARNING: \"--ldiskfs\" is deprecated" > 2
2050 if ! KERNELRPMSBASE=$(canon_path "$2"); then
2051 fatal 1 "Could not determine the canonical location of $2"
2060 if ! LUSTRE=$(canon_filepath "$2"); then
2061 fatal 1 "Could not determine the canonical location of $2"
2098 echo "WARNING: \"--tag\" is deprecated" > 2
2118 # there are actually some lustre configure flags that we need to
2119 # handle ourselves (but we still give them to configure)
2120 if [[ \ $@\ == *\ --disable-tests\ * ]]; then
2127 usage 1 "Unrecognized option: $1"
2136 # XXX - should we _always_ get the buildid from the META file? what are the
2137 # other (i.e. non-lustre-tarball use cases of lbuild)?
2138 BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
2139 VERSION=$(sed -ne '/^VERSION =/s/.*= *//p' lustre/META)
2143 if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
2145 unpack_ofed || fatal 1 "Error unpacking OFED tarball"
2148 if [ -n "$MPSS_VERSION" ]; then
2149 [ -z "$MPSS_DISTRO" ] && MPSS_DISTRO=$(autodetect_distro)
2151 MPSS_INFO=$(mktemp -u mpss-info-XXXXXXXXXX.html)
2152 download_mpss_info "$MPSS_INFO"
2154 if [ "$MPSS_VERSION" = "last" ]; then
2155 MPSS_VERSION=$(parse_mpss_info "$MPSS_INFO" "" ${MPSS_DISTRO})
2156 [ -z "$MPSS_VERSION" ] && fatal 1 "Could not determine the last MPSS version"
2157 elif [[ $MPSS_VERSION != [0-9].[0-9].[0-9]*-[0-9]* ]]; then
2158 fatal 1 "Incorrect MPSS version $MPSS_VERSION"
2161 download_mpss "$MPSS_INFO"
2162 [ -r "$MPSS_INFO" ] && rm -f "$MPSS_INFO"
2163 echo "Building with MPSS $MPSS_VERSION"
2164 unpack_mpss || fatal 1 "Error unpacking MPSS tarballs"
2165 prepare_mpss || fatal 1 "Error preparing MPSS for kernel modules build"
2167 if [ -z "$MPSS_OFED" ]; then
2168 MPSS_OFED=$(find $PWD -type f -path "*/ofed-driver-*/Module.symvers")
2169 if [ -n "$MPSS_OFED" ]; then
2170 MPSS_OFED="--with-o2ib=$(dirname $MPSS_OFED)"
2172 MPSS_OFED="--without-o2ib"
2176 # disable unsupported parts:
2180 ZFSNOTSUPPORTED="yes"
2182 # define variables for cross compilation:
2184 if [ "${MPSS_VERSION%%.*}" = "3" ]; then
2185 CC_TARGET_ARCH=k1om-mpss-linux
2186 LINUX="$TOPDIR/mpss"
2188 CC_TARGET_ARCH=x86_64-k1om-linux
2189 LINUX="$TOPDIR/mpss/card/kernel"
2190 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"cross_requires intel-mic-gpl = ${MPSS_VERSION%%-*}\""
2192 CONFIGURE_FLAGS="$CONFIGURE_FLAGS $MPSS_OFED --host=$CC_TARGET_ARCH --build=x86_64-pc-linux"
2193 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"post_script build/gen_filelist.sh\""
2194 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"make_args ARCH=k1om CROSS_COMPILE=${CC_TARGET_ARCH}-\""
2195 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"cross_path ${CROSS_PATH:=/opt/lustre/${VERSION}/${CC_TARGET_ARCH}}\""
2196 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"rootdir %{cross_path}\""
2197 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_prefix %{cross_path}/usr\""
2198 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_mandir %{_prefix}/share/man\""
2199 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"_sysconfdir %{cross_path}/etc\""
2200 RPMBUILD_DEFS="$RPMBUILD_DEFS --define \"kmoddir extra\""
2202 # redefine CC for proper ./configure during rpmbuild
2203 export CC=${CC_TARGET_ARCH}-gcc
2206 # make sure the RPM build environment is set up
2207 create_rpmbuild_dirs
2209 # if an unpacked kernel source tree was given on the command line
2210 # just build lustre with it (nothing distro kernel specific here)
2211 if [ -n "$LINUX" ]; then
2212 find_linux_release() {
2213 _find_linux_release $LINUX
2215 build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
2216 fatal 1 "error building OFED"
2217 build_lustre "$LINUX" "$LINUXOBJ"
2219 if [ ! -f "${LBUILD_DIR}/lbuild-$DISTRO" ]; then
2220 fatal 1 "${LBUILD_DIR}/lbuild-$DISTRO not found"
2222 source ${LBUILD_DIR}/lbuild-$DISTRO
2223 build_with_srpm || fatal 1 "Failed to build_with_srpm"