335 lines
9.5 KiB
Bash
Executable file
335 lines
9.5 KiB
Bash
Executable file
#---------------------------------*- sh -*-------------------------------------
|
|
# ========= |
|
|
# \\ / F ield | foam-extend: Open Source CFD
|
|
# \\ / O peration |
|
|
# \\ / A nd | For copyright notice see file Copyright
|
|
# \\/ M anipulation |
|
|
#------------------------------------------------------------------------------
|
|
# License
|
|
# This file is part of foam-extend.
|
|
#
|
|
# foam-extend is free software: you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by the
|
|
# Free Software Foundation, either version 3 of the License, or (at your
|
|
# option) any later version.
|
|
#
|
|
# foam-extend is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
# File
|
|
# makeThirdPartyFunctionsForRPM
|
|
#
|
|
# Description
|
|
# Functions for managing the third-party packages with RPM
|
|
#
|
|
#------------------------------------------------------------------------------
|
|
|
|
# define the build and the system architecture type
|
|
buildBase=$WM_THIRD_PARTY_DIR/rpmBuild
|
|
architecture=`rpm --eval "%{_target_cpu}"`
|
|
|
|
RPM_CMD='rpm'
|
|
RPM_CMD_XTRA_OPTIONS=''
|
|
|
|
# Adjust the rpm command options on Ubuntu/Debian based systems
|
|
${RPM_CMD} --force-debian >& /dev/null
|
|
|
|
RETVAL=$?
|
|
[ $RETVAL -eq 0 ] && RPM_CMD_XTRA_OPTIONS="--force-debian" #Success : Debian system
|
|
|
|
echo ""
|
|
echo "This system rpm command: ${RPM_CMD} ${RPM_CMD_XTRA_OPTIONS}"
|
|
echo ""
|
|
|
|
#
|
|
# Download/Build/Uninstall/Install a package
|
|
#
|
|
rpm_make()
|
|
{
|
|
# Avoid word splitting on 'space'
|
|
IFS=$'\n'
|
|
|
|
# sort arguments
|
|
_PACKAGE=''
|
|
_SPECFILE=''
|
|
_PACKAGE_URL=''
|
|
_ADDITIONALFLAGS=''
|
|
_RPMFILENAME=''
|
|
|
|
while getopts p:s:u:f:n:a: flags
|
|
do
|
|
case $flags in
|
|
p) _PACKAGE=$OPTARG
|
|
;;
|
|
u) _PACKAGE_URL=$OPTARG
|
|
;;
|
|
s) _SPECFILE=$OPTARG
|
|
;;
|
|
f) _ADDITIONALFLAGS=$OPTARG
|
|
;;
|
|
n) _RPMFILENAME=$OPTARG
|
|
;;
|
|
a) architecture=$OPTARG
|
|
;;
|
|
esac
|
|
done
|
|
|
|
echo "Package name : $_PACKAGE"
|
|
echo "Package URL : $_PACKAGE_URL"
|
|
echo "RPM spec file name: $_SPECFILE"
|
|
echo "RPM file name : $_RPMFILENAME"
|
|
echo "Additional flags : $_ADDITIONALFLAGS"
|
|
|
|
# Shift options
|
|
shift `expr $OPTIND - 1`
|
|
|
|
# Make sure the ThirdParty environment is up-to-date
|
|
echo "Updating the ThirdParty environment variables before building package $_PACKAGE"
|
|
. $WM_PROJECT_DIR/etc/settings.sh
|
|
|
|
if [ "$_RPMFILENAME" = "" ]; then
|
|
rpmName=$_PACKAGE-$WM_OPTIONS.$architecture
|
|
else
|
|
# Filename for the RPM was overridden from the command line
|
|
rpmName=$_RPMFILENAME
|
|
fi
|
|
|
|
rpmFile=$buildBase/RPMS/$architecture/$rpmName.rpm
|
|
|
|
echo "RPM file name : $rpmFile"
|
|
|
|
# We check immediatly if the RPM binary package is available in the local RPMs vault.
|
|
# If so, we basically uninstall/reinstall the package. This is handy for installation
|
|
# on machines with no Internet access, so without downloading capabilities. If one wants to
|
|
# force the recompilation of a given package, just make sure to move the corresponding RPM
|
|
# binary package away from the local RPM vault.
|
|
#
|
|
if [ ! -e "$rpmFile" ]; then
|
|
#
|
|
# The package's RPM is absent. We build from the package source tarball
|
|
#
|
|
cd $buildBase
|
|
|
|
#
|
|
# Do we need to download the package using the supplied URL
|
|
if [ -n "$_PACKAGE_URL" ]; then
|
|
packageTarBall=`basename $_PACKAGE_URL`
|
|
|
|
if [ ! -e "SOURCES/$packageTarBall" ]; then
|
|
echo "Download $packageTarBall from : $_PACKAGE_URL"
|
|
#( cd SOURCES; wget --no-check-certificate $_PACKAGE_URL )
|
|
|
|
( cd SOURCES; curl --connect-timeout 60 \
|
|
--max-time 10 \
|
|
--retry 6 \
|
|
--retry-delay 10 \
|
|
--retry-max-time 60 \
|
|
-L -k -O $_PACKAGE_URL )
|
|
fi
|
|
fi
|
|
|
|
echo "Making package $_PACKAGE using RPM."
|
|
rpm_build ${_PACKAGE} ${_SPECFILE} ${_ADDITIONALFLAGS} "$@"
|
|
#rpm_build_install_stage_only ${_PACKAGE} ${_SPECFILE} ${_ADDITIONALFLAGS} "$@"
|
|
fi
|
|
|
|
# Install RPM package if not done already
|
|
if [ "$architecture" = "noarch" ]; then
|
|
installDir=$WM_THIRD_PARTY_DIR/packages/$_PACKAGE/platforms/noarch
|
|
else
|
|
installDir=$WM_THIRD_PARTY_DIR/packages/$_PACKAGE/platforms/$WM_OPTIONS
|
|
fi
|
|
|
|
if [ ! -e "$installDir" ]; then
|
|
echo "Installing package: $_PACKAGE"
|
|
rpm_uninstall $_PACKAGE $rpmName
|
|
rpm_install $_PACKAGE $rpmName $rpmFile
|
|
else
|
|
echo "Package $_PACKAGE is already installed"
|
|
fi
|
|
|
|
unset _PACKAGE
|
|
unset _SPECFILE
|
|
unset _PACKAGE_URL
|
|
unset _ADDITIONALFLAGS
|
|
unset _RPMFILENAME
|
|
|
|
echo "Done installing package $_PACKAGE"
|
|
echo ""
|
|
}
|
|
|
|
#
|
|
# Build a RPM file using the package SPEC file
|
|
#
|
|
rpm_build()
|
|
{
|
|
package="$1"
|
|
specFile="$2"
|
|
shift 2
|
|
|
|
cd $buildBase
|
|
|
|
[ -e ./SPECS/$specFile ] || {
|
|
echo "rpm_build: Error: missing SPEC file for package $package. Aborting."
|
|
exit -1
|
|
}
|
|
|
|
#Build RPM package
|
|
echo "Building package $package using SPEC file : $specFile. Optional args: $@"
|
|
#rpmbuild --define "_topdir $buildBase" --dbpath $buildBase/rpmDB --clean -bb ./SPECS/$specFile "$@"
|
|
#
|
|
# Let's keep the compilation directory alive for now in order to facilitate postmortems of failed compilations
|
|
rpmbuild --define "_topdir $buildBase" --dbpath $buildBase/rpmDB -bb ./SPECS/$specFile "$@"
|
|
}
|
|
|
|
#
|
|
# Build a RPM file using the package SPEC file. This function will only call the "%install" stage.
|
|
# Useful for debugging the "%install" stage.
|
|
#
|
|
rpm_build_install_stage_only()
|
|
{
|
|
package="$1"
|
|
specFile="$2"
|
|
shift 2
|
|
|
|
cd $buildBase
|
|
|
|
[ -e ./SPECS/$specFile ] || {
|
|
echo "rpm_build: Error: missing SPEC file for package $package. Aborting."
|
|
exit -1
|
|
}
|
|
|
|
#Build RPM package
|
|
echo "Building package $package using SPEC file : $specFile. Optional args: $@"
|
|
#rpmbuild --define "_topdir $buildBase" --dbpath $buildBase/rpmDB --clean -bb ./SPECS/$specFile "$@"
|
|
#
|
|
# Let's keep the compilation directory alive for now in order to facilitate postmortems of failed compilations
|
|
rpmbuild --define "_topdir $buildBase" --dbpath $buildBase/rpmDB --short-circuit -bi ./SPECS/$specFile "$@"
|
|
}
|
|
|
|
#
|
|
# Uninstall a package using its RPM
|
|
#
|
|
rpm_uninstall()
|
|
{
|
|
package="$1"
|
|
rpmName="$2"
|
|
|
|
cd $buildBase
|
|
|
|
echo " Uninstalling $package using RPM: $rpmName"
|
|
${RPM_CMD} ${RPM_CMD_XTRA_OPTIONS} -e $rpmName --dbpath $buildBase/rpmDB --norepackage >& /dev/null
|
|
|
|
# Note: rpm will rant when uninstalling packages with an error message
|
|
# starting with "error: LOOP:"
|
|
# Googling about this problem shows that this error is benign, and
|
|
# is related to the list of the files included in the RPM, and the
|
|
# syntax used in the SPEC file. Need to revisit later... MB
|
|
}
|
|
|
|
#
|
|
# Install a package using its relocatable RPM
|
|
#
|
|
rpm_install()
|
|
{
|
|
package="$1";
|
|
rpmName="$2";
|
|
rpmFile="$3";
|
|
|
|
echo " Installing $package using RPM file: $rpmFile";
|
|
${RPM_CMD} ${RPM_CMD_XTRA_OPTIONS} -ivh \
|
|
$rpmFile \
|
|
--dbpath $buildBase/rpmDB --force --nodeps;
|
|
}
|
|
|
|
#
|
|
# Populate the local RPM vault with comand-line supplied list of RPMs
|
|
#
|
|
rpm_makeRPMvault()
|
|
{
|
|
rpmVault=$buildBase/RPMS/$architecture
|
|
|
|
if [ ! -e $rpmVault ]; then
|
|
echo ""
|
|
echo "Making directory for RPM-files $rpmVault"
|
|
echo ""
|
|
|
|
mkdir -p $rpmVault
|
|
fi
|
|
}
|
|
|
|
#
|
|
# Populate the local RPM vault with comand-line supplied list of RPMs
|
|
#
|
|
rpm_populateRPMvault()
|
|
{
|
|
rpmVault=$buildBase/RPMS/$architecture
|
|
|
|
echo " Local RPM vault location: $rpmVault"
|
|
echo ""
|
|
echo " Moving the following RPMs to the local RPM vault: `echo $@`"
|
|
|
|
mv $@ $rpmVault
|
|
|
|
echo ""
|
|
echo " Current content of the local RPM vault:"
|
|
ls -axlt $rpmVault
|
|
echo ""
|
|
}
|
|
|
|
#
|
|
# Remove an installed package
|
|
#
|
|
uninstallPackage()
|
|
{
|
|
pkg="$1";
|
|
|
|
echo "Removing ${pkg}"
|
|
if [[ -f $WM_THIRD_PARTY_DIR/rpmBuild/RPMS/$architecture/${pkg}-$WM_OPTIONS.$architecture.rpm ]]; then
|
|
rm -f $WM_THIRD_PARTY_DIR/rpmBuild/RPMS/$architecture/${pkg}-$WM_OPTIONS.$architecture.rpm
|
|
else
|
|
echo "Not found: $WM_THIRD_PARTY_DIR/rpmBuild/RPMS/$architecture/${pkg}*.rpm"
|
|
fi
|
|
|
|
if [[ -f $WM_THIRD_PARTY_DIR/rpmBuild/SOURCES/${pkg}.tar.gz ]]; then
|
|
rm -f $WM_THIRD_PARTY_DIR/rpmBuild/SOURCES/${pkg}.tar.gz
|
|
else
|
|
echo "Not found: $WM_THIRD_PARTY_DIR/rpmBuild/SOURCES/${pkg}.tar.gz"
|
|
fi
|
|
|
|
if [[ -f $WM_THIRD_PARTY_DIR/rpmBuild/TGZS/$architecture/${pkg}.tgz ]]; then
|
|
rm -f $WM_THIRD_PARTY_DIR/rpmBuild/TGZS/$architecture/${pkg}.tgz
|
|
else
|
|
echo "Not found: $WM_THIRD_PARTY_DIR/rpmBuild/TGZS/$architecture/${pkg}.tgz"
|
|
fi
|
|
|
|
foundDir=false
|
|
for dir_ in $WM_THIRD_PARTY_DIR/rpmBuild/BUILD/${pkg}*
|
|
do
|
|
if [[ -d "$dir_" ]]; then
|
|
rm -rf $WM_THIRD_PARTY_DIR/rpmBuild/BUILD/${pkg}*
|
|
foundDir=true
|
|
fi
|
|
done
|
|
if [ "$foundDir" = false ] ; then
|
|
echo "Not found: $WM_THIRD_PARTY_DIR/rpmBuild/BUILD/${pkg}*"
|
|
fi
|
|
|
|
if [[ "$2" = "alsoPackage" ]]; then
|
|
if [[ -d $WM_THIRD_PARTY_DIR/packages/$pkg ]]; then
|
|
rm -rf $WM_THIRD_PARTY_DIR/packages/$pkg
|
|
else
|
|
echo "Not found: $WM_THIRD_PARTY_DIR/packages/$pkg"
|
|
fi
|
|
else
|
|
echo "Add option alsoPackage to remove the installed files."
|
|
fi
|
|
echo
|
|
}
|
|
|
|
# ----------------------------------------------------------------- end-of-file
|