#!/bin/bash POSIXLY_CORRECT=1 # If there are any errors at all, fail. set -e usage() { echo "Usage: torque-build []" echo " Where can be one of:" echo " -h|--help Print this help page" echo " -r|--root-path Root path of the MOAB source code" echo " (default is the current" echo " directory)" echo " -d|--debug Enable debug mode" echo " -q|--quiet Enable quiet mode" echo " -p|--hwloc-path Path to the hwloc package (required by cgroups)" echo " (default is /usr/local)" echo " -v|--verbose Enable verbose mode" echo echo " -t|--tarball Make the TORQUE distribution tarball" echo " -T|--no-tarball Do not make the TORQUE distribution tarball" echo " (takes precedent over quiet mode)" echo " -a|--adaptive-rpm Make the adaptive RPM (default)" echo " -A|--no-adaptive-rpm Do not make the adaptive RPM" echo "" echo " -c|--coverity Run coverity using the " echo " script (e.g.," echo " /opt/coverity/default/bin/cov-build)" echo " -C|--no-coverity Do not run coverity (default)" echo "" echo " -g|--enable-cgroups Enable cgroups (default)" echo " -G|--disable-cgroups Do not enable cgroups" echo " -u|--unit-tests Run unit-tests (default)" echo " -U|--no-unit-tests Do not run unit tests" echo "" echo " -j Passes '-j ' to make" echo " ('3' by default)" exit 1 } # Default values for options root_path="${PWD}" verbose=0 debug=0 quiet=0 adaptive_rpm=1 coverity=0 unit_tests=1 parallel=3 tarball=1 cgroups=1 hwloc_path=/usr/local configure_options="" # To be set later version= release= cov_build= while [ -n "${1}" ] do case "${1}" in -h|--help) usage ;; -r|--root-path) shift root_path="${1}" shift ;; -p|--hwloc-path) shift hwloc_path="${1}" shift ;; -n|--name-suffix) shift name_suffix="${1}" shift ;; -d|--debug) debug=1 verbose=1 shift ;; -q|--quiet) quiet=1 shift ;; -v|--verbose) verbose=1 shift ;; -a|--adaptive-rpm) adaptive_rpm=1 shift ;; -A|--no-adaptive-rpm) adaptive_rpm=0 shift ;; -t|--tarball) tarball=1 shift ;; -T|--no-tarball) tarball=0 shift ;; -c|--coverity) coverity=1 shift cov_build="${1}" shift ;; -C|--no-coverity) coverity=0 shift ;; -u|--unit-tests) unit_tests=1 shift ;; -U|--no-unit-tests) unit_tests=0 shift ;; -j) shift parallel="${1}" shift ;; -g|--enable-cgroups) cgroups=1 shift ;; -G|--disable-cgroups) cgroups=0 with_option="$with_option --without cgroups --without hwloc" shift ;; *) echo "Invalid argument '${1}' specified." >&2 usage ;; esac done # Argument processing if [ ${tarball} -eq 0 -a \ ${adaptive_rpm} -eq 0 -a \ ${coverity} -eq 0 -a \ ${unit_tests} -eq 0 ] then echo "No artifacts or tests were requested." >&2 usage fi # Root path needs to be an absolute path if ! echo "${root_path}" | grep -q -E '^(/[^/]*)+$' then root_path="${PWD}/${root_path}" fi if echo "${root_path}" | grep -q -E '^/+$' then echo "The root path to the source code must not be '/'." >&2 usage fi if [ ! -s "${root_path}/configure.ac" -o ! -d "${root_path}/buildutils" ] || \ ! grep -q -E 'AC_INIT[[:blank:]]*\([[:blank:]]*\[torque\]' \ "${root_path}/configure.ac" then echo "It appears that '${root_path}' doesn't describe the root source" >&2 echo " path for TORQUE." >&2 usage fi cd "${root_path}" if [ ${verbose} -ne 0 ] then set -x fi if [ ${verbose} -ne 0 ] then quiet=0 fi quiet_redirect="" if [ ${quiet} -ne 0 ] then quiet_redirect=">/dev/null" fi if ! echo "${parallel}" | grep -q -E '^[[:digit:]]+$' then echo "Argument provided to the '-j' option must be a number." >&2 usage fi epoch=`date +%s` print_build_date="`date --date="@$epoch"`" branch=`git branch | awk '/^[*]/ { print $2}'` version=`buildutils/determine.version` release=`buildutils/determine.release` distro=`buildutils/determine.distro -c` if [ -z "${version}" ] then echo "A could not be found." >&2 echo " Perhaps this is not a TORQUE repository?" >&2 usage fi if [ "${release}" = "_" ] then echo "Something went wrong in creating the release number." >&2 usage fi echo "Started ${0}, version ${version}, release ${release}." \ ${quiet_redirect} if [ $cgroups -ne 0 ] then cgroupsopts="--enable-cgroups" configure_options="$configure_options --enable-cgroups --with-hwloc-path=$hwloc_path" else hwloc_path=none cgroupsopts="--disable-cgroups" fi # set so child makefiles know this export FROM_TORQUE_BUILD=1 echo $(git rev-parse HEAD) > current_hash sh autogen.sh ./configure $configure_options if [ ${coverity} -ne 0 -o ${unit_tests} -ne 0 ] then ./configure --with-debug --with-check make -j${parallel} clean || : fi if [ ${coverity} -ne 0 ] then if [ ! -x "${cov_build}" ] then echo "'${cov_build}' is not a valid script." >&2 usage fi "${cov_build}" --dir cov-int make fi if [ ${unit_tests} -ne 0 ] then make -j${parallel} chmod +x src/test/test_scripts/* make check make check | ./parse_cov_results.py fi if [[ ${version} =~ ^[0-9]+\.[0-9]+((\.[0-9]+)*\.?(a|b|r?c)[0-9]+|(\.[0-9]+)+(\.h[0-9]+)?)$ ]] then package_version="${version}" release=1 else package_version="${version}-${release}" fi distdir="torque-${package_version}" if [ ${tarball} -ne 0 ] then make -j${parallel} clean make -j${parallel} distclean sh autogen.sh ./configure $configure_options make distcheck -j${parallel} distdir="${distdir}" fi # TORQUE RPMs ################################################################## if [ ${adaptive_rpm} -ne 0 ] then # blow away old build stuff rm -rf buildutils/rpmbuild mkdir -p buildutils/rpmbuild/tmp chmod a+rwxt buildutils/rpmbuild/tmp mkdir -p buildutils/rpmbuild/BUILD mkdir -p buildutils/rpmbuild/SOURCES mkdir -p buildutils/rpmbuild/SPECS mkdir -p buildutils/rpmbuild/RPMS/{i386,i686,noarch,x86_64} # ignore SP version suffix for SLES12 echo "${distro}" | fgrep -q sles12. && distro=sles12 if [ "${distro}" = el7 ]; then cp buildutils/torque.adaptive.spec.el7 \ buildutils/rpmbuild/SPECS/torque.adaptive.spec elif [ "${distro}" = el6 ]; then cp buildutils/torque.adaptive.spec.el6 \ buildutils/rpmbuild/SPECS/torque.adaptive.spec elif [ "${distro}" = sles12 ]; then cp buildutils/torque.adaptive.spec.sles12 \ buildutils/rpmbuild/SPECS/torque.adaptive.spec else echo "RPM building not supported for distro $distro" >&2 exit 1 fi source_file=${distdir}.tar.gz if [ ! -s "${source_file}" ] then echo "TORQUE tarball '${source_file}' not found!" >&2 exit 1 fi cp -f "${source_file}" buildutils/rpmbuild/SOURCES verbose_option= if [ ${debug} -ne 0 ] then verbose_option="-vv" elif [ ${quiet} -ne 0 ] then verbose_option="--quiet" elif [ ${verbose} -ne 0 ] then verbose_option="-v" else verbose_option="" fi rpmbuild_option="-ba" test ${quiet} -eq 0 && echo "Making adaptive rpm..." mkdir -p buildutils/rpmbuild/moab-workload-manager-${version} rpmbuild ${verbose_option} ${rpmbuild_option} ${with_option} \ buildutils/rpmbuild/SPECS/torque.adaptive.spec \ --buildroot "%{_topdir}/moab-torque${version}" \ --define "_topdir ${root_path}/buildutils/rpmbuild" \ --define "_rpmdir ${root_path}/buildutils/rpmbuild/RPMS" \ --define "_sourcedir ${root_path}/buildutils/rpmbuild/SOURCES" \ --define "_specdir ${root_path}/buildutils/rpmbuild/SPECS" \ --define "_tmppath ${root_path}/buildutils/rpmbuild/tmp" \ --define "_hwlocpath $hwloc_path" \ --define "_cgroupsopt ${cgroupsopts}" \ --define "version ${version}" \ --define "release ${release}.${distro}" \ --define "source_file ${source_file}" \ --define "base_name ${distdir}" fi