Skip to content
Snippets Groups Projects
Commit 17084917 authored by mark's avatar mark
Browse files

ENH: several improvements to foamEtcFile

- lazier evaluation of project name and version based on the directory
  name. Avoids heuristics based on directory names unless really needed.

- cope with alternative directory locations.
  For example, OpenFOAM+VERSION etc.

The combination of the two above appears to be sufficient to open up
the directory naming possibilities.

- additional -list-test option (tests for existence of directory).
parent 74fbef36
No related branches found
No related tags found
1 merge request!121Merge develop into master for v1706 release
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
# foamEtcFile # foamEtcFile
# #
# Description # Description
# Locate user/group/shipped file with semantics similar to the # Locate user/group/other files with semantics similar to the
# ~OpenFOAM/fileName expansion. # ~OpenFOAM/fileName expansion.
# #
# The -mode option can be used to allow chaining from # The -mode option can be used to allow chaining from
...@@ -34,119 +34,175 @@ ...@@ -34,119 +34,175 @@
# #
# For example, within the user ~/.OpenFOAM/<VER>/prefs.sh: # For example, within the user ~/.OpenFOAM/<VER>/prefs.sh:
# \code # \code
# foamFile=$(foamEtcFile -mode go prefs.sh) && . $foamFile # eval $(foamEtcFile -sh -mode=go prefs.sh)
# \endcode # \endcode
# #
# Environment
# - WM_PROJECT: (unset defaults to OpenFOAM)
# - WM_PROJECT_SITE: (unset defaults to PREFIX/site)
# - WM_PROJECT_VERSION: (unset defaults to detect from path)
#
# Note # Note
# This script must exist in $FOAM_INST_DIR/OpenFOAM-<VERSION>/bin/ # This script must exist in one of these locations:
# or $FOAM_INST_DIR/openfoam<VERSION>/bin/ (for the debian version) # - $WM_PROJECT_INST_DIR/OpenFOAM-<VERSION>/bin
# - $WM_PROJECT_INST_DIR/openfoam-<VERSION>/bin
# - $WM_PROJECT_INST_DIR/OpenFOAM+<VERSION>/bin
# - $WM_PROJECT_INST_DIR/openfoam+<VERSION>/bin
# - $WM_PROJECT_INST_DIR/openfoam<VERSION>/bin (debian version)
# #
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
unset optQuiet optSilent unset optQuiet optSilent
usage() { usage() {
[ "${optQuiet:-$optSilent}" = true ] && exit 1 [ "${optQuiet:-$optSilent}" = true ] && exit 1
exec 1>&2 exec 1>&2
while [ "$#" -ge 1 ]; do echo "$1"; shift; done while [ "$#" -ge 1 ]; do echo "$1"; shift; done
cat<<USAGE cat<<USAGE
Usage: foamEtcFile [OPTION] fileName Usage: foamEtcFile [OPTION] fileName
foamEtcFile [OPTION] -list foamEtcFile [OPTION] [-list|-list-test] [fileName]
options: options:
-a, -all return all files (otherwise stop after the first match) -a, -all Return all files (otherwise stop after the first match)
-l, -list list the directories to be searched -l, -list List directories or files to be checked
-m, -mode MODE any combination of u(user), g(group), o(other) -list-test List (existing) directories or files to be checked
-p, -prefix DIR specify an alternative installation prefix -mode=MODE Any combination of u(user), g(group), o(other)
-q, -quiet suppress all normal output -prefix=DIR Specify an alternative installation prefix
-s, -silent suppress stderr output, except for things that are emitted -version=VER Specify alternative OpenFOAM version (eg, 3.0, 1612, ...)
by -csh-verbose, -sh-verbose. -csh | -sh Produce output suitable for a csh or sh 'eval'
-v, -version VER specify alternative OpenFOAM version (eg, 3.0, 1612, ...) -csh-verbose | -sh-verbose
-csh | -sh produce output suitable for a csh or sh 'eval' As per -csh | -sh, with additional verbosity
-csh-verbose, -q, -quiet Suppress all normal output
-sh-verbose with additional verbosity -s, -silent Suppress stderr, except -csh-verbose, -sh-verbose output
-help print the usage -help Print the usage
Locate user/group/shipped file with semantics similar to the Locate user/group/other file with semantics similar to the
~OpenFOAM/fileName expansion. ~OpenFOAM/fileName expansion.
Many options can be specified as a single character, but must not be grouped. Single character options must not be grouped. Equivalent options:
-mode=MODE, -mode MODE, -m MODE
Exit status -prefix=DIR, -prefix DIR, -p DIR
0 when the file is found. Print resolved path to stdout. -version=VER, -version VER, -v VER
1 for miscellaneous errors.
2 when the file is not found. Exit status
0 when the file is found. Print resolved path to stdout.
1 for miscellaneous errors.
2 when the file is not found.
USAGE USAGE
exit 1 exit 1
} }
#-------------------------------------------------------------------------------
# The bin dir: # Report error and exit
binDir="${0%/*}" die()
{
[ "${optQuiet:-$optSilent}" = true ] && exit 1
exec 1>&2
echo
echo "Error encountered:"
while [ "$#" -ge 1 ]; do echo " $1"; shift; done
echo
echo "See 'foamEtcFile -help' for usage"
echo
exit 1
}
#-------------------------------------------------------------------------------
binDir="${0%/*}" # The bin dir
projectDir="${binDir%/bin}" # The project dir
prefixDir="${projectDir%/*}" # The prefix dir (same as $WM_PROJECT_INST_DIR)
# The project dir: # Could not resolve projectDir, prefixDir? (eg, called as ./bin/foamEtcFile)
projectDir="${binDir%/bin}" if [ "$prefixDir" = "$projectDir" ]
then
binDir="$(cd $binDir && pwd -L)"
projectDir="${binDir%/bin}"
prefixDir="${projectDir%/*}"
fi
projectDirName="${projectDir##*/}" # The project directory name
# The prefix dir (same as $FOAM_INST_DIR): projectName="${WM_PROJECT:-OpenFOAM}" # The project name
prefixDir="${projectDir%/*}" projectVersion="$WM_PROJECT_VERSION" # Empty? - will be treated later
# The name used for the project directory
projectDirName="${projectDir##*/}"
# The versionNum is used for debian packaging #-------------------------------------------------------------------------------
unset versionNum
# # Guess project version or simply get the stem part of the projectDirName.
# Handle standard and debian naming conventions. # Handle standard and debian naming conventions.
# - projectDirBase: projectDirName without the version
# - version
# - versionNum (debian only)
# #
case "$projectDirName" in # - projectVersion: update unless already set
OpenFOAM-* | openfoam-*) # OpenFOAM-<VERSION> or openfoam-<VERSION> #
projectDirBase="${projectDirName%%-*}-" # Helper variables:
version="${projectDirName#*-}" # - dirBase (for reassembling name) == projectDirName without the version
;; # - versionNum (debian packaging)
unset dirBase versionNum
guessVersion()
{
local version
case "$projectDirName" in
(OpenFOAM-* | openfoam-*)
# Standard naming: OpenFOAM-<VERSION> or openfoam-<VERSION>
dirBase="${projectDirName%%-*}-"
version="${projectDirName#*-}"
version="${version%%*-}" # Extra safety, eg openfoam-version-packager
;;
(OpenFOAM+* | openfoam+*)
# Alternative naming: OpenFOAM+<VERSION> or openfoam+<VERSION>
dirBase="${projectDirName%%+*}+"
version="${projectDirName#*+}"
version="${version%%*-}" # Extra safety, eg openfoam-version-packager
;;
(openfoam[0-9]*)
# Debian naming: openfoam<VERSION>
dirBase="openfoam"
version="${projectDirName#openfoam}"
versionNum="$version"
# Convert digits version number to decimal delineated
case "${#versionNum}" in (2|3|4)
version=$(echo "$versionNum" | sed -e 's@\([0-9]\)@\1.@g')
version="${version%.}"
;;
esac
openfoam[0-9]*) # Debian: openfoam<VERSION> # Ignore special treatment if no decimals were inserted.
projectDirBase="openfoam" [ "${#version}" -gt "${#versionNum}" ] || unset versionNum
versionNum="${projectDirName#openfoam}"
case "${#versionNum}" in
(2|3|4) # Convert digits version number to decimal delineated
version=$(echo "$versionNum" | sed -e 's@\([0-9]\)@\1.@g')
version="${version%.}"
;; ;;
(*) # Fallback - use current environment setting (*)
version="$WM_PROJECT_VERSION" die "unknown/unsupported naming convention for '$projectDirName'"
;; ;;
esac esac
;;
*) # Set projectVersion if required
echo "foamEtcFile error: unknown/unsupported naming convention" 1>&2 : ${projectVersion:=$version}
exit 1 }
;;
esac
# Set version and update versionNum, projectDirName accordingly # Set projectVersion and update versionNum, projectDirName accordingly
setVersion() setVersion()
{ {
version="$1" projectVersion="$1"
# Convert x.y.z -> xyz version (if installation looked like debian) # Need dirBase when reassembling projectDirName
[ -n "$versionNum" ] && versionNum=$(echo "$version" | sed -e 's@\.@@g') [ -n "$dirBase" ] || guessVersion
projectDirName="$projectDirBase${versionNum:-${version}}" # Debian: update x.y.z -> xyz version
if [ -n "$versionNum" ]
then
versionNum=$(echo "$projectVersion" | sed -e 's@\.@@g')
fi
projectDirName="$dirBase${versionNum:-$projectVersion}"
} }
# Default mode is always 'ugo' optMode=ugo # Default mode is always 'ugo'
mode=ugo unset optAll optList optShell optVersion
unset optAll optList optShell
# parse options # Parse options
while [ "$#" -gt 0 ] while [ "$#" -gt 0 ]
do do
case "$1" in case "$1" in
...@@ -161,34 +217,38 @@ do ...@@ -161,34 +217,38 @@ do
optList=true optList=true
unset optShell unset optShell
;; ;;
-list-test)
optList='test'
unset optShell
;;
-csh | -sh | -csh-verbose | -sh-verbose) -csh | -sh | -csh-verbose | -sh-verbose)
optShell="${1#-}" optShell="${1#-}"
unset optAll unset optAll
;; ;;
-mode=[ugo]*) -mode=[ugo]*)
mode="${1#*=}" optMode="${1#*=}"
;; ;;
-prefix=/*) -prefix=/*)
prefixDir="${1#*=}" prefixDir="${1#*=}"
prefixDir="${prefixDir%/}" prefixDir="${prefixDir%/}"
;; ;;
-version=*) -version=*)
setVersion "${1#*=}" optVersion="${1#*=}"
;; ;;
-m | -mode) -m | -mode)
mode="$2" optMode="$2"
shift
# Sanity check. Handles missing argument too. # Sanity check. Handles missing argument too.
case "$mode" in case "$optMode" in
[ugo]*) ([ugo]*)
;; ;;
*) (*)
usage "invalid mode '$mode'" die "invalid mode '$optMode'"
;; ;;
esac esac
shift
;; ;;
-p | -prefix) -p | -prefix)
[ "$#" -ge 2 ] || usage "'$1' option requires an argument" [ "$#" -ge 2 ] || die "'$1' option requires an argument"
prefixDir="${2%/}" prefixDir="${2%/}"
shift shift
;; ;;
...@@ -199,8 +259,8 @@ do ...@@ -199,8 +259,8 @@ do
optSilent=true optSilent=true
;; ;;
-v | -version) -v | -version)
[ "$#" -ge 2 ] || usage "'$1' option requires an argument" [ "$#" -ge 2 ] || die "'$1' option requires an argument"
setVersion "$2" optVersion="$2"
shift shift
;; ;;
--) --)
...@@ -208,7 +268,7 @@ do ...@@ -208,7 +268,7 @@ do
break break
;; ;;
-*) -*)
usage "unknown option: '$1'" die "unknown option: '$1'"
;; ;;
*) *)
break break
...@@ -217,12 +277,27 @@ do ...@@ -217,12 +277,27 @@ do
shift shift
done done
# Update projectDir accordingly
#-------------------------------------------------------------------------------
if [ -n "$optVersion" ]
then
setVersion $optVersion
elif [ -z "$projectVersion" ]
then
guessVersion
fi
# Updates:
# - projectDir for changes via -prefix or -version
# - projectSite for changes via -prefix
projectDir="$prefixDir/$projectDirName" projectDir="$prefixDir/$projectDirName"
projectSite="${WM_PROJECT_SITE:-$prefixDir/site}"
# Debugging: # Debugging:
# echo "Installed locations:" 1>&2 # echo "Installed locations:" 1>&2
# for i in projectDir prefixDir projectDirName version versionNum # for i in projectDir prefixDir projectDirName projectVersion
# do # do
# eval echo "$i=\$$i" 1>&2 # eval echo "$i=\$$i" 1>&2
# done # done
...@@ -235,19 +310,17 @@ fileName="${1#~OpenFOAM/}" ...@@ -235,19 +310,17 @@ fileName="${1#~OpenFOAM/}"
# Define the various places to be searched: # Define the various places to be searched:
unset dirList unset dirList
case "$mode" in (*u*) # (U)ser case "$optMode" in (*u*) # (U)ser
dir="$HOME/.${WM_PROJECT:-OpenFOAM}" dirList="$dirList $HOME/.$projectName/$projectVersion $HOME/.$projectName"
dirList="$dirList $dir/$version $dir"
;; ;;
esac esac
case "$mode" in (*g*) # (G)roup == site case "$optMode" in (*g*) # (G)roup == site
dir="${WM_PROJECT_SITE:-$prefixDir/site}" dirList="$dirList $projectSite/$projectVersion $projectSite"
dirList="$dirList $dir/$version $dir"
;; ;;
esac esac
case "$mode" in (*o*) # (O)ther == shipped case "$optMode" in (*o*) # (O)ther == shipped
dirList="$dirList $projectDir/etc" dirList="$dirList $projectDir/etc"
;; ;;
esac esac
...@@ -259,30 +332,54 @@ set -- $dirList ...@@ -259,30 +332,54 @@ set -- $dirList
# #
exitCode=0 exitCode=0
if [ "$optList" = true ] if [ -n "$optList" ]
then then
# List directories, or potential file locations # List directories, or potential file locations
[ "$nArgs" -le 1 ] || usage [ "$nArgs" -le 1 ] || \
die "-list expects 0 or 1 filename, but $nArgs provided"
# A silly combination, but -quiet does have precedence # A silly combination, but -quiet does have precedence
[ -n "$optQuiet" ] && exit 0 [ -n "$optQuiet" ] && exit 0
for dir # Test for directory or file too?
do if [ "$optList" = "test" ]
then
exitCode=2 # Fallback to a general error (file not found)
if [ "$nArgs" -eq 1 ] if [ "$nArgs" -eq 1 ]
then then
echo "$dir/$fileName" for dir
do
resolved="$dir/$fileName"
if [ -f "$resolved" ]
then
echo "$resolved"
exitCode=0 # OK
fi
done
else else
echo "$dir" for dir
do
if [ -d "$dir" ]
then
echo "$dir"
exitCode=0 # OK
fi
done
fi fi
done else
for dir
do
echo "$dir${fileName:+/}$fileName"
done
fi
else else
[ "$nArgs" -eq 1 ] || usage [ "$nArgs" -eq 1 ] || die "One filename expected - $nArgs provided"
exitCode=2 # Fallback to a general error, eg file not found exitCode=2 # Fallback to a general error (file not found)
for dir for dir
do do
...@@ -316,7 +413,6 @@ else ...@@ -316,7 +413,6 @@ else
fi fi
exit $exitCode exit $exitCode
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
# foamExec # foamExec
# #
# Description # Description
# Usage: foamExec [-v foamVersion] <foamCommand> ... # Usage: foamExec [-version=foamVersion] <foamCommand> ...
# #
# Runs the <foamVersion> version of executable <foamCommand> # Runs the <foamVersion> version of executable <foamCommand>
# with the rest of the arguments. # with the rest of the arguments.
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
# Can also be used for parallel runs. For example, # Can also be used for parallel runs. For example,
# \code # \code
# mpirun -np <nProcs> \ # mpirun -np <nProcs> \
# foamExec -version <foamVersion> <foamCommand> ... -parallel # foamExec -version=VERSION <foamCommand> ... -parallel
# \endcode # \endcode
# #
# Note # Note
...@@ -55,34 +55,29 @@ usage() { ...@@ -55,34 +55,29 @@ usage() {
Usage: ${0##*/} [OPTION] <application> ... Usage: ${0##*/} [OPTION] <application> ...
options: options:
-prefix <dir> specify an alternative installation prefix -mode=MODE Any combination of u(user), g(group), o(other)
-prefix=DIR Specify an alternative installation prefix
pass through to foamEtcFile and set as FOAM_INST_DIR pass through to foamEtcFile and set as FOAM_INST_DIR
-version <ver> specify an alternative OpenFOAM version -version=VER Specify alternative OpenFOAM version (eg, 3.0, 1612, ...)
pass through to foamEtcFile pass through to foamEtcFile
-help print the usage -help Print the usage
* run a particular OpenFOAM version of <application> Run a particular OpenFOAM version of <APPLICATION>
USAGE USAGE
exit 1 exit 1
} }
#------------------------------------------------------------------------------- #-------------------------------------------------------------------------------
binDir="${0%/*}" # The bin dir
projectDir="${binDir%/bin}" # The project dir
prefixDir="${projectDir%/*}" # The prefix dir (same as $WM_PROJECT_INST_DIR)
# the bin dir: ## projectDirName="${projectDir##*/}" # The project directory name
binDir="${0%/*}"
# the project dir: version="${WM_PROJECT_VERSION:-unknown}"
projectDir="${binDir%/bin}"
# the prefix dir (same as $FOAM_INST_DIR): unset etcOpts
prefixDir="${projectDir%/*}"
# # the name used for the project directory
# projectDirName="${projectDir##*/}"
unset etcOpts version
# parse options # parse options
while [ "$#" -gt 0 ] while [ "$#" -gt 0 ]
do do
...@@ -90,6 +85,17 @@ do ...@@ -90,6 +85,17 @@ do
-h | -help) -h | -help)
usage usage
;; ;;
-mode=*)
etcOpts="$etcOpts $1" # pass-thru to foamEtcFile
;;
-prefix=/*)
etcOpts="$etcOpts $1" # pass-thru to foamEtcFile
prefixDir="${1#*=}"
;;
-version=*)
etcOpts="$etcOpts $1" # pass-thru to foamEtcFile
version="${1#*=}"
;;
-m | -mode) -m | -mode)
[ "$#" -ge 2 ] || usage "'$1' option requires an argument" [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
etcOpts="$etcOpts $1 $2" # pass-thru to foamEtcFile etcOpts="$etcOpts $1 $2" # pass-thru to foamEtcFile
...@@ -127,15 +133,15 @@ done ...@@ -127,15 +133,15 @@ done
# #
sourceRc() sourceRc()
{ {
foamDotFile="$($binDir/foamEtcFile $etcOpts bashrc)" || { rcFile="$($binDir/foamEtcFile $etcOpts bashrc)" || {
echo "Error : bashrc file could not be found for OpenFOAM-${version:-${WM_PROJECT_VERSION:-???}}" 1>&2 echo "Error : bashrc file could not be found for OpenFOAM-$version" 1>&2
exit 1 exit 1
} }
# set to consistent value before sourcing the bashrc # set to consistent value before sourcing the bashrc
export FOAM_INST_DIR="$prefixDir" export FOAM_INST_DIR="$prefixDir"
. $foamDotFile $FOAM_SETTINGS . $rcFile $FOAM_SETTINGS
} }
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
# Use other (shipped) paraview with a different ParaView_VERSION # Use other (shipped) paraview with a different ParaView_VERSION
# #
set foamFile=`$WM_PROJECT_DIR/bin/foamEtcFile -mode o config.csh/paraview` set foamFile=`$WM_PROJECT_DIR/bin/foamEtcFile -mode=o config.csh/paraview`
if ( $status == 0 ) source $foamFile ParaView_VERSION=5.0.1 if ( $status == 0 ) source $foamFile ParaView_VERSION=5.0.1
unset foamFile unset foamFile
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment