Skip to content
Snippets Groups Projects
foamEtcFile 8.02 KiB
Newer Older
  • Learn to ignore specific revisions
  • Henry's avatar
    Henry committed
    #!/bin/sh
    #------------------------------------------------------------------------------
    # =========                 |
    # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    #  \\    /   O peration     |
    
    Henry Weller's avatar
    Henry Weller committed
    #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
    
    #    \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
    
    Henry's avatar
    Henry committed
    #-------------------------------------------------------------------------------
    # License
    #     This file is part of OpenFOAM.
    #
    #     OpenFOAM 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.
    #
    #     OpenFOAM 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 OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
    #
    # Script
    #     foamEtcFile
    #
    # Description
    #     Locate user/group/shipped file with semantics similar to the
    #     ~OpenFOAM/fileName expansion.
    #
    #     The -mode option can be used to allow chaining from
    #     personal settings to site-wide settings.
    #
    #     For example, within the user ~/.OpenFOAM/<VER>/prefs.sh:
    #     \code
    
    #        foamFile=$(foamEtcFile -mode go prefs.sh) && . $foamFile
    
    Henry's avatar
    Henry committed
    #     \endcode
    #
    # Note
    
    #     This script must exist in $FOAM_INST_DIR/OpenFOAM-<VERSION>/bin/
    #     or $FOAM_INST_DIR/openfoam<VERSION>/bin/ (for the debian version)
    
    Henry's avatar
    Henry committed
    #
    #-------------------------------------------------------------------------------
    
    unset optQuiet optSilent
    
    Henry's avatar
    Henry committed
    usage() {
        [ "${optQuiet:-$optSilent}" = true ] && exit 1
    
        exec 1>&2
        while [ "$#" -ge 1 ]; do echo "$1"; shift; done
        cat<<USAGE
    
    Usage: ${0##*/} [OPTION] fileName
           ${0##*/} [OPTION] -list
    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
    
    Henry's avatar
    Henry committed
      -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.
    
    Henry's avatar
    Henry committed
    
      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:
    
    Henry's avatar
    Henry committed
    binDir="${0%/*}"
    
    
    # The project dir:
    
    Henry's avatar
    Henry committed
    projectDir="${binDir%/bin}"
    
    
    # The prefix dir (same as $FOAM_INST_DIR):
    
    Henry's avatar
    Henry committed
    prefixDir="${projectDir%/*}"
    
    
    # The name used for the project directory
    
    Henry's avatar
    Henry committed
    projectDirName="${projectDir##*/}"
    
    
    # versionNum used for debian packaging
    unset version versionNum
    
    # Handle standard and debian naming conventions
    # - set version (always) and versionNum (debian only)
    
    Henry's avatar
    Henry committed
    #
    case "$projectDirName" in
    
    OpenFOAM-*)         # standard naming: OpenFOAM-<VERSION>
    
    Henry's avatar
    Henry committed
        version="${projectDirName##OpenFOAM-}"
        ;;
    
    
    openfoam[0-9]* | openfoam-dev)     # debian naming: openfoam<VERSION>
    
    Henry's avatar
    Henry committed
        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%.}"
    
    Henry's avatar
    Henry committed
            ;;
    
    
        (*) # Fallback - use current environment setting
    
    Henry's avatar
    Henry committed
            version="$WM_PROJECT_VERSION"
            ;;
        esac
        ;;
    
    *)
    
        echo "${0##*/} Error : unknown/unsupported naming convention" 1>&2
    
    # Default mode is always 'ugo'
    
    Henry's avatar
    Henry committed
    mode=ugo
    
    unset optAll optList optShell
    
    Henry's avatar
    Henry committed
    
    # parse options
    while [ "$#" -gt 0 ]
    do
        case "$1" in
        -h | -help)
            usage
            ;;
        -a | -all)
            optAll=true
    
    Henry's avatar
    Henry committed
            ;;
        -l | -list)
            optList=true
    
            unset optShell
            ;;
        -csh | -sh | -csh-verbose | -sh-verbose)
            optShell="${1#-}"
            unset optAll
    
    Henry's avatar
    Henry committed
            ;;
    
        -mode=[ugo]*)
            mode="${1#-mode=}"
            ;;
        -prefix=/*)
            prefixDir="${1#-prefix=}"
            prefixDir="${prefixDir%/}"
            ;;
        -version=*)
            version="${1#-version=}"
            # convert x.y.z -> xyz version (if installation looked like debian)
            if [ -n "$versionNum" ]
            then
                versionNum=$(echo "$version" | sed -e 's@\.@@g')
            fi
            ;;
    
    Henry's avatar
    Henry committed
        -m | -mode)
            mode="$2"
    
            # Sanity check. Handles missing argument too.
    
    Henry's avatar
    Henry committed
            case "$mode" in
    
            [ugo]*)
                ;;
    
    Henry's avatar
    Henry committed
            *)
    
                usage "invalid mode '$mode'"
                ;;
    
    Henry's avatar
    Henry committed
            esac
            shift
            ;;
        -p | -prefix)
            [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
    
            prefixDir="${2%/}"
    
    Henry's avatar
    Henry committed
            shift
            ;;
        -q | -quiet)
            optQuiet=true
            ;;
        -s | -silent)
            optSilent=true
            ;;
        -v | -version)
            [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
            version="$2"
            # convert x.y.z -> xyz version (if installation looked like debian)
            if [ -n "$versionNum" ]
            then
                versionNum=$(echo "$version" | sed -e 's@\.@@g')
            fi
            shift
            ;;
        --)
            shift
            break
            ;;
        -*)
    
            usage "unknown option: '$1'"
    
    Henry's avatar
    Henry committed
            ;;
        *)
            break
            ;;
        esac
        shift
    done
    
    
    # Update projectDir accordingly
    if [ -n "$versionNum" ]
    then
        projectDir="$prefixDir/openfoam$versionNum"                 # debian
    else
        projectDir="$prefixDir/${WM_PROJECT:-OpenFOAM}-$version"    # standard
    fi
    
    
    Henry's avatar
    Henry committed
    # debugging:
    # echo "Installed locations:"
    # for i in projectDir prefixDir projectDirName version versionNum
    # do
    #     eval echo "$i=\$$i"
    # done
    
    
    # Save the essential bits of information
    # silently remove leading ~OpenFOAM/ (used in Foam::findEtcFile)
    nArgs=$#
    fileName="${1#~OpenFOAM/}"
    
    # Define the various places to be searched:
    unset dirList
    
    case "$mode" in (*u*)   # user
        dir="$HOME/.${WM_PROJECT:-OpenFOAM}"
        dirList="$dirList $dir/$version $dir"
    
    case "$mode" in (*g*)   # group (site)
        dir="${WM_PROJECT_SITE:-$prefixDir/site}"
        dirList="$dirList $dir/$version $dir"
    
    case "$mode" in (*o*)   # other (shipped)
        dirList="$dirList $projectDir/etc"
    
    Henry's avatar
    Henry committed
        ;;
    esac
    set -- $dirList
    
    
    #
    # The main routine
    #
    
    exitCode=0
    if [ "$optList" = true ]
    then
    
        # list directories, or potential file locations
        [ "$nArgs" -le 1 ] || usage
    
        # a silly combination, but -quiet does have precedence
    
        [ -n "$optQuiet" ] && exit 0
    
    Henry's avatar
    Henry committed
    
        for dir
        do
            if [ "$nArgs" -eq 1 ]
            then
                echo "$dir/$fileName"
            else
                echo "$dir"
            fi
        done
    
    else
    
        [ "$nArgs" -eq 1 ] || usage
    
        # general error, eg file not found
        exitCode=2
    
        for dir
        do
            if [ -f "$dir/$fileName" ]
            then
                exitCode=0
    
                [ -n "$optQuiet" ] && break
    
                case "$optShell" in
                (*verbose)
                    echo "Using: $dir/$fileName" 1>&2
                    ;;
                esac
    
                case "$optShell" in
                csh*)
                    echo "source $dir/$fileName"
                    break
                    ;;
                sh*)
                    echo ". $dir/$fileName"
                    break
                    ;;
                *)
                    echo "$dir/$fileName"
                    [ -n "$optAll" ] || break
                    ;;
                esac
    
    Henry's avatar
    Henry committed
            fi
        done
    
    fi
    
    
    exit $exitCode
    
    #------------------------------------------------------------------------------