# 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=
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
fi
- [ -z "$DISTRO" ] && DISTRO=$(autodetect_distro)
+ return 0
+
+}
+
+# autodetect target
+autodetect_target() {
+ local distro="$1"
+
+ local target=""
+ case ${distro} in
+ oel5) target="2.6-oel5";;
+ rhel5) target="2.6-rhel5";;
+ sles10) target="2.6-sles10";;
+ *) fatal 1 "I don't know what distro $distro is.\nEither update autodetect_target() or use the --target argument.";;
+ esac
+ echo ${target}
return 0
}
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"
+ if which lsb_release >/dev/null 2>&1; then
+ name="$(lsb_release -s -i)"
+ version="$(lsb_release -s -r)"
+ case "$name" in
+ "EnterpriseEnterpriseServer" | "ScientificSL")
+ name="oel"
+ version="${version%%.*}"
+ ;;
+ "RedHatEnterpriseServer")
+ name="rhel"
+ version="${version%%.*}"
+ ;;
+ "SUSE LINUX")
+ name="sles"
+ ;;
+ *)
+ fatal 1 "I don't know what distro name $name and version $version is.\nEither update autodetect_distro() or use the --distro argument."
+ ;;
+ esac
+ else
+ echo "You really ought to install lsb_release for accurate distro identification"
+ # try some heuristics
+ 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)
+ name=rhel
+ 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
fi
echo ${name}${version}
if $PATCHLESS || [ -n "$SERIES" ]; then
EXTRA_VERSION=$(echo $EXTRA_VERSION | sed -e "s/\(.*_lustre\)\..*/\1/")
# EXTRA_VERSION="${EXTRA_VERSION}-${TAG}.${TIMESTAMP}"
- EXTRA_VERSION="${EXTRA_VERSION}.${TIMESTAMP}"
+ if ! $PATCHLESS && [ -n "$BUILDID" ]; then
+ EXTRA_VERSION="${EXTRA_VERSION}.${BUILDID}"
+ fi
fi
fi
# EXTRA_VERSION=${EXTRA_VERSION//-/_}
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
-
- pushd $TOPDIR/BUILD/lustre-[1-9]* >/dev/null
- grep -q '^SERVER_TRUE[ \t]=[ \t]#$' autoMakefile && skip=true
- popd >/dev/null
+ local tag="$1"
- echo $skip
+ local skip=false
-}
-
-#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
}
}
store_for_reuse() {
- local articles="$1"
- local module="$2"
- local location="$3"
- local signature="$4"
- local use_links="$5"
+ 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 linkflag=""
+ if $use_links; then
+ linkflag="l"
+ fi
- 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
+ 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
- # flag the cache as complete (i.e. in case lbuild was previously
- # interrupted while caching)
- touch "$location/.lastused"
+ 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
- return 0
+ # flag the cache as complete (i.e. in case lbuild was previously
+ # interrupted while caching)
+ touch "$location/.lastused"
+
+ # put the temporary location into the final location
+ # (last one wins)
+ mkdir -p "${finallocation%/*}"
+ mv "$location" "$finallocation"
+ rmdir "${location%/*}"
+ return 0
}
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