diff --git a/bin/foamEtcFile b/bin/foamEtcFile index f071c6ff54a89e83911e8026189ec96fd5438c75..349d6157d54543ce5b08b5d49098d8765714da8b 100755 --- a/bin/foamEtcFile +++ b/bin/foamEtcFile @@ -26,7 +26,7 @@ # foamEtcFile # # Description -# Locate user/group/shipped file with semantics similar to the +# Locate user/group/other files with semantics similar to the # ~OpenFOAM/fileName expansion. # # The -mode option can be used to allow chaining from @@ -34,119 +34,175 @@ # # For example, within the user ~/.OpenFOAM/<VER>/prefs.sh: # \code -# foamFile=$(foamEtcFile -mode go prefs.sh) && . $foamFile +# eval $(foamEtcFile -sh -mode=go prefs.sh) # \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 -# This script must exist in $FOAM_INST_DIR/OpenFOAM-<VERSION>/bin/ -# or $FOAM_INST_DIR/openfoam<VERSION>/bin/ (for the debian version) +# This script must exist in one of these locations: +# - $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 usage() { [ "${optQuiet:-$optSilent}" = true ] && exit 1 - exec 1>&2 while [ "$#" -ge 1 ]; do echo "$1"; shift; done cat<<USAGE Usage: foamEtcFile [OPTION] fileName - foamEtcFile [OPTION] -list + foamEtcFile [OPTION] [-list|-list-test] [fileName] + options: - -a, -all return all files (otherwise stop after the first match) - -l, -list list the directories to be searched - -m, -mode MODE any combination of u(user), g(group), o(other) - -p, -prefix DIR specify an alternative installation prefix - -q, -quiet suppress all normal output - -s, -silent suppress stderr output, except for things that are emitted - by -csh-verbose, -sh-verbose. - -v, -version VER specify alternative OpenFOAM version (eg, 3.0, 1612, ...) - -csh | -sh produce output suitable for a csh or sh 'eval' - -csh-verbose, - -sh-verbose with additional verbosity - -help print the usage - - Locate user/group/shipped file with semantics similar to the - ~OpenFOAM/fileName expansion. - - Many options can be specified as a single character, but must not be grouped. - - Exit status - 0 when the file is found. Print resolved path to stdout. - 1 for miscellaneous errors. - 2 when the file is not found. + -a, -all Return all files (otherwise stop after the first match) + -l, -list List directories or files to be checked + -list-test List (existing) directories or files to be checked + -mode=MODE Any combination of u(user), g(group), o(other) + -prefix=DIR Specify an alternative installation prefix + -version=VER Specify alternative OpenFOAM version (eg, 3.0, 1612, ...) + -csh | -sh Produce output suitable for a csh or sh 'eval' + -csh-verbose | -sh-verbose + As per -csh | -sh, with additional verbosity + -q, -quiet Suppress all normal output + -s, -silent Suppress stderr, except -csh-verbose, -sh-verbose output + -help Print the usage + +Locate user/group/other file with semantics similar to the +~OpenFOAM/fileName expansion. + +Single character options must not be grouped. Equivalent options: + -mode=MODE, -mode MODE, -m MODE + -prefix=DIR, -prefix DIR, -p DIR + -version=VER, -version VER, -v VER + +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 exit 1 } -#------------------------------------------------------------------------------- -# The bin dir: -binDir="${0%/*}" +# Report error and exit +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: -projectDir="${binDir%/bin}" +# Could not resolve projectDir, prefixDir? (eg, called as ./bin/foamEtcFile) +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): -prefixDir="${projectDir%/*}" +projectName="${WM_PROJECT:-OpenFOAM}" # The project name +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. -# - projectDirBase: projectDirName without the version -# - version -# - versionNum (debian only) # -case "$projectDirName" in -OpenFOAM-* | openfoam-*) # OpenFOAM-<VERSION> or openfoam-<VERSION> - projectDirBase="${projectDirName%%-*}-" - version="${projectDirName#*-}" - ;; +# - projectVersion: update unless already set +# +# Helper variables: +# - 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> - projectDirBase="openfoam" - 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%.}" + # Ignore special treatment if no decimals were inserted. + [ "${#version}" -gt "${#versionNum}" ] || unset versionNum ;; - (*) # Fallback - use current environment setting - version="$WM_PROJECT_VERSION" + (*) + die "unknown/unsupported naming convention for '$projectDirName'" ;; esac - ;; -*) - echo "foamEtcFile error: unknown/unsupported naming convention" 1>&2 - exit 1 - ;; -esac + # Set projectVersion if required + : ${projectVersion:=$version} +} -# Set version and update versionNum, projectDirName accordingly +# Set projectVersion and update versionNum, projectDirName accordingly setVersion() { - version="$1" + projectVersion="$1" - # Convert x.y.z -> xyz version (if installation looked like debian) - [ -n "$versionNum" ] && versionNum=$(echo "$version" | sed -e 's@\.@@g') + # Need dirBase when reassembling projectDirName + [ -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' -mode=ugo -unset optAll optList optShell +optMode=ugo # Default mode is always 'ugo' +unset optAll optList optShell optVersion -# parse options +# Parse options while [ "$#" -gt 0 ] do case "$1" in @@ -161,34 +217,38 @@ do optList=true unset optShell ;; + -list-test) + optList='test' + unset optShell + ;; -csh | -sh | -csh-verbose | -sh-verbose) optShell="${1#-}" unset optAll ;; -mode=[ugo]*) - mode="${1#*=}" + optMode="${1#*=}" ;; -prefix=/*) prefixDir="${1#*=}" prefixDir="${prefixDir%/}" ;; -version=*) - setVersion "${1#*=}" + optVersion="${1#*=}" ;; -m | -mode) - mode="$2" + optMode="$2" + shift # Sanity check. Handles missing argument too. - case "$mode" in - [ugo]*) + case "$optMode" in + ([ugo]*) ;; - *) - usage "invalid mode '$mode'" + (*) + die "invalid mode '$optMode'" ;; esac - shift ;; -p | -prefix) - [ "$#" -ge 2 ] || usage "'$1' option requires an argument" + [ "$#" -ge 2 ] || die "'$1' option requires an argument" prefixDir="${2%/}" shift ;; @@ -199,8 +259,8 @@ do optSilent=true ;; -v | -version) - [ "$#" -ge 2 ] || usage "'$1' option requires an argument" - setVersion "$2" + [ "$#" -ge 2 ] || die "'$1' option requires an argument" + optVersion="$2" shift ;; --) @@ -208,7 +268,7 @@ do break ;; -*) - usage "unknown option: '$1'" + die "unknown option: '$1'" ;; *) break @@ -217,12 +277,27 @@ do shift 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" +projectSite="${WM_PROJECT_SITE:-$prefixDir/site}" + # Debugging: # echo "Installed locations:" 1>&2 -# for i in projectDir prefixDir projectDirName version versionNum +# for i in projectDir prefixDir projectDirName projectVersion # do # eval echo "$i=\$$i" 1>&2 # done @@ -235,19 +310,17 @@ fileName="${1#~OpenFOAM/}" # Define the various places to be searched: unset dirList -case "$mode" in (*u*) # (U)ser - dir="$HOME/.${WM_PROJECT:-OpenFOAM}" - dirList="$dirList $dir/$version $dir" +case "$optMode" in (*u*) # (U)ser + dirList="$dirList $HOME/.$projectName/$projectVersion $HOME/.$projectName" ;; esac -case "$mode" in (*g*) # (G)roup == site - dir="${WM_PROJECT_SITE:-$prefixDir/site}" - dirList="$dirList $dir/$version $dir" +case "$optMode" in (*g*) # (G)roup == site + dirList="$dirList $projectSite/$projectVersion $projectSite" ;; esac -case "$mode" in (*o*) # (O)ther == shipped +case "$optMode" in (*o*) # (O)ther == shipped dirList="$dirList $projectDir/etc" ;; esac @@ -259,30 +332,54 @@ set -- $dirList # exitCode=0 -if [ "$optList" = true ] +if [ -n "$optList" ] then # 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 [ -n "$optQuiet" ] && exit 0 - for dir - do + # Test for directory or file too? + if [ "$optList" = "test" ] + then + exitCode=2 # Fallback to a general error (file not found) + if [ "$nArgs" -eq 1 ] then - echo "$dir/$fileName" + for dir + do + resolved="$dir/$fileName" + if [ -f "$resolved" ] + then + echo "$resolved" + exitCode=0 # OK + fi + done else - echo "$dir" + for dir + do + if [ -d "$dir" ] + then + echo "$dir" + exitCode=0 # OK + fi + done fi - done + else + for dir + do + echo "$dir${fileName:+/}$fileName" + done + fi 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 do @@ -316,7 +413,6 @@ else fi - exit $exitCode #------------------------------------------------------------------------------ diff --git a/bin/foamExec b/bin/foamExec index cb6fec4bfa6410e3ca1d36d93a98d79afd973ea5..38a032935c9e8a1c7c13682460783b0419a89e5b 100755 --- a/bin/foamExec +++ b/bin/foamExec @@ -26,7 +26,7 @@ # foamExec # # Description -# Usage: foamExec [-v foamVersion] <foamCommand> ... +# Usage: foamExec [-version=foamVersion] <foamCommand> ... # # Runs the <foamVersion> version of executable <foamCommand> # with the rest of the arguments. @@ -34,7 +34,7 @@ # Can also be used for parallel runs. For example, # \code # mpirun -np <nProcs> \ -# foamExec -version <foamVersion> <foamCommand> ... -parallel +# foamExec -version=VERSION <foamCommand> ... -parallel # \endcode # # Note @@ -55,34 +55,29 @@ usage() { Usage: ${0##*/} [OPTION] <application> ... 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 - -version <ver> specify an alternative OpenFOAM version + -version=VER Specify alternative OpenFOAM version (eg, 3.0, 1612, ...) 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 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: -binDir="${0%/*}" +## projectDirName="${projectDir##*/}" # The project directory name -# the project dir: -projectDir="${binDir%/bin}" +version="${WM_PROJECT_VERSION:-unknown}" -# the prefix dir (same as $FOAM_INST_DIR): -prefixDir="${projectDir%/*}" - -# # the name used for the project directory -# projectDirName="${projectDir##*/}" - - -unset etcOpts version +unset etcOpts # parse options while [ "$#" -gt 0 ] do @@ -90,6 +85,17 @@ do -h | -help) 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) [ "$#" -ge 2 ] || usage "'$1' option requires an argument" etcOpts="$etcOpts $1 $2" # pass-thru to foamEtcFile @@ -127,15 +133,15 @@ done # sourceRc() { - foamDotFile="$($binDir/foamEtcFile $etcOpts bashrc)" || { - echo "Error : bashrc file could not be found for OpenFOAM-${version:-${WM_PROJECT_VERSION:-???}}" 1>&2 + rcFile="$($binDir/foamEtcFile $etcOpts bashrc)" || { + echo "Error : bashrc file could not be found for OpenFOAM-$version" 1>&2 exit 1 } # set to consistent value before sourcing the bashrc export FOAM_INST_DIR="$prefixDir" - . $foamDotFile $FOAM_SETTINGS + . $rcFile $FOAM_SETTINGS } diff --git a/etc/config.csh/example/paraview b/etc/config.csh/example/paraview index b65dd6a07dcec007d2ffd01bee762ae537dc80c0..3ce3baa29960d658a7c35024d5dbf6a493af77ba 100644 --- a/etc/config.csh/example/paraview +++ b/etc/config.csh/example/paraview @@ -38,7 +38,7 @@ # 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 unset foamFile