Blob Blame History Raw
#!/bin/bash
# BEGIN_ICS_COPYRIGHT8 ****************************************
#
# Copyright (c) 2015-2020, Intel Corporation
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#     * Redistributions of source code must retain the above copyright notice,
#       this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of Intel Corporation nor the names of its contributors
#       may be used to endorse or promote products derived from this software
#       without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# END_ICS_COPYRIGHT8   ****************************************

# This file incorporates work covered by the following copyright and permission notice 

#[ICS VERSION STRING: unknown]

# Copyright (c) 2006 Mellanox Technologies. All rights reserved.
#
# This Software is licensed under one of the following licenses:
#
# 1) under the terms of the "Common Public License 1.0" a copy of which is
#    available from the Open Source Initiative, see
#    http://www.opensource.org/licenses/cpl.php.
#
# 2) under the terms of the "The BSD License" a copy of which is
#    available from the Open Source Initiative, see
#    http://www.opensource.org/licenses/bsd-license.php.
#
# 3) under the terms of the "GNU General Public License (GPL) Version 2" a
#    copy of which is available from the Open Source Initiative, see
#    http://www.opensource.org/licenses/gpl-license.php.
#
# Licensee has the right to choose one of the above licenses.
#
# Redistributions of source code must retain the above copyright
# notice and one of the license notices.
#
# Redistributions in binary form must reproduce both the above copyright
# notice, one of the license notices in the documentation
# and/or other materials provided with the distribution.


# rebuild MVAPICH2 to target a specific compiler

ID=""
VERSION_ID=""

if [ -e /etc/os-release ]; then
    . /etc/os-release
    if [[ "$ID" == "sle_hpc" ]]; then
        ID="sles"
    fi
else
    echo /etc/os-release is not available !!!
fi

if [[ ( "$ID" == "rhel"  &&  $(echo "$VERSION_ID > 7.3" | bc -l) == 1 ) || \
	( "$ID" == "sles"  && $(echo "$VERSION_ID > 12.2" | bc -l) == 1 ) ]]; then
    PREREQ=("rdma-core-devel" "mpi-selector")
else
    PREREQ=("libibverbs-devel" "librdmacm-devel" "mpi-selector")
fi

CheckPreReqs()
{
	e=0;
	i=0;
	while [ $i -lt ${#PREREQ[@]} ]; do
		rpm -q ${PREREQ[$i]} >/dev/null
		if [ $? -ne 0 ]; then
			if [ $e -eq 0 ]; then
				 echo
			fi
			echo "ERROR: Before re-compiling mvapich2 you must first install the ${PREREQ[$i]} package." >&2
			e+=1;
		fi
		i=$((i+1))
	done

	if [ $e -ne 0 ]; then
		if [ $e -eq 1 ]; then
			echo "ERROR: Cannot build. Please install the missing package before re-trying." >&2
		else
			echo "ERROR: Cannot build. Please install the listed packages before re-trying." >&2
		fi
		echo
		exit 2
	fi	
}

Usage()
{
	echo "Usage: do_mvapich2_build [-d] [-Q|-O] [config_opt [install_dir]]" >&2
	echo "       -d - use default settings for various MVAPICH2 capabilities" >&2
	echo "            if omitted, will be prompted for each capability" >&2
	echo "       -Q - build the MPI targeted for the PSM API." >&2
	echo "       -O - build the MPI targeted for the PSM2 API." >&2
	echo "       config_opt - a compiler selection option (gcc, pathscale, pgi or intel)" >&2
	echo "            if config_opt is not specified, the user will be prompted" >&2
	echo "            based on compilers found on this system" >&2
	echo "       install_dir - where to install MPI, see MPICH_PREFIX below" >&2
	echo "" >&2
	echo "Environment:" >&2
	echo "    STACK_PREFIX - where to find IB stack." >&2
	echo "    BUILD_DIR - temporary directory to use during build of MPI" >&2
	echo "            Default is /var/tmp/Intel-mvapich2" >&2
	echo "    MPICH_PREFIX - selects location for installed MPI" >&2
	echo "            default is /usr/mpi/<COMPILER>/mvapich2-<VERSION>" >&2
	echo "            where COMPILER is selected compiler (gcc, pathscale, etc above)" >&2
	echo "            VERSION is mvapich2 version (eg. 1.0.0)" >&2
	echo "    CONFIG_OPTIONS - additional MVAPICH2 configuration options to be" >&2
	echo "            specified to srpm" >&2
	echo "            Default is ''" >&2
	echo "    INSTALL_ROOT - location of system image in which to install." >&2
	echo "            Default is '/'" >&2
	echo "" >&2
	echo "The RPMs built during this process will be installed on this system" >&2
	echo "they can also be found in /usr/src/opa/MPI" >&2
	exit 2
}

unset MAKEFLAGS

# fixup possible missing path to X11
export PATH=$PATH:/usr/X11R6/bin

ARCH=$(uname -m | sed -e s/ppc/PPC/ -e s/powerpc/PPC/ -e s/i.86/IA32/ -e s/ia64/IA64/ -e s/x86_64/X86_64/)

target_cpu=$(rpm --eval '%{_target_cpu}')
dist_rpm_rel_int=0
if [ "$ARCH" = "PPC64" -a  -f /etc/issue ]
then
	# needed to test for SLES 10 SP1 on PPC64 below
	dist_rpm_rel=$(rpm --queryformat "[%{RELEASE}]\n" -q $(rpm -qf /etc/issue)|uniq)
	dist_rpm_rel_major="$(echo $dist_rpm_rel|cut -f1 -d.)"
	dist_rpm_rel_minor="$(echo $dist_rpm_rel|cut -f2 -d.)"
	# convert version to a 4 digit integer
	if [ $dist_rpm_rel_major -lt 10 ]
	then
		dist_rpm_rel_major="0$dist_rpm_rel_major";
	fi
	if [ $dist_rpm_rel_minor -lt 10 ]
	then
		dist_rpm_rel_minor="0$dist_rpm_rel_minor";
	fi
	dist_rpm_rel_int="$dist_rpm_rel_major$dist_rpm_rel_minor"
fi

nofort()
{
	echo "ERROR: No Fortran Compiler Found, unable to Rebuild MVAPICH2 MPI" >&2
	exit 1
}

# determine if the given tool/compiler exists in the PATH
have_comp()
{
	type $1 > /dev/null 2>&1
	return $?
}

# global $ans set to 1 for yes or 0 for no
get_yes_no()
{
	local prompt default input
	prompt="$1"
	default="$2"
	while true
	do
		echo -n "$prompt [$default]:"
		read input
		if [ "x$input" = x ]
		then
			input="$default"
		fi
		case "$input" in
		[Yy]*)	ans=1; break;;
		[Nn]*)	ans=0; break;;
		esac
	done
}

skip_prompt=n
iflag=n	# undocumented option, build in context of install
Qflag=n
Oflag=n
xflag=n	# undocumented option, source intel compiler environment
Vflag=n # undocumented option, build verbs only transport
while getopts "idQOV" o
do
	case "$o" in
	i) iflag=y;;
	Q) Qflag=y;;
	O) Oflag=y;;
	V) Vflag=y;;
	d) skip_prompt=y;;
	x) xflag=y;;
	*) Usage;;
	esac
done
shift $((OPTIND -1))
if [ $# -gt 2 ]
then
	Usage
fi

if [[  "$Vflag" == "y"  &&  \
	( "$Qflag" == "y" || "$Oflag" == "y" ) ]]; then
	echo "ERROR: Option -V cannot be used with any other" >&2
	exit 1
fi

if [ "$(/usr/bin/id -u)" != 0 ]
then
	echo "ERROR: You must be 'root' to run this program" >&2
	exit 1
fi
if [ "$iflag" = n ]
then
	cd /usr/src/opa/MPI
	if [ $? != 0 ]
	then
		echo "ERROR: Unable to cd to /usr/src/opa/MPI" >&2
		exit 1
	fi
fi

echo
echo "IFS MVAPICH2 MPI Library/Tools rebuild"

if [ x"$1" != x"" ]
then
	compiler="$1"
else
	compiler=none
	choices=""
	if have_comp gcc && { have_comp g77 || have_comp gfortran; }
	then
		choices="$choices gcc"
	fi
	if have_comp pathcc && have_comp pathcCC && have_comp pathf90
	then
		choices="$choices pathscale"
	fi
	if have_comp pgcc && have_comp pgf77 && have_comp pgf90
	then
		choices="$choices pgi"
	fi
	if have_comp icc && have_comp icpc && have_comp ifort
	then
		choices="$choices intel"
	fi
	if [ x"$choices" = x ]
	then
		nofort
	else
		PS3="Select Compiler: "
		select compiler in $choices
		do
			case "$compiler" in
			gcc|pathscale|pgi|intel) break;;
			esac
		done
	fi
fi

case "$compiler" in
gcc|pathscale|pgi|intel) >/dev/null;;
*)
	echo "ERROR: Invalid Compiler selection: $compiler" >&2
	exit 1;;
esac
shift
if [ ! -z "$1" ]
then
	export MPICH_PREFIX="$1"
fi

# set up intel compiler environment
if [ "$compiler" == "intel" -a "$xflag" == "y"  ]; then
        source /opt/intel/bin/compilervars.sh intel64
fi

PS3="Select MVAPICH2 Transport : "
choices=''
mvapich2_conf_impl=''
mvapich2_conf_impl_define=''
# Now get MVAPICH2 capability options. Note that you can't build for
# TrueScale and Omnipath at the same time.
if [ "$Vflag" == y ]
then
	interface=verbs
	mvapich2_conf_impl='ofa'

elif [ "$skip_prompt" == "n" -a "$Qflag" == "n" -a "$Oflag" == "n" ]
then
	echo
	# only have a choice if psm is installed
	if rpm -qa|grep infinipath-psm-devel >/dev/null 2>&1
	then
		choices+=("ts-psm")
		PS3="Select MVAPICH2 Transport: "
	fi
	if rpm -qa|grep libpsm2-devel >/dev/null 2>&1
	then
		choices+=("opa-psm2")
		PS3="Select MVAPICH2 Transport: "
	fi
	if [ ${#choices[@]} -gt 0 ] 
	then
		select mvapich2_conf_impl in ${choices[*]}
		do
			case "$mvapich2_conf_impl" in
			ts-psm)
				interface=psm
				Qflag=y
				Oflag=n
				break;;
			opa-psm2)
				interface=psm
				Oflag=y
				Qflag=n
				break;;
			esac
		done
	else
		echo "ERROR: No RDMA stack available."
		exit 1
	fi
else # Default to PSM2
	interface=psm
	Oflag=y
fi

case $interface in
	verbs)
		mvapich2_conf_impl_define="impl ofa"
		mvapich2_path_suffix=
		mvapich2_rpm_suffix=
		;;
	psm)
		mvapich2_conf_impl=psm
#		mvapich2_conf_impl_define="channel ch3:psm"
		mvapich2_conf_psm=
		if [ "$Oflag" == "y" ]
		then
			# PSM2 indicated by hfi suffix so user can ID from PSM and verbs MPIs
			mvapich2_conf_impl_define="impl psm2"
			mvapich2_path_suffix="-hfi"
			mvapich2_rpm_suffix="_hfi"
			PREREQ+=('libpsm2-devel')
		else
			# PSM indicated by qlc suffix so user can ID from PSM2 and  verbs MPIs
			mvapich2_conf_impl_define="impl psm"
			mvapich2_path_suffix="-qlc"
			mvapich2_rpm_suffix="_qlc"
			PREREQ+=('infinipath-psm-devel')
		fi
		;;
esac

CheckPreReqs

if [ "$skip_prompt" = y ]
then
	mvapich2_conf_romio=1
	mvapich2_conf_shared_libs=1
	mvapich2_conf_ckpt=0
	mvapich2_conf_blcr_home=""
else
	get_yes_no "Enable ROMIO support" "y"
	mvapich2_conf_romio=$ans

	get_yes_no "Enable shared library support" "y"
	mvapich2_conf_shared_libs=$ans

	if [ "$mvapich2_conf_impl" = "ofa" ]
	then
		while true
		do
			get_yes_no "Enable Checkpoint-Restart support" "n"
			mvapich2_conf_ckpt=$ans
			if [ $ans = 1 ]
			then
				echo -n "BLCR installation directory [or NONE if not installed]:"
				read mvapich2_conf_blcr_home
				if [ "$mvapich2_conf_blcr_home" = NONE -o x"$mvapich2_conf_blcr_home" = x ]
				then
					mvapich2_conf_blcr_home=""
				elif [ ! -d "$mvapich2_conf_blcr_home" ]
				then
					echo "$mvapich2_conf_blcr_home: Not Found"
				else
					break
				fi
			else
				mvapich2_conf_ckpt=0
				break
			fi
		done
	fi
fi

if [ "$ARCH" = "PPC64" -a \
	\( ! -f /etc/SuSE-release -o "$dist_rpm_rel_int" -le "1502" \) ]	# eg. 15.2
then
	export LDFLAGS="-m64 -g -O2 -L/usr/lib64 -L/usr/X11R6/lib64"
	export CFLAGS="-m64 -g -O2"
	export CPPFLAGS="-m64 -g -O2"
	export CXXFLAGS="-m64 -g -O2"
	export FFLAGS="-m64 -g -O2"
	export FCFLAGS="-m64 -g -O2"
	export LDLIBS="-m64 -g -O2 -L/usr/lib64 -L/usr/X11R6/lib64"
else
	# just to be safe
	unset LDFLAGS
	unset CFLAGS
	unset CPPFLAGS
	unset CXXFLAGS
	unset FFLAGS
	unset FCFLAGS
	unset LDLIBS
fi

logfile=make.mvapich2.$interface.$compiler
(
	STACK_PREFIX=${STACK_PREFIX:-/usr}
	BUILD_DIR=${BUILD_DIR:-/var/tmp/Intel-mvapich2}
	BUILD_ROOT="$BUILD_DIR/build";
	RPM_DIR="$BUILD_DIR/OFEDRPMS";
	DESTDIR=/usr/src/opa/MPI
	if [ "$iflag" = n ]
	then
	    mvapich2_srpm=/usr/src/opa/MPI/mvapich2-*.src.rpm
	    mpitests_srpm=/usr/src/opa/MPI/mpitests-*.src.rpm
	else
	    mvapich2_srpm=./SRPMS/mvapich2-*.src.rpm
	    mpitests_srpm=./SRPMS/mpitests-*.src.rpm
	fi
	mvapich2_version=$(ls $mvapich2_srpm 2>/dev/null|head -1|cut -f2 -d-)
	mvapich2_fullversion=$(ls $mvapich2_srpm 2>/dev/null|head -1|cut -f2- -d-|sed -e 's/.src.rpm//')
	mpitests_version=$(ls $mpitests_srpm 2>/dev/null|head -1|cut -f2 -d-)
	mpitests_fullversion=$(ls $mpitests_srpm 2>/dev/null|head -1|cut -f2- -d-|sed -e 's/.src.rpm//')
	MPICH_PREFIX=${MPICH_PREFIX:-$STACK_PREFIX/mpi/$compiler/mvapich2-$mvapich2_version$mvapich2_path_suffix}
	CONFIG_OPTIONS=${CONFIG_OPTIONS:-""}

	if [ x"$mvapich2_version" = x"" ]
	then
		echo "Error $mvapich2_srpm: Not Found"
		exit 1
	fi
	if [ x"$mpitests_version" = x"" ]
	then
		echo "Error $mpitests_srpm: Not Found"
		exit 1
	fi

	echo "Environment:"
	env
	echo "=========================================================="
	echo
	echo "Build Settings:"
	echo "STACK_PREFIX='$STACK_PREFIX'"
	echo "BUILD_DIR='$BUILD_DIR'"
	echo "MPICH_PREFIX='$MPICH_PREFIX'"
	echo "CONFIG_OPTIONS='$CONFIG_OPTIONS'"
	echo "MVAPICH2 Version: $mvapich2_version"
	echo "MVAPICH2 Full Version: $mvapich2_fullversion"
	echo "mpitests Version: $mpitests_version"
	echo "mpitests Full Version: $mpitests_fullversion"
	echo "=========================================================="
	if [ "$iflag" = n ]
	then
		echo "MPICH_PREFIX='$MPICH_PREFIX'"> /usr/src/opa/MPI/.mpiinfo
		#echo "MPI_RUNTIME='$MPICH_PREFIX/bin $MPICH_PREFIX/lib $MPICH_PREFIX/tests'">> /usr/src/opa/MPI/.mpiinfo
		echo "MPI_RPMS='mvapich2_$compiler$mvapich2_rpm_suffix-$mvapich2_fullversion.$target_cpu.rpm mpitests_mvapich2_$compiler$mvapich2_rpm_suffix-$mpitests_fullversion.$target_cpu.rpm'">> /usr/src/opa/MPI/.mpiinfo
		chmod +x /usr/src/opa/MPI/.mpiinfo
	fi

	echo
	echo "Cleaning build tree..."
	rm -rf $BUILD_DIR > /dev/null 2>&1

	echo "=========================================================="
	echo "Building MVAPICH2 MPI $mvapich2_version Library/Tools..."
	mkdir -p $BUILD_ROOT $RPM_DIR/BUILD $RPM_DIR/RPMS $RPM_DIR/SOURCES $RPM_DIR/SPECS $RPM_DIR/SRPMS

	disable_auto_requires=""
	# need to create proper mvapich2_comp_env value for MVAPICH2 builds
	case "$compiler" in
	gcc)
		if have_comp gfortran
		then
			if [ "$ARCH" = "PPC64" ]
			then
				mvapich2_comp_env='CC="gcc -m64" CXX="g++ -m64" F77="gfortran -m64" FC="gfortran -m64"'
			else
				mvapich2_comp_env='CC=gcc CXX=g++ F77=gfortran FC=gfortran'
				if [[ ( "$ID" == "rhel"  &&  $(echo "$VERSION_ID >= 8.0" | bc -l) == 1 ) ]]; then
					mvapich2_comp_env="$mvapich2_comp_env CFLAGS='-fPIC'"
				fi
			fi
		else
			if [ "$ARCH" = "PPC64" ]
			then
				mvapich2_comp_env='CC="gcc -m64" CXX="g++ -m64" F77="g77 -m64" FC="/bin/false"'
			else
				mvapich2_comp_env='CC=gcc CXX=g++ F77=g77 FC=/bin/false'
				if [[ ( "$ID" == "rhel"  &&  $(echo "$VERSION_ID >= 8.0" | bc -l) == 1 ) ]]; then
					mvapich2_comp_env="$mvapich2_comp_env CFLAGS='-fPIC'"
				fi
			fi
		fi;;

	pathscale)
		disable_auto_requires="--define 'disable_auto_requires 1'"
		mvapich2_comp_env='CC=pathcc CXX=pathCC F77=pathf90 FC=pathf90'
		if [ "$target_cpu" = "i686" && $mvapich2_conf_shared_libs  = 1 ]
		then
			# on i686 with shared libs need -g for MVAPICH2
			mvapich2_comp_env="$mvapich2_comp_env OPT_FLAG='-g'"
		fi;;

	pgi)
		disable_auto_requires="--define 'disable_auto_requires 1'"
		mvapich2_comp_env='CC=pgcc CXX=pgCC F77=pgf77 FC=pgf90';;

	intel)
		disable_auto_requires="--define 'disable_auto_requires 1'"
		if [ "$mvapich2_conf_shared_libs" = 1 ] 
		then
			mvapich2_comp_env='CC=icc CXX=icpc F77=ifort FC=ifort'
		else
			mvapich2_comp_env='CC=icc CXX=icpc F77=ifort FC=ifort'
		fi;;

	*)
		echo "ERROR: Invalid compiler"
		exit 1;;
	esac

	# HWLOC component auto detects CUDA and will use it if found on the system
	# So, tell HWLOC to ignore CUDA: enable_gl=no
	pref_env="enable_gl=no"
	if [ "$STACK_PREFIX" != "/usr" ]
	then
		pref_env="$pref_env LD_LIBRARY_PATH=$STACK_PREFIX/lib64:$STACK_PREFIX/lib:\$LD_LIBRARY_PATH"
	fi

	cmd="$pref_env rpmbuild --rebuild \
				--define '_topdir $RPM_DIR' \
				--buildroot '$BUILD_ROOT' \
				--define 'build_root $BUILD_ROOT' \
				--target $target_cpu \
				--define '_name mvapich2_$compiler$mvapich2_rpm_suffix' \
				--define 'compiler $compiler' \
				--define '$mvapich2_conf_impl_define' \
				--define 'open_ib_home $STACK_PREFIX' \
				--define '_usr $STACK_PREFIX' \
				--define 'comp_env $mvapich2_comp_env $CONFIG_OPTIONS $mvapich2_conf_psm' \
				--define 'auto_req 0' \
				--define 'mpi_selector $STACK_PREFIX/bin/mpi-selector' \
				--define '_prefix $MPICH_PREFIX'"
	#cmd="$cmd --define 'shared_libs $mvapich2_conf_shared_libs'"
	if [ "$mvapich2_conf_shared_libs" = 1 ]
	then
		cmd="$cmd --define 'shared_libs $mvapich2_conf_shared_libs'"
	fi
	#cmd="$cmd --define 'romio $mvapich2_conf_romio'"
	if [ "$mvapich2_conf_romio" = 1 ]
	then
		cmd="$cmd --define 'romio $mvapich2_conf_romio'"
	fi
	if [ "$mvapich2_conf_impl" = "ofa" ]
	then
		cmd="$cmd --define 'rdma --with-rdma=gen2' \
				--define 'ib_include --with-ib-include=$STACK_PREFIX/include'"
		if [ "$ARCH" = "PPC64" -o "$ARCH" = "X86_64" ]
		then
			cmd="$cmd --define 'ib_libpath --with-ib-libpath=$STACK_PREFIX/lib64'"
		else
			cmd="$cmd --define 'ib_libpath --with-ib-libpath=$STACK_PREFIX/lib'"
		fi
		if [ "$mvapich2_conf_ckpt" = 1 ]
		then
			cmd="$cmd --define 'blcr 1'"
			cmd="$cmd --define 'blcr_include --with-blcr-include=$mvapich2_conf_blcr_home/include' \
				--define 'blcr_libpath --with-blcr-libpath=$mvapich2_conf_blcr_home/lib'"
		fi
	elif [ "$mvapich2_conf_impl" = "psm" ]
	then
		# no special args needed
		> /dev/null
	else
		echo "ERROR: Invalid mvapich2_conf_impl: $mvapich2_conf_impl" >&2
		exit 1
	fi

	cmd="$cmd \
				$mvapich2_srpm"
	echo "Executing: $cmd"
	eval $cmd
	if [ $? != 0 ]
	then
		echo "error: mvapich2_$compiler$mvapich2_rpm_suffix Build ERROR: bad exit code"
		exit 1
	fi
	if [ "$iflag" = n ]
	then
		cp $RPM_DIR/RPMS/$target_cpu/mvapich2_$compiler$mvapich2_rpm_suffix-$mvapich2_fullversion.$target_cpu.rpm $DESTDIR
	fi

	echo "=========================================================="
	echo "Installing MVAPICH2 MPI $mvapich2_version Library/Tools..."
	rpmfile=$RPM_DIR/RPMS/$target_cpu/mvapich2_$compiler$mvapich2_rpm_suffix-$mvapich2_fullversion.$target_cpu.rpm

	# need force for reinstall case
	if [ x"$INSTALL_ROOT" != x"" -a x"$INSTALL_ROOT" != x"/" ]
	then
		tempfile=/var/tmp/rpminstall.tmp.rpm
		mkdir -p $INSTALL_ROOT/var/tmp
		cp $rpmfile $INSTALL_ROOT$tempfile
		chroot /$INSTALL_ROOT rpm -Uv --force $tempfile
		rm -f $tempfile
	else
		rpm -Uv --force $rpmfile
	fi

	echo "=========================================================="
	echo "Building test programs $mpitests_version for MVAPICH2 MPI $mvapich2_version..."
	# mpitests uses buildroot instead of build_root, play it safe for future
	# and define both
	cmd="$pref_env rpmbuild --rebuild \
				--define '_topdir $RPM_DIR' \
				--buildroot '$BUILD_ROOT' \
				--define 'buildroot $BUILD_ROOT' \
				--define 'build_root $BUILD_ROOT' \
				--target $target_cpu \
				--define '_name mpitests_mvapich2_$compiler$mvapich2_rpm_suffix' \
				--define 'root_path /' \
				--define '_usr $STACK_PREFIX' \
				--define 'path_to_mpihome $MPICH_PREFIX' \
				$disable_auto_requires \
				$mpitests_srpm"
	echo "Executing: $cmd"
	eval $cmd
	if [ $? != 0 ]
	then
		echo "error: mpitests_mvapich2_$compiler$mvapich2_rpm_suffix Build ERROR: bad exit code"
		exit 1
	fi
	
	if [ "$iflag" = n ]
	then
		mv $RPM_DIR/RPMS/$target_cpu/mpitests_mvapich2_$compiler$mvapich2_rpm_suffix-$mpitests_fullversion.$target_cpu.rpm $DESTDIR

		echo "=========================================================="
		echo "Installing test programs $mpitests_version for MVAPICH2 MPI $mvapich2_version..."
		rpmfile=$DESTDIR/mpitests_mvapich2_$compiler$mvapich2_rpm_suffix-$mpitests_fullversion.$target_cpu.rpm
		# need force for reinstall case
		if [ x"$INSTALL_ROOT" != x"" -a x"$INSTALL_ROOT" != x"/" ]
		then
			tempfile=/var/tmp/rpminstall.tmp.rpm
			mkdir -p $INSTALL_ROOT/var/tmp
			cp $rpmfile $INSTALL_ROOT$tempfile
			chroot /$INSTALL_ROOT rpm -Uv --force $tempfile
			rm -f $tempfile
		else
			rpm -Uv --force $rpmfile
		fi

		rm -rf $BUILD_DIR
	fi
) 2>&1|tee $logfile.res
set +x

# review log for errors and warnings
# disable output of build warnings, way too many
#echo
#echo "Build Warnings:"
# ignore the warning for old C++ header usage in sample programs
egrep 'warning:' $logfile.res |sort -u |
	egrep -v 'at least one deprecated or antiquated header.*C\+\+ includes' > $logfile.warn
#cat $logfile.warn
#echo

if egrep 'error:|Error | Stop' $logfile.res > $logfile.err
then
	echo "Build Errors:"
	sort -u $logfile.err
	echo
	echo "FAILED Build, errors detected"
	exit 1
elif [ -s $logfile.warn ]
then
	# at present lots of warnings are expected
	echo "SUCCESSFUL Build, no errors detected"
	exit 0

	# No warnings are expected
	echo "QUESTIONABLE Build, warnings detected"
	exit 1
else
	echo "SUCCESSFUL Build, no errors detected"
	exit 0
fi