mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: installation helpers
----
install-dirs: a general directory installer
Copy installs non-binary (platform) directories.
Eg,
install-dirs -prefix=... -devel
install-dirs -prefix=... -default -no-app
----
install-platform: a platform (binary) installer
This is primarily driven by the need to install into system mpi
directories. The problem noted in issue #1893 is caused by the
rpm-mpi-hooks (fedora and redhat-8).
For the additional mpi library qualifier (openmpi-x86_64) to be
added to the requirements, the mpi-specific libraries (eg,
libPstream.so) need to be installed in the mpi system directory
(eg, /usr/lib64/openmpi).
However, then need symlinks from the system locations back to our
local directories to ensure that the libraries are correctly found
via our LD_LIBRARY_PATH and we don't get dummy libraries.
----
update-mpi-links: a post-install update hook
Expected paths are registered as persistent information into the
hook during packaging. Triggering the hook after installation
completes the creation of the symlinks.
Normal usage,
```
prefix="/tmp/local-install/openfoam"
bin/tools/install-dirs -prefix="$prefix" -common
bin/tools/install-platform -prefix="$prefix"
```
Installs
- /tmp/local-install/openfoam/META-INFO
- /tmp/local-install/openfoam/bin
- /tmp/local-install/openfoam/etc
- /tmp/local-install/openfoam/platforms/linux64GccDPInt32Opt/bin
- /tmp/local-install/openfoam/platforms/linux64GccDPInt32Opt/lib
Can also place architecture-dependent bits elsewhere,
```
prefix="/tmp/local-install/openfoam"
multi_arch="$(dpkg-architecture -qDEB_TARGET_MULTIARCH)"
bin/tools/install-dirs -prefix="$prefix" -common
bin/tools/install-platform -exec-prefix="$prefix/$multi_arch"
```
Installs
- /tmp/local-install/openfoam/META-INFO
- /tmp/local-install/openfoam/bin
- /tmp/local-install/openfoam/etc
- /tmp/local-install/openfoam/x86_64-linux-gnu/bin
- /tmp/local-install/openfoam/x86_64-linux-gnu/lib
Can use it to flatten out platforms entirely,
```
prefix="/tmp/local-install/openfoam"
bin/tools/install-dirs -prefix="$prefix" -common
bin/tools/install-platform -exec-prefix="$prefix"
```
Installs
- /tmp/local-install/openfoam/META-INFO
- /tmp/local-install/openfoam/bin
- /tmp/local-install/openfoam/etc
- /tmp/local-install/openfoam/lib
This commit is contained in:
375
bin/tools/install-platform
Executable file
375
bin/tools/install-platform
Executable file
@ -0,0 +1,375 @@
|
||||
#!/bin/sh
|
||||
#------------------------------------------------------------------------------
|
||||
# ========= |
|
||||
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
# \\ / O peration |
|
||||
# \\ / A nd | www.openfoam.com
|
||||
# \\/ M anipulation |
|
||||
#------------------------------------------------------------------------------
|
||||
# Copyright (C) 2020 OpenCFD Ltd.
|
||||
#------------------------------------------------------------------------------
|
||||
# License
|
||||
# This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
|
||||
#
|
||||
# Script
|
||||
# install-platform
|
||||
#
|
||||
# Example usage
|
||||
# install-platform -prefix=/opt/openfoam/openfoamVER
|
||||
#
|
||||
# Description
|
||||
# Simple installer to copy OpenFOAM binary bin/, lib/ (platforms)
|
||||
# directories.
|
||||
#
|
||||
# Note
|
||||
# The platforms/tools directory still must be handled separately
|
||||
#
|
||||
# Layout of OpenFOAM platforms
|
||||
#
|
||||
# platforms
|
||||
# |-- <WM_OPTIONS>
|
||||
# |-- bin
|
||||
# | |-- ...
|
||||
# `-- lib
|
||||
# |-- ...
|
||||
# |-- dummy
|
||||
# | `-- ...
|
||||
# |-- sys-openmpi
|
||||
# | |-- libPstream.so
|
||||
# | `-- libptscotchDecomp.so
|
||||
# `-- paraview-MAJ.MIN
|
||||
# `-- ...
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
printHelp() {
|
||||
cat<<USAGE
|
||||
|
||||
Usage: ${0##*/} [OPTION]
|
||||
|
||||
input options:
|
||||
-source=SOURCE Source directory
|
||||
[\$WM_PROJECT_DIR ${WM_PROJECT_DIR:-''}]
|
||||
-platform=PLATFORM OpenFOAM platform name [\$WM_OPTIONS ${WM_OPTIONS:-''}]
|
||||
-foam-mpi=FOAM_MPI OpenFOAM mpi name [\$FOAM_MPI ${FOAM_MPI:-''}]
|
||||
|
||||
target options:
|
||||
-prefix=PREFIX Top-level installation directory in PREFIX ['']
|
||||
-exec-prefix=EPREFIX Architecture-dependent in EPREFIX
|
||||
[PREFIX/platforms/PLATFORM]
|
||||
-bindir=DIR bin directory [EPREFIX/bin]
|
||||
-libdir=DIR lib directory [EPREFIX/lib]
|
||||
-mpi-libdir=DIR mpi libdir [<libdir>/FOAM_MPI]
|
||||
|
||||
tuning options:
|
||||
-no-bin Do not install bin directory
|
||||
-no-lib Do not install lib directory
|
||||
-no-mpi Do not install mpi lib directory
|
||||
-mpi-only Only install mpi lib directory
|
||||
-mpi-mkdir Create foam-mpi directory within libdir
|
||||
|
||||
general options:
|
||||
-dry-run, -n Do not perform any operations
|
||||
-force, -f Ignored
|
||||
-verbose, -v Additional verbosity
|
||||
-help Print the help and exit
|
||||
|
||||
|
||||
Simple installer to copy OpenFOAM binary bin/, lib/ (platforms) directories.
|
||||
|
||||
Example,
|
||||
${0##*/} -prefix=/opt/openfoamVER
|
||||
|
||||
USAGE
|
||||
exit 0 # A clean exit
|
||||
}
|
||||
|
||||
unset optDryRun hadError
|
||||
# Report error and exit
|
||||
die()
|
||||
{
|
||||
exec 1>&2
|
||||
echo
|
||||
echo "Error encountered:"
|
||||
while [ "$#" -ge 1 ]; do echo " $1"; shift; done
|
||||
echo
|
||||
echo "See '${0##*/} -help' for usage"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Report error and exit
|
||||
warnOrDie()
|
||||
{
|
||||
if [ -n "$optDryRun" ]
|
||||
then
|
||||
hadError=true
|
||||
while [ "$#" -ge 1 ]; do echo "Error: $1" 1>&2; shift; done
|
||||
else
|
||||
die "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Get the option's value (argument), or die on missing or empty value
|
||||
# $1 option=value
|
||||
getOptionValue()
|
||||
{
|
||||
local value="${1#*=}"
|
||||
# Remove any surrounding double quotes
|
||||
value="${value%\"}"
|
||||
value="${value#\"}"
|
||||
|
||||
[ -n "$value" ] || die "'${1%=}' option requires a value"
|
||||
echo "$value"
|
||||
}
|
||||
|
||||
|
||||
# Test for '-no-' or '-without-' prefix. Return "false" or "true"
|
||||
# $1 option
|
||||
# [$2] truth value <true>
|
||||
getBoolOption()
|
||||
{
|
||||
case "$1" in
|
||||
(-no-* | -without-*) echo "false" ;;
|
||||
(*) echo "${2:-true}" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Defaults from current OpenFOAM environment
|
||||
sourceDir="$WM_PROJECT_DIR"
|
||||
platform="$WM_OPTIONS"
|
||||
foam_mpi="$FOAM_MPI"
|
||||
|
||||
unset install_bin install_lib
|
||||
unset optMkdir_mpi
|
||||
install_mpi=true
|
||||
|
||||
unset prefix exec_prefix bindir libdir libdir_mpi optVerbose
|
||||
|
||||
# Parse options
|
||||
while [ "$#" -gt 0 ]
|
||||
do
|
||||
case "$1" in
|
||||
-h | -help*) printHelp ;;
|
||||
-n | -dry-run) optDryRun="(dry-run) " ;;
|
||||
-v | -verbose) optVerbose=true ;;
|
||||
-f | -force) echo "Ignored option: ${1%%=*}" 1>&2 ;;
|
||||
|
||||
# Inputs
|
||||
-source=*) sourceDir="$(getOptionValue "$1")" ;;
|
||||
-platform=*) platform="$(getOptionValue "$1")" ;;
|
||||
-foam-mpi=*) foam_mpi="$(getOptionValue "$1")" ;;
|
||||
|
||||
# Targets
|
||||
-prefix=*) prefix="$(getOptionValue "$1")" ;;
|
||||
-exec-prefix=*) exec_prefix="$(getOptionValue "$1")" ;;
|
||||
|
||||
-bindir=*) bindir="$(getOptionValue "$1")" ;;
|
||||
-libdir=*) libdir="$(getOptionValue "$1")" ;;
|
||||
-mpi-libdir=*) libdir_mpi="$(getOptionValue "$1")" ;;
|
||||
|
||||
-no-bin) install_bin=false ;;
|
||||
-no-lib) install_lib=false ;;
|
||||
-no-mpi) install_mpi=false ;;
|
||||
-mpi-only) install_mpi=exclusive ;;
|
||||
-mpi-mkdir) optMkdir_mpi=true ;;
|
||||
|
||||
(*) die "Unknown option/argument: $1" ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
# Default <exec_prefix> based on <prefix>
|
||||
if [ -z "$exec_prefix" ] && [ -n "$prefix" ]
|
||||
then
|
||||
exec_prefix="$prefix/platforms/$platform"
|
||||
fi
|
||||
|
||||
# Default <bindir>, <libdir> based on <exec_prefix>
|
||||
if [ -n "$exec_prefix" ]
|
||||
then
|
||||
[ -n "$bindir" ] || bindir="$exec_prefix/bin"
|
||||
[ -n "$libdir" ] || libdir="$exec_prefix/lib"
|
||||
fi
|
||||
|
||||
# Default <mpi-libdir> based on <libdir> and <foam-mpi>
|
||||
if [ -z "$libdir_mpi" ] && [ -n "$libdir" ]
|
||||
then
|
||||
libdir_mpi="$libdir/$foam_mpi"
|
||||
fi
|
||||
|
||||
# Exclusions
|
||||
if [ "$install_bin" = false ] || [ "$install_mpi" = exclusive ]
|
||||
then
|
||||
unset bindir
|
||||
fi
|
||||
if [ "$install_lib" = false ] || [ "$install_mpi" = exclusive ]
|
||||
then
|
||||
unset libdir
|
||||
fi
|
||||
if [ "$install_mpi" = false ]
|
||||
then
|
||||
unset libdir_mpi
|
||||
fi
|
||||
|
||||
|
||||
# Input checks
|
||||
|
||||
sourcePlatform="$sourceDir/platforms/$platform"
|
||||
|
||||
[ -d "$sourceDir" ] || warnOrDie "Invalid -source directory: $sourceDir"
|
||||
[ -n "$platform" ] || warnOrDie "No -platform detected or specified"
|
||||
[ -n "$foam_mpi" ] || warnOrDie "No -foam-mpi detected or specified"
|
||||
|
||||
[ -d "$sourcePlatform" ] || \
|
||||
warnOrDie "Missing platforms directory for: $platform"
|
||||
|
||||
|
||||
# Installation sanity check
|
||||
[ -n "$bindir$libdir$libdir_mpi" ] || \
|
||||
warnOrDie "Must specify at least one of -prefix, -exec-prefix, -bindir, -libdir, -mpi-libdir"
|
||||
|
||||
|
||||
if [ -n "$hadError" ]
|
||||
then
|
||||
echo "Errors encounters in dry-run. Stopping" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Report settings
|
||||
echo "Preparing install with the following parameters" 1>&2
|
||||
echo "source:" 1>&2
|
||||
echo " directory $sourceDir" 1>&2
|
||||
echo " platform $platform" 1>&2
|
||||
echo " foam-mpi $foam_mpi" 1>&2
|
||||
echo 1>&2
|
||||
echo "target (mpi-install: $install_mpi)" 1>&2
|
||||
echo " prefix ${prefix-[]}" 1>&2
|
||||
echo " exec-prefix ${exec_prefix:-[]}" 1>&2
|
||||
echo " bindir ${bindir:-[]}" 1>&2
|
||||
echo " libdir ${libdir:-[]}" 1>&2
|
||||
echo " libdir(mpi) ${libdir_mpi:-[]}" 1>&2
|
||||
echo 1>&2
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Proper umask
|
||||
umask 022
|
||||
|
||||
# The commands
|
||||
copy_cmd="cp -a ${optVerbose:+-v}"
|
||||
mkdir_cmd="mkdir -p"
|
||||
|
||||
if [ -n "$optDryRun" ]
|
||||
then
|
||||
if [ -n "$optVerbose" ]
|
||||
then
|
||||
copy_cmd="echo cp -a"
|
||||
mkdir_cmd="echo mkdir -p"
|
||||
else
|
||||
copy_cmd="true"
|
||||
mkdir_cmd="true"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# bin/
|
||||
# ----
|
||||
message="${optDryRun}Install bindir:"
|
||||
if [ -n "$bindir" ]
|
||||
then
|
||||
input="$sourcePlatform/bin"
|
||||
|
||||
echo "From $input" 1>&2
|
||||
echo "${message} $bindir" 1>&2
|
||||
|
||||
$mkdir_cmd "$bindir" 2>/dev/null
|
||||
|
||||
for i in "$input/"*
|
||||
do
|
||||
if [ -e "$i" ]
|
||||
then
|
||||
$copy_cmd "$i" "$bindir"
|
||||
fi
|
||||
done
|
||||
else
|
||||
echo "${message} [disabled]" 1>&2
|
||||
fi
|
||||
# ----
|
||||
|
||||
|
||||
# lib/ without mpi
|
||||
# ----
|
||||
message="${optDryRun}Install libdir(non-mpi):"
|
||||
if [ -n "$libdir" ]
|
||||
then
|
||||
input="$sourcePlatform/lib"
|
||||
|
||||
echo "From $input" 1>&2
|
||||
echo "${message} $libdir" 1>&2
|
||||
|
||||
$mkdir_cmd "$libdir" 2>/dev/null
|
||||
|
||||
for i in "$input/"*
|
||||
do
|
||||
if [ "${i##*/}" = "$foam_mpi" ]
|
||||
then
|
||||
if [ "$optMkdir_mpi" = true ]
|
||||
then
|
||||
$mkdir_cmd "$libdir/$foam_mpi"
|
||||
fi
|
||||
elif [ -e "$i" ]
|
||||
then
|
||||
$copy_cmd "$i" "$libdir"
|
||||
else
|
||||
echo "bogus lib entry? $i" 1>&2
|
||||
fi
|
||||
done
|
||||
else
|
||||
echo "${message} [disabled]" 1>&2
|
||||
fi
|
||||
# ----
|
||||
|
||||
|
||||
# lib/mpi
|
||||
# ----
|
||||
message="${optDryRun}Install libdir(mpi):"
|
||||
if [ -n "$libdir_mpi" ]
|
||||
then
|
||||
input="$sourcePlatform/lib/$foam_mpi"
|
||||
|
||||
echo "From $input" 1>&2
|
||||
echo "${message} $libdir_mpi" 1>&2
|
||||
|
||||
$mkdir_cmd "$libdir_mpi" 2>/dev/null
|
||||
|
||||
for i in "$input"/*
|
||||
do
|
||||
if [ -e "$i" ]
|
||||
then
|
||||
# Always verbose (not many files anyhow)
|
||||
$copy_cmd -v "$i" "$libdir_mpi"
|
||||
else
|
||||
echo "bogus mpi-lib entry? $i" 1>&2
|
||||
fi
|
||||
done
|
||||
else
|
||||
echo "${message} [disabled]" 1>&2
|
||||
fi
|
||||
# ----
|
||||
|
||||
|
||||
if [ -n "$optDryRun" ]
|
||||
then
|
||||
[ -n "$optVerbose" ] && echo 1>&2
|
||||
echo "${optDryRun}Done" 1>&2
|
||||
fi
|
||||
|
||||
|
||||
exit 0 # A clean exit
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user