#---------------------------------*- 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 . # # 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 "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 ) 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}" [ -f $WM_THIRD_PARTY_DIR/rpmBuild/RPMS/$architecture/${pkg}*.rpm ] && \ rm -f $WM_THIRD_PARTY_DIR/rpmBuild/RPMS/$architecture/${pkg}*.rpm || \ echo "Not found: $WM_THIRD_PARTY_DIR/rpmBuild/RPMS/$architecture/${pkg}*.rpm" [ -f $WM_THIRD_PARTY_DIR/rpmBuild/SOURCES/${pkg}.tar.gz ] && \ rm -f $WM_THIRD_PARTY_DIR/rpmBuild/SOURCES/${pkg}.tar.gz || \ echo "Not found: $WM_THIRD_PARTY_DIR/rpmBuild/SOURCES/${pkg}.tar.gz" [ -f $WM_THIRD_PARTY_DIR/rpmBuild/TGZS/$architecture/${pkg}.tgz ] && \ rm -f $WM_THIRD_PARTY_DIR/rpmBuild/TGZS/$architecture/${pkg}.tgz || \ echo "Not found: $WM_THIRD_PARTY_DIR/rpmBuild/TGZS/$architecture/${pkg}.tgz" [ -d $WM_THIRD_PARTY_DIR/rpmBuild/BUILD/${pkg}* ] && \ rm -rf $WM_THIRD_PARTY_DIR/rpmBuild/BUILD/${pkg}* || \ echo "Not found: $WM_THIRD_PARTY_DIR/rpmBuild/BUILD/${pkg}*" if [ "$2" = "alsoPackage" ]; then [ -d $WM_THIRD_PARTY_DIR/packages/$pkg ] && \ rm -rf $WM_THIRD_PARTY_DIR/packages/$pkg || \ echo "Not found: $WM_THIRD_PARTY_DIR/packages/$pkg" else echo "Add option alsoPackage to remove the installed files." fi echo } # ----------------------------------------------------------------- end-of-file