# include the exit_traps library
. ${0%/lbuild}/exit_traps.sh
+. ${0%/lbuild}/funcs.sh
# our children should die when we do
push_exit_trap "kill -INT -$$ || true" kill_children
+# increment this if you have made a change that should force a new kernel
+# to build built
+#BUILD_GEN=1
+#BUILD_GEN=2 # bz19952: remove -lustre tag from kernel RPM names
+#BUILD_GEN=3 # bz19975: enable the building of src.rpms by default
+BUILD_GEN=4 # bz22281: use the git hash in the kernel extra version
+
TOPDIR=$PWD
# CVSROOT is inherited from the environment
TAG=
CANONICAL_TARGET=
TARGET=
-TARGET_ARCH=$(uname -m)
-TARGET_ARCHS=
-TARGET_ARCHS_ALL=$TARGET_ARCH
+TARGET_ARCH="$(uname -m)"
+# change default behavior to only build for the current arch
+TARGET_ARCHS="$TARGET_ARCH"
+TARGET_ARCHS_ALL="$TARGET_ARCH"
[ "$TARGET_ARCH" = "i686" ] && TARGET_ARCHS_ALL="i686 i586 i386"
CONFIGURE_FLAGS=
EXTERNAL_PATCHES=
EXTRA_VERSION=
-LUSTRE_EXTRA_VERSION=
STAGEDIR=
TMPDIR=${TMPDIR:-"/var/tmp"}
TIMESTAMP=
# this is a dir to try reuse old kernel RPMs in (although, it seems to be
# unused in any real manner
REUSERPM=
+# this is the dir that should be used to store reuse products
REUSEBUILD=
# should cached products be used or force rebuilding?
USE_BUILD_CACHE=true
fi
}
-cleanup() {
-
- true
-}
-
-error() {
- local msg="$1"
-
- [ -n "$msg" ] && echo -e "\n${0##*/}: $msg" >&3
-
-}
-
-fatal() {
-
- cleanup
- error "$2"
- exit $1
-
-}
-
usage() {
cat <<EOF
Usage: ${0##*/} [OPTION]... [-- <lustre configure options>]
--xen
Builds a Xen domX kernel.
+ --set-value
+ Set's a variable to a given value.
+
EOF
# list_targets
fatal "$1" "$2"
}
-# canonicalize a relative path
+# canonicalize a relative path to a file
+canon_filepath() {
+ local PATH="$1"
+
+ if [ ! -f "$PATH" ]; then
+ return 1
+ fi
+
+ local FILE=${PATH##*/}
+ local DIR=${PATH%/*}
+
+ echo $(canon_path "$DIR")/$FILE
+ return 0
+}
+
+# canonicalize a relative path to a dir
canon_path() {
local PATH="$1"
usage 1 "A branch/tag name must be specified with --tag when not building from a tarball."
fi
+ [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
+
if [ -z "$LINUX" ]; then
[ "$KERNELDIR" -o "$KERNELTREE" ] || \
usage 1 "A kernel directory must be specified with --kerneldir or --kerneltree."
usage 1 "When building a snapshot, a tag name must be used."
fi
- [ "$TARGET" ] || usage 1 "A target must be specified with --target."
+ [ "$TARGET" ] || TARGET=$(autodetect_target "$DISTRO")
# TARGET_FILE="$TOPDIR/lustre/kernel_patches/targets/$TARGET.target"
# [ -r "$TARGET_FILE" ] || \
# usage 1 "Target '$TARGET' was not found."
fi
case $TARGET in
+ 2.6-rhel6)
+ CANONICAL_TARGET="rhel6"
+ ;;
2.6-rhel5)
CANONICAL_TARGET="rhel5"
;;
fi
fi
- [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
-
return 0
}
-# autodetect used Distro
-autodetect_distro() {
-
- local name
- local version
-
- if [ -f /etc/SuSE-release ]; then
- name=sles
- version=$(grep ^VERSION /etc/SuSE-release)
- version=${version#*= }
- elif [ -f /etc/redhat-release ]; then
- name=$(head -1 /etc/redhat-release)
- version=$(echo "$distroname" |
- sed -e 's/^[^0-9.]*//g' | sed -e 's/[ \.].*//')
- fi
- if [ -z "$name" -o -z "$version" ]; then
- fatal 1 "I don't know how to determine distro type/version.\nEither update autodetect_distro() or use the --distro argument"
- fi
+uniqify() {
- echo ${name}${version}
- return 0
+ echo $(echo "$*" | xargs -n 1 | sort -u)
}
-uniqify() {
+fetch_url() {
+ local url="$1"
+ local target="$2"
- echo $(echo "$*" | xargs -n 1 | sort -u)
+ local rc=0
+ if which wget >/dev/null 2>&1; then
+ if ! wget -nv "$url" -O "$target"; then
+ rc=${PIPESTATUS[0]}
+ fi
+ elif which curl >/dev/null 2>&1; then
+ if ! curl -L -s -o "$target" "$url"; then
+ rc=${PIPESTATUS[0]}
+ fi
+ else
+ fatal 1 "Could not find either wget or curl to fetch URLs."
+ fi
+
+ return $rc
}
[ ! -s "$KERNELDIR/$srpm" ]; then
if $DOWNLOAD; then
local location="http://downloads.lustre.org/public/kernels/$target/old"
+ # get the location from a distro specific method if it exists
+ if type -p kernel_srpm_location; then
+ location=$(kernel_srpm_location)
+ fi
echo "Downloading $location/$srpm..."
- if ! wget -nv "$location/$srpm" -O "$KERNELDIR/$srpm" 2>&1 ||
+ if ! fetch_url "$location/$srpm" "$KERNELDIR/$srpm" 2>&1 ||
[ ! -s "$KERNELDIR/$srpm" ]; then
rm -f $KERNELDIR/$srpm
- fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
+ # punt to a distro specific method if it exists
+ if ! type -p download_srpm-$DISTRO; then
+ fatal 1 "Could not download target $target's kernel SRPM $srpm from $location."
+ else
+ if ! download_srpm-$DISTRO "$target" "$srpm" "$force"; then
+ fatal 1 "Could not download target $target's kernel SRPM $srpm using download_srpm-$DISTRO."
+ fi
+ fi
fi
else
fatal 1 "$srpm not found in directory $KERNELDIR."
# flag others so they don't try to download also
push_exit_trap "rm -f $to $semaphore" "download"
touch $semaphore
- if ! wget -nv "$from" -O "$to" || [ ! -s "$to" ]; then
+ if ! fetch_url "$from" "$to" || [ ! -s "$to" ]; then
# the trap will remove the files via the fatal below
- fatal 1 "Could not download ${to##*/} from ${from%%/*}/."
+ fatal 1 "Could not download ${to##*/} from ${from%/*}/."
fi
rm -f $semaphore
delete_exit_trap "download"
download_ofed() {
local force="${1:-false}"
- local location="http://downloads.lustre.org/public/OFED/"
+ if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
+ return 0
+ fi
+
+ local location="http://www.openfabrics.org/downloads/OFED/ofed-${OFED_VERSION}/"
- local Mmv daily
if [[ $OFED_VERSION = daily-* ]]; then
+ local Mmv daily
OFED_VERSION=${OFED_VERSION/daily-/}
Mmv=${OFED_VERSION%%-*}
daily=${OFED_VERSION##$Mmv-}
fi
fi
- if [ -z "$OFED_VERSION" -o "$OFED_VERSION" = "inkernel" ]; then
- return 0
- fi
-
local file="OFED-${OFED_VERSION}.tgz"
download_file "$location/$file" "$KERNELTREE" "$force"
}
-download_rdac() {
- local force="${1:-false}"
-
- local location="http://downloads.lustre.org/public/RDAC/"
-
- if [ -z "$RDAC_VERSION" -o "$RDAC_VERSION" = "inkernel" ]; then
- return 0
- fi
-
- local file="rdac-LINUX-${RDAC_VERSION}-source.tar.gz"
- download_file "$location/$file" "$KERNELTREE" "$force"
-
-}
-
-download_mptlinux() {
- local force="${1:-false}"
-
- local location="http://downloads.lustre.org/public/MPTLINUX/"
-
- if [ -z "$MPTLINUX_VERSION" -o "$MPTLINUX_VERSION" = "inkernel" ]; then
- return 0
- fi
-
- file="MPTLINUX_RHEL5_SLES10_PH15-${MPTLINUX_VERSION}.zip"
- download_file "$location/$file" "$KERNELTREE" "$force"
-
-}
-
load_target() {
EXTRA_VERSION_save="$EXTRA_VERSION"
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}"
+ if ! $PATCHLESS && [ -n "$BUILDID" ]; then
+ EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
+ fi
fi
fi
# EXTRA_VERSION=${EXTRA_VERSION//-/_}
}
untar() {
- local file="$1"
+ local tarfile="$1"
+ shift
+ local extractfile="$@"
- echo "Untarring ${file##*/}..."
- tar $(tarflags "$file") "$file"
+ echo "Untarring ${tarfile##*/}..."
+ tar $(tarflags "$tarfile") "$tarfile" $extractfile
}
}
-unpack_rdac() {
-
- if ! untar "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz"; then
- return 1
- fi
- [ -d rdac-LINUX ] || ln -sf rdac-LINUX-[0-9][0-9].* rdac-LINUX
-
-}
-
-unpack_mptlinux() {
-
- if ! unzip -p $KERNELTREE/MPTLINUX_RHEL5_SLES10_PH15-4.16.00.00-2.zip | tar xzvf - srpms-2/mptlinux-4.16.00.00-2.src.rpm; then
- return 1
- fi
- mv srpms-2/mptlinux-4.16.00.00-2.src.rpm .
-
-}
-
unpack_lustre() {
if [ -z "$LUSTRE" ]; then
fatal 1 "There was an error checking out Lustre/Portals/Build from CVS."
echo "Creating lustre tarball..."
sh autogen.sh || fatal 1 "There was an error running autogen.sh."
- ./configure --disable-{modules,utils,liblustre,tests,doc} || \
+ ./configure --enable-dist || \
fatal 1 "There was an error running ./configure to create makefiles."
make dist || fatal 1 "There was an error running 'make dist'."
LUSTRE=$PWD/lustre-*.tar.gz
targets="--target $arch $targets"
done
- local confoptions="--with-linux=${linux}"
+ local confoptions=""
+
if $PATCHLESS; then
- confoptions="--with-linux=${linux} --disable-server"
- fi
- if [ "$linuxobj" != "" ]; then
- confoptions="$confoptions --with-linux-obj=${linuxobj}"
+ confoptions="$confoptions --disable-server"
fi
- ./configure $confoptions ${CONFIGURE_FLAGS} 2>&1
- if [ "$?" != "0" ]; then
- local saved_config="../config.log.$(date +%s)"
- cp config.log $saved_config
- chmod a+r $saved_config
- echo "Saved config.log is at $saved_config"
- cat /proc/mounts
- ls -l /proc/$$
- pwd
- echo "config.log contents:"
- cat config.log
- popd
- return 255
+ local rpmbuildopt='-tb'
+ if $NORPM; then
+ rpmbuildopt='-tc'
+ echo NORPM mode. Only compiling.
fi
- gen_lustre_version
+ ( $(skeep_ldiskfs_rpm $TAG) ) || {
- # hack. Somebody move build/lustre.spec to lustre.spec for b1_6
- local lustre_spec
- [ -f lustre.spec ] && lustre_spec=lustre.spec
- [ -f build/lustre.spec ] && lustre_spec=build/lustre.spec
+ pushd ldiskfs > /dev/null || return 255
- [ -f "$lustre_spec" ] && sed \
- -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
- < $lustre_spec \
- > ../lustre.spec
+ if ! ./configure --enable-dist; then
+ echo "failed to configure in ldiskfs"
+ popd >/dev/null # pushd ldiskfs
+ popd >/dev/null # pushd lustre
+ return 255
+ fi
- local rpmbuildopt='-bb'
- if $NORPM; then
- rpmbuildopt='-bc'
- echo NORPM mode. Only compiling.
- fi
+ if ! make dist 2>&1; then
+ popd >/dev/null # pushd ldiskfs
+ popd >/dev/null # pushd lustre
+ return 255
+ fi
+
+ #cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES || \
+ # fatal 1 "Could not copy lustre-ldiskfs*.tar.gz to $TOPDIR/SOURCES"
+
+ if ! $RPMBUILD $targets $rpmbuildopt lustre-ldiskfs*.tar.gz \
+ --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
+ --define "kdir $linux" \
+ ${linuxobj:+--define "kobjdir $linuxobj"} \
+ --define "_tmppath /var/tmp" \
+ --define "_topdir $TOPDIR" 2>&1; then
+ popd >/dev/null # pushd ldiskfs
+ popd >/dev/null # pushd lustre
+ return 255
+ fi
+
+ if $DO_SRC; then
+ if ! $RPMBUILD -ts lustre-ldiskfs*.tar.gz \
+ --define "configure_args $confoptions ${CONFIGURE_FLAGS}" \
+ --define "kdir $linux" \
+ ${linuxobj:+--define "kobjdir $linuxobj"} \
+ --define "_tmppath /var/tmp" \
+ --define "_topdir $TOPDIR" 2>&1; then
+ popd >/dev/null # pushd ldiskfs
+ popd >/dev/null # pushd lustre
+ return 255
+ fi
+ fi
+ popd >/dev/null # pushd ldiskfs
+
+ # tell lustre where ldiskfs is
+ # XXX - pointing to the RPM BUILD dir is a hack. we need to flesh
+ # out the ldiskfs RPM build so that it builds a
+ # lustre-ldiskfs-devel RPM and install that and point lustre
+ # to that instead
+ confoptions="$confoptions --with-ldiskfs=$(ls -d $TOPDIR/BUILD/lustre-ldiskfs-*)"
+ }
# convert the $PATCHLESS boolean to an empty/not-empty boolean
# as silly as this seems, it makes the syntax of the rpmbuild command
lustre_tests="no"
fi
- $RPMBUILD $targets $rpmbuildopt ../lustre.spec \
+ $RPMBUILD $targets $rpmbuildopt "$LUSTRE" \
${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 "kdir $linux" \
+ ${linuxobj:+--define "kobjdir $linuxobj"} \
--define "_tmppath $TMPDIR" \
--define "_topdir $TOPDIR" 2>&1 || \
fatal 1 "Error building rpms for $BUILD_ARCHS."
- popd >/dev/null
- ( $(skeep_ldiskfs_rpm $TAG) ) && return
-
- pushd lustre/ldiskfs || return 255
- make dist 2>&1
- if [ "$?" != "0" ]; then
- popd
- return 255
- fi
- cp lustre-ldiskfs*.tar.gz $TOPDIR/SOURCES
-
- gen_lustre_version
-
- local ldiskfs_spec=lustre-ldiskfs.spec
- [ -f "$ldiskfs_spec" ] && sed \
- -e "s^Release: .*$^Release: $LUSTRE_EXTRA_VERSION^" \
- < $ldiskfs_spec \
- > ../lustre-ldiskfs.spec
-
- if ! $RPMBUILD $targets $rpmbuildopt ../lustre-ldiskfs.spec \
- --define "_tmppath /var/tmp" \
- --define "_topdir $TOPDIR" 2>&1; then
- popd
- return 255
- fi
-
if $DO_SRC; then
- if ! $RPMBUILD -bs ../lustre-ldiskfs.spec \
- --define "_tmppath /var/tmp" \
- --define "_topdir $TOPDIR" 2>&1; then
+ if ! $RPMBUILD -ts "$LUSTRE" \
+ ${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 "kdir $linux" \
+ ${linuxobj:+--define "kobjdir $linuxobj"} \
+ --define "_tmppath $TMPDIR" \
+ --define "_topdir $TOPDIR" 2>&1; then
popd
return 255
fi
fi
- popd
+ popd >/dev/null
}
#check if we need to build separate ldiskfs RPM
skeep_ldiskfs_rpm() {
- local tag="$1"
-
- local skip=false
-
- if ! $LDISKFSRPM; then
- skip=true
- elif $PATCHLESS; then
- skip=true
- else
- for skiptag in $SKIPLDISKFSRPM; do
- [[ $tag == $skiptag ]] && skip=true && break
- done
- fi
+ local tag="$1"
- pushd $TOPDIR/BUILD/lustre-[1-9]* >/dev/null
- grep -q '^SERVER_TRUE[ \t]=[ \t]#$' autoMakefile && skip=true
- popd >/dev/null
+ local skip=false
- echo $skip
-
-}
-
-#generate LUSTRE_EXTRA_VERSION from EXTRA_VERSION
-gen_lustre_version() {
+ if ! $LDISKFSRPM; then
+ skip=true
+ elif $PATCHLESS; then
+ skip=true
+ else
+ for skiptag in $SKIPLDISKFSRPM; do
+ [[ $tag == $skiptag ]] && skip=true && break
+ done
+ fi
- LUSTRE_EXTRA_VERSION="${lnxmaj}-${EXTRA_VERSION}${FLAVOR_DELIMITER}${RPMSMPTYPE}"
- LUSTRE_EXTRA_VERSION=${LUSTRE_EXTRA_VERSION//-/_}
+ echo $skip
}
[ $infact_arch == $smp_type ] && RPMSMPTYPE=bigsmp && break
done
+ for smp_type in $PPC64_ARCHS; do
+ [ $infact_arch == $smp_type ] && RPMSMPTYPE=ppc64 && break
+ done
+
for smp_type in $DEFAULT_ARCHS; do
[ $infact_arch == $smp_type ] && RPMSMPTYPE=default && break
done
}
-# XXX this needs to be re-written as a wrapper around find_rpm
-# or just gotten rid of. :-)
-find_linux_rpm() {
- local prefix="$1"
-
- local pathtorpms="${KERNELRPMSBASE}/${lnxmaj}/${DISTRO}"
- [ -d $pathtorpms ] || return 255
-
- local kernelbinaryrpm rpmfile
- local wanted_kernel="${lnxmaj}${lnxmin}-${lnxrel}"
-
- local arch ret=1
- for arch in $TARGET_ARCHS_ALL; do
- local found_rpm="" rpm
- for rpm in ${pathtorpms}/${arch}/*.rpm; do
- if rpm -q --provides -p "$rpm" 2>&3 | grep -q "kernel${prefix} = $wanted_kernel" 2>&3; then
-
- found_rpm="$rpm"
- ret=0
- break
- fi
- done
- [ -f "$found_rpm" ] && break
- done
-
- echo "$found_rpm"
- return $ret
-
-}
-
# unpack kernel(/source/devel) RPM
#
# This function and it's setting of $LINUX and $LINUXOBJ is a total hack that
# call a distro specific hook, if available
if type -p unpack_linux_devel_rpm-$DISTRO; then
- unpack_linux_devel_rpm-$DISTRO "$kernelrpm"
+ if ! unpack_linux_devel_rpm-$DISTRO "$kernelrpm"; then
+ return 255
+ fi
fi
popd &>/dev/null
}
-# XXX - this rhel/sles goop needs abstracting out into the
-# lbuild-{rhel5,sles10} method files
-find_linux_devel_paths() {
- local path="$1"
-
- local RC=0
-
- pushd $path
- # RHEL-style and SLES-style rpms
- # XXX - until bug 19336 cleans this up, we need to extricate the
- # ${lnxmin}- from the $lnxrel
- local paths="kernels/${lnxmaj}${lnxmin}${delimiter}${lnxrel}-${TARGET_ARCH} linux-${lnxmaj}${lnxmin}${delimiter}${lnxrel##${lnxmin#.}-}"
-
- local path
- for path in $paths; do
- local src='usr/src'
-
- if [ -d "$src/$path/" ]; then
- LINUX="$(pwd)/$src/$path"
- fi
- # SLES has a separate -obj tree
- if [ -d "$src/${path}-obj" ]; then
- local src="$src/${path}-obj"
- local objects="$TARGET_ARCH/$RPMSMPTYPE"
-
- # Novell, are you *TRYING* to make life hard for me?
- if [ -d "$src/powerpc" ]; then
- objects="powerpc/$TARGET_ARCH"
- elif [ $TARGET_ARCH == 'i686' ]; then
- objects="i386/$RPMSMPTYPE"
- fi
-
- LINUXOBJ="$(pwd)/$src/$objects"
- fi
- done
- if [ -z "$LINUX" ]; then
- RC=255
- else
- # dig out the release version
- LINUXRELEASE=$(find_linux_release ${LINUXOBJ:-$LINUX})
- if [ -z "$LINUXRELEASE" ]; then
- echo "Failed to find linux release in ${LINUXOBJ:-$LINUX}"
- RC=255
- fi
- fi
- popd
- return $RC
-}
-
build_kernel_ib() {
local linux="$1"
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
let n=$n+1
done
- ed $SOURCE <<EOF
+ if [ $n -gt 1 ]; then
+ ed $SOURCE <<EOF
/^Source: /a
$ed_fragment1
.
.
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}" \
}
store_for_reuse() {
- local articles="$1"
- local module="$2"
- local location="$3"
- local signature="$4"
- local use_links="$5"
-
- local linkflag=""
- if $use_links; then
- linkflag="l"
+ local articles="$1"
+ local module="$2"
+ local location="$3"
+ local signature="$4"
+ local use_links="$5"
+
+ local linkflag=""
+ if $use_links; then
+ linkflag="l"
+ fi
+
+ local default_iface=$(/sbin/ip route get 192.1.1.1 | sed -ne 's/.* dev \(.*\) * src .*/\1/p')
+ if [ -z "$default_iface" ]; then
+ fatal 1 "Failed to determine the default route interface"
+ fi
+ local unique_id=$(/sbin/ip addr show dev $default_iface | sed -ne '/ inet /s/ *inet \(.*\)\/.*/\1/p' | head -1)
+ if [ -z "$unique_id" ]; then
+ fatal 1 "Failed to determine a unique id from interface $default_interface"
+ fi
+
+ local finallocation="$location"/"$signature"/"$module"
+ location="$location"/"$signature-${unique_id}"/"$module"
+ mkdir -p "$location"
+ # the cleanup script removes any directory that doesn't have a
+ # .lastused, so let's try to prevent that as soon as we can
+ # this solution still slightly racy with the cleanup script
+ # but the race is a lot tighter now
+ touch -t 197001010000 "$location/.lastused"
+ ## use eval/echo here to make sure shell expansions are performed
+ #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
+ local article
+ for article in $(eval echo $articles); do
+ if ! cp -a${linkflag} "$article" "$location"; then
+ error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
+ # rename the cache location so that it's not cached
+ # product, but is around for analysis
+ mv "$location"{,-bad-$(date +%s)} ||
+ error "failed to clean up a failed cache attempt" \
+ "in \"$location\" -- manual cleanup will be" \
+ "necessary"
+ return 1
fi
+ done
- location="$location"/"$signature"/"$module"
- mkdir -p "$location"
- # the cleanup script removes any directory that doesn't have a
- # .lastused, so let's try to prevent that as soon as we can
- # this solution still slightly racy with the cleanup script
- # but the race is a lot tighter now
- touch -t 197001010000 "$location/.lastused"
- ## use eval/echo here to make sure shell expansions are performed
- #if ! cp -a${linkflag} $(eval echo $articles) "$location"; then
- local article
- for article in $(eval echo $articles); do
- if ! cp -a${linkflag} "$article" "$location"; then
- error "Failed to copy \"$article\" to \"$location\" in store_for_reuse()"
- # rename the cache location so that it's not cached
- # product, but is around for analysis
- mv "$location"{,-bad-$(date +%s)} ||
- error "failed to clean up a failed cache attempt" \
- "in \"$location\" -- manual cleanup will be" \
- "necessary"
- return 1
- fi
- done
-
- # flag the cache as complete (i.e. in case lbuild was previously
- # interrupted while caching)
- touch "$location/.lastused"
+ # flag the cache as complete (i.e. in case lbuild was previously
+ # interrupted while caching)
+ touch "$location/.lastused"
- return 0
+ # put the temporary location into the final location
+ # (last one wins)
+ mkdir -p "${finallocation%/*}"
+ mv "$location" "$finallocation"
+ rmdir "${location%/*}"
+ return 0
}
find $dir -type f |
xargs ln -t $dest/RPMS/${dir##*/} -s
done
-
fi
return 0
else
}
-#
-# in a given directory, find the first rpm matching given requirements
-#
-find_rpm() {
- local dir="$1"
- local match_type="$2"
- local match="$3"
-
- pushd "$dir" > /dev/null || \
- fatal 1 "Unable to chdir to directory \"$dir\" in find_rpm()"
-
- local file
- for file in $(ls *.rpm); do
- if [ ! -f "$file" ]; then
- continue
- fi
- case "$match_type" in
- provides)
- # match is any valid ERE (i.e. given to egrep) match
- if rpm -q --provides -p "$file" 2>&3 | egrep -q "$match"; then
- echo "$file"
- popd >/dev/null
- return 0
- fi
- ;;
- *)
- popd >/dev/null
- fatal 1 "Unknown match type \"$match_type\" given to find_rpm()"
- ;;
- esac
- done
-
- popd >/dev/null
- return 1
-}
-
build_kernel_with_srpm() {
local outfd=$1
}
-build_mptlinux() {
- local linux="$1"
- local version="$2"
-
- if [ -z "$version" -o "$version" = "inkernel" ]; then
- return 0
- fi
-
- local targets arch
- for arch in $BUILD_ARCHS; do
- targets="--target $arch $targets"
- done
-
- local rpmbuildopt='-bb'
- if $NORPM; then
- rpmbuildopt='-bc'
- echo NORPM mode. Only compiling.
- fi
-
- # if only we could just rebuild the src.rpm. but the included spec
- # is a real pig's breakfast. just check out the patch we need to
- # apply to it to make it useful.
- #$RPMBUILD --rebuild \
- # --define "_topdir ${TOPDIR}" --target ${TARGET_ARCH} \
- # ${TOPDIR}/mptlinux-*.src.rpm
- rpm -ivh --define "_topdir ${TOPDIR}" ${TOPDIR}/mptlinux-*.src.rpm
-
- # now the big honkin' patch to the spec file
- pushd ${TOPDIR}/SPECS
- # to regen this patch use:
- # !!cd ~/rpm/SPECS/ && diff -u mptlinux.spec{.dist,}
- patch -p0 < ${TOPDIR}/lustre/build/mptlinux.spec.patch || fatal 1 "failed to patch mptlinux.spec"
- popd
-
- local targets arch
- for arch in $BUILD_ARCHS; do
- targets="--target $arch $targets"
- done
-
- local rpmbuildopt='-bb'
- if $NORPM; then
- rpmbuildopt='-bc'
- echo NORPM mode. Only compiling.
- fi
-
- if ! $RPMBUILD $targets $rpmbuildopt \
- --define "_tmppath /var/tmp" \
- --define "_topdir ${TOPDIR}" \
- --define "kernel_obj $linux" \
- ${TOPDIR}/SPECS/mptlinux.spec 2>&1; then
- return 1
- fi
- if $DO_SRC; then
- if ! $RPMBUILD -bs \
- --define "_tmppath /var/tmp" \
- --define "_topdir ${TOPDIR}" \
- --define "kernel_obj $linux" \
- ${TOPDIR}/SPECS/mptlinux.spec 2>&1; then
- return 1
- fi
- fi
-
- return 0
-
-}
-
-# build RDAC
-build_rdac() {
- local linux="$1"
- local version="$2"
-
- if [ -z "$version" -o "$version" = "inkernel" ]; then
- return 0
- fi
-
- # note that we use an _, not a . before the spec on purpose. we are not
- # allowed to have more than one file with a .spec trailer in a tarball
- # that is supposed to be usable with rpmbuild
- cp lustre/build/rdac_spec ${TOPDIR}/SPECS/rdac.spec || fatal 1 "Could not find rdac.spec in lustre/build"
-
- local targets arch
- for arch in $BUILD_ARCHS; do
- targets="--target $arch $targets"
- done
-
- local rpmbuildopt='-bb'
- if $NORPM; then
- rpmbuildopt='-bc'
- echo NORPM mode. Only compiling.
- fi
-
- local distro
- case $DISTRO in
- rhel5) distro="REDHAT"
- ;;
- sles1*) distro="SUSE"
- ;;
- *) echo "$DISTRO not supported by RDAC, skipping"
- return 0
- ;;
- esac
- if ! $RPMBUILD $targets $rpmbuildopt --define "dist $distro" \
- --define "_tmppath /var/tmp" \
- --define "_topdir ${TOPDIR}" \
- --define "kernel_obj $linux" \
- ${TOPDIR}/SPECS/rdac.spec 2>&1; then
- return 1
- fi
- if $DO_SRC; then
- if ! $RPMBUILD -bs --define "dist $distro" \
- --define "_tmppath /var/tmp" \
- --define "_topdir ${TOPDIR}" \
- --define "kernel_obj $linux" \
- ${TOPDIR}/SPECS/rdac.spec 2>&1; then
- return 1
- fi
- fi
-
- return 0
-}
-
# build OFED
# globals used:
# TOPDIR
local linux="$1"
local ofed_version="$2"
- # before lustre, build kernel-ib
- if [ -z "$ofed_version" -o "$ofed_version" = "inkernel" ]; then
+ # if an ofed version is given, then it means use OFED proper,
+ # not any vendor specific "inkernel" version
+ if [ -z "$ofed_version" ]; then
return 0
fi
+ if [ "$ofed_version" = "inkernel" ]; then
+ # see if there is a distro specific override for this and use
+ # that if it exists
+ # XXX we need to better integrate a distro specific override with
+ # the rest of this function so that all of the reuse cache
+ # stuff is leveraged given that 80% of this function is reuse
+ if type -p build_ofed-${DISTRO}; then
+ local ofed_location
+ ofed_location=$(build_ofed-${DISTRO} ${STDOUT})
+ local rc=${PIPESTATUS[0]}
+ CONFIGURE_FLAGS="--with-o2ib=${ofed_location} ${CONFIGURE_FLAGS}"
+ return $rc
+ else
+ return 0
+ fi
+ fi
+
+ # build kernel-ib
if $USE_BUILD_CACHE && [ -n "$REUSEBUILD" ]; then
local REUSE_SIGNATURE=$({ echo "$ofed_version";
echo "$(find_linux_release ${linux})";
ofed_version=$(echo $ofed_version |
sed -re 's/-(20[0-9]{6,6}-[0-9]{4,4}|rc[0-9]*)$//')
local rpm=$(ls $TOPDIR/RPMS/*/kernel-ib-devel-${ofed_version}-${linuxrelease//-/_}.*.rpm)
- rpm2cpio -itv < $rpm | cpio -id
+ if ! rpm2cpio < $rpm | cpio -id; then
+ fatal 1 "could not unpack the kernel-ib-devel rpm."
+ fi
CONFIGURE_FLAGS="--with-o2ib=$(pwd)/usr/src/ofa_kernel ${CONFIGURE_FLAGS}"
popd >/dev/null
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"
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"
- if ! $PATCHLESS; then
- # only need RDAC for the server
- build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" ||
- fatal 1 "error building RDAC"
- fi
-
- build_mptlinux "${LINUXOBJ:-$LINUX}" "$MPTLINUX_VERSION" ||
- fatal 1 "error building mptlinux"
-
# now build Lustre
if build_lustre "$LINUX" "$LINUXOBJ"; then
# the build worked. resolve any symlinked files (i.e. from reuse)
# in RPMS/$arch to real files so that that that huge mess of
# complication known as LTS can copy them yet somewhere else.
# is it any wonder this whole process is so damn so? anyone ever
- # heard of hardlinks? it this cool new thing that allows you save
+ # heard of hardlinks? it's this cool new thing that allows you save
# tons of time and space by creating... well you can go read about
# them if you have not heard about them yet.
# can i say how much the implemenation of all of this really impedes
# RPM reuse?
- pushd RPMS/$TARGET_ARCH
- for file in *; do
+ local dir
+ for dir in RPMS/*; do
+ pushd $dir
+ for file in $(ls); do
if [ -h $file ]; then
cp $file foo
mv foo $file
fi
done
- popd
+ popd
+ done
+ # also, for i?86, make sure all of the RPMs are in RPMS/$TARGET_ARCH
+ # as that's where LTS expects to find them
+ for dir in RPMS/*; do
+ if [ $dir = RPMS/$TARGET_ARCH ]; then
+ continue
+ fi
+ pushd $dir
+ local files=$(ls)
+ if [ -n "$files" ]; then
+ cp -al $files ../$TARGET_ARCH
+ fi
+ popd
+ done
else
return 1
fi
shift 2
;;
--lustre)
- LUSTRE=$2
+ if ! LUSTRE=$(canon_filepath "$2"); then
+ fatal 1 "Could not determine the canonical location of $2"
+ fi
shift 2
;;
--nodownload)
unpack_lustre
+# XXX - should we _always_ get the buildid from the META file? what are the
+# other (i.e. non-lustre-tarball use cases of lbuild)?
+BUILDID=$(sed -ne '/^BUILDID =/s/.*= *//p' lustre/META)
+
load_target
if [ -n "$OFED_VERSION" -a "$OFED_VERSION" != "inkernel" ]; then
unpack_ofed || fatal 1 "Error unpacking OFED tarball"
fi
-if [ -n "$MPTLINUX_VERSION" -a "$MPTLINUX_VERSION" != "inkernel" ]; then
- download_mptlinux
- unpack_mptlinux || fatal 1 "Error unpacking MPTLINUX distribution"
-fi
-
# make sure the RPM build environment is set up
create_rpmbuild_dirs
-if [ -n "$RDAC_VERSION" -a "$RDAC_VERSION" != "inkernel" ]; then
- download_rdac
- # we don't actually need to unpack this. just put it in the SOURCES dir
- #unpack_rdac || fatal 1 "Error unpacking RDAC tarball"
- cp "$KERNELTREE/rdac-LINUX-${RDAC_VERSION}-source.tar.gz" ${TOPDIR}/SOURCES/ ||
- fatal 1 "Error copying RDAC source tarball to RPM SOURCES dir"
-fi
-
# if an unpacked kernel source tree was given on the command line
# just build lustre with it (nothing distro kernel specific here)
if [ -n "$LINUX" ]; then
- build_mptlinux "${LINUXOBJ:-$LINUX}" "$MPTLINUX_VERSION" ||
- fatal 1 "error building mptlinux"
build_ofed "${LINUXOBJ:-$LINUX}" "$OFED_VERSION" ||
fatal 1 "error building OFED"
- if ! $PATCHLESS; then
- build_rdac "${LINUXOBJ:-$LINUX}" "$RDAC_VERSION" ||
- fatal 1 "error building RDAC"
- fi
build_lustre "$LINUX" "$LINUXOBJ"
else
if [ -f "${0%/*}/lbuild-$DISTRO" ]; then