#!/bin/sh #------------------------------------------------------------------------------ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | # \\ / A nd | www.openfoam.com # \\/ M anipulation | #------------------------------------------------------------------------------ # Copyright (C) 2011-2015 OpenFOAM Foundation # Copyright (C) 2019-2024 OpenCFD Ltd. #------------------------------------------------------------------------------ # License # This file is part of OpenFOAM, distributed under GPL-3.0-or-later. # # Script # bin/foamInstallationTest # # Description # Check the machine, software components, and the OpenFOAM environment # for running OpenFOAM. # #------------------------------------------------------------------------------ # Base settings MIN_VERSION_GCC=7.5.0 MIN_VERSION_LLVM=7.0.1 # General WIDTH=20 # System variables HOST="$(uname -n)" OSTYPE="$(uname -s)" # OpenFOAM application to test for existence. Obtain version from wmake. foamTestApp=icoFoam # Global variables unset fatalError criticalError #============================================================================== # HELPER FUNCTIONS #============================================================================== hline() { echo "-------------------------------------------------------------------------------" } heading() { echo echo "$1" } fixlen() { WORD=$1 LDIFF=$(expr ${#WORD} - ${2:-4}) if [ $LDIFF -le 1 ] then while [ $LDIFF -lt 0 ] do WORD="$WORD " LDIFF=$(expr $LDIFF + 1) done echo "$WORD" else LDIFF=$(expr $LDIFF + 4) WORD=$(echo "$WORD" | cut -c${LDIFF}-) echo "...${WORD}" fi } reportEnv() { eval EXP_ENV="$1" eval EXP_PATH="$2" CRIT="$3" EXISTS=" no " ON_PATH="" if [ -n "$EXP_ENV" ] then if [ -e "$EXP_ENV" ] then EXISTS=" yes " if [ "$2" != noPath ] then ON_PATH=" no " oldIFS=$IFS IFS=':' for e in $EXP_PATH do case "$e" in "$EXP_ENV" | "$EXP_ENV/bin" | "$EXP_ENV/lib") ON_PATH="yes " break ;; esac done IFS=$oldIFS else CRIT=" $3" fi else ON_PATH=" " fi echo "$(fixlen "$1" 21) $(fixlen "$EXP_ENV" 40) $EXISTS $ON_PATH $CRIT" else echo "$(fixlen "$1" 21) $(fixlen "[env variable unset]" 40) $3" fi ERROR=false if [ "$EXISTS" = no ] || [ "$ON_PATH" = no ] then ERROR=true fi if [ "$3" = yes ] && [ "$ERROR" = true ] then criticalError="x${criticalError}" echo "WARNING: CRITICAL ERROR" echo fi } findExec() { if [ -x "$2" ] && [ ! -d "$2" ] then echo "$2" return 0 fi oldIFS=$IFS IFS=':' for d in $1 do if [ -x "$d/$2" ] && [ ! -d "$d/$2" ] then IFS=$oldIFS echo "$d/$2" return 0 fi done IFS=$oldIFS return 1 } # compare (required-version, version) # Major.minor.patch <= Major.minor.patch # vercmp_3() { local arg1="$1" local arg2="$2" oldIFS=$IFS IFS='.' set -- $arg1 local arg1Major=$1 arg1Minor=$2 arg1Patch="${3:-0}" set -- $arg2 local arg2Major=$1 arg2Minor=$2 arg2Patch="${3:-0}" IFS=$oldIFS #debug> echo "check $arg1 vs $arg2" #debug> echo "arg1maj=$arg1Major arg1min=$arg1Minor arg1patch=$arg1Patch" #debug> echo "arg2maj=$arg2Major arg2min=$arg2Minor arg2patch=$arg2Patch" # Major version if [ $arg1Major -lt $arg2Major ] then return 0 elif [ $arg1Major -gt $arg2Major ] then return 1 fi # Minor version if [ $arg1Minor -lt $arg2Minor ] then return 0 elif [ $arg1Minor -gt $arg2Minor ] then return 2 fi # Patch if [ -n "$arg1Patch" ] && [ -n "$arg2Patch" ] then if [ "$arg1Patch" -gt "$arg2Patch" ] then return 3 fi fi return 0 } reportExecutable() { APP_NAME="$1" APP_SPEC="$2" APP_PATH="$(findExec "$PATH" "$1")" VERSION="unknown" if [ -z "$APP_PATH" ] then echo "$(fixlen "${1##*/}" 9)" "*** not installed ***" VERSION="" case "$1" in *gcc* | *clang* | "$foamTestApp") echo " CRITICAL ERROR" criticalError="x${criticalError}" ;; esac echo return 1 fi case "$APP_NAME" in "$foamTestApp") VERSION=$($APP_NAME -help 2>&1 \ | sed -ne 's/^.*Build: *\([^ ][^ ]*\).*/\1/p') # Cannot do much with the build info: # Build: 51e3d2a8ae-20200528 (patch=200506) # so just treat as available/not available if [ -n "$VERSION" ] then VERSION="exists" fi ;; flex) VERSION=$(flex --version 2>/dev/null \ | sed -ne 's/flex \([0-9][0-9.]*\).*/\1/p') ;; make) VERSION=$(make --version 2>/dev/null \ | sed -ne 's/^.*[Mm]ake \([0-9][0-9.]*\).*/\1/p') ;; wmake) VERSION="$(wmake --version 2>/dev/null)" ;; *clang*) VERSION=$($APP_NAME --version 2>/dev/null \ | sed -ne '1{s/^.*version \([0-9][.0-9]*\).*/\1/p;}') if ! vercmp_3 "$MIN_VERSION_LLVM" "$VERSION" then case "$APP_NAME" in (*clang++*) SHORT_NAME=clang++ ;; (*) SHORT_NAME=clang ;; esac echo "ERROR: $SHORT_NAME version is too old for this release of OpenFOAM" echo " User version : $VERSION" echo " Minimum required: $MIN_VERSION_LLVM" echo fatalError="x${fatalError}" fi ;; *gcc* | *g++*) # parse things like this # -- # ... # gcc version 7.5.0 (SUSE Linux) # -- VERSION=$($APP_NAME -v 2>&1 \ | sed -ne 's/^gcc version \([0-9][0-9.]*\).*/\1/p') # Fallback? # parse things like this # -- # gcc (SUSE Linux) 7.5.0 # g++ (SUSE Linux) 7.5.0 # -- [ -n "$VERSION" ] || \ VERSION=$($APP_NAME --version 2>/dev/null \ | sed -ne '1{s/^g.*) \([0-9][.0-9]*\).*/\1/p;}') if ! vercmp_3 "$MIN_VERSION_GCC" "$VERSION" then case "$APP_NAME" in (*g++*) SHORT_NAME=g++ ;; (*) SHORT_NAME=gcc ;; esac echo "ERROR: $SHORT_NAME version is too old for this release of OpenFOAM" echo " User version : $VERSION" echo " Minimum required: $MIN_VERSION_GCC" echo fatalError="x${fatalError}" fi ;; esac if [ "$APP_PATH" = "$APP_SPEC" ] || [ -z "$APP_SPEC" ] then echo "$(fixlen "${APP_NAME##*/}" 12) $(fixlen "$VERSION" 10) $(fixlen "$APP_PATH" 55)" else echo "$(fixlen "${APP_NAME##*/}" 12) $(fixlen "$VERSION" 10)" echo "WARNING: Conflicting installations:" echo " OpenFOAM settings : $APP_SPEC" echo " current path : $APP_PATH" case "$APP_NAME" in *clang* | *gcc* | "$foamTestApp") echo " CRITICAL ERROR" criticalError="x${criticalError}" ;; esac echo fi } checkEnvironment() { if [ -d "$WM_PROJECT_DIR" ] then echo "$(fixlen OpenFOAM: $WIDTH) ${WM_PROJECT_DIR##*/}" else echo echo "ERROR: OpenFOAM environment not configured." echo echo " Please see the information in the README.md" echo " /OpenFOAM-${WM_PROJECT_VERSION}/README.md" echo " for information on setting-up the OpenFOAM environment." echo fatalError="x${fatalError}" exit 1 fi if [ -d "$WM_THIRD_PARTY_DIR" ] then echo "$(fixlen ThirdParty: $WIDTH) ${WM_THIRD_PARTY_DIR##*/}" else echo "$(fixlen ThirdParty: $WIDTH) [missing]" echo "This can be intentional, or indicate a faulty installation" fi } checkUserShell() { echo "$(fixlen Shell: $WIDTH) ${SHELL##*/}" case "$SHELL" in */csh | */tcsh | */bash | */ksh) ;; */dash | */zsh) echo "[The ${SHELL##*/} shell is generally okay to use]" ;; *) echo "ERROR: Cannot identify the shell you are running." echo " OpenFOAM ${WM_PROJECT_VERSION} is compatible with " echo " csh, tcsh, bash, ksh (and possibly dash, zsh)" echo fatalError="x${fatalError}" ;; esac } checkHostName() { echo "$(fixlen Host: $WIDTH) $HOST" if [ -z "$HOST" ] then echo "ERROR: Cannot stat hostname." echo " OpenFOAM ${WM_PROJECT_VERSION} needs a valid hostname." echo " Contact your system administrator." echo fatalError="x${fatalError}" fi } checkOS() { case "$OSTYPE" in Linux* | Darwin* | SunOS ) echo "$(fixlen OS: $WIDTH) $OSTYPE version $(uname -r)" ;; *) echo "ERROR: Incompatible operating system \"$OSTYPE\"." echo " OpenFOAM ${WM_PROJECT_VERSION} is currently available for" echo " Linux, Darwin and SunOS only." echo fatalError="x${fatalError}" ;; esac } #============================================================================== # MAIN SCRIPT #============================================================================== echo "Executing ${0##*/}" #------------------------------------------------------------------------------ heading "Basic setup :" hline checkEnvironment checkUserShell checkHostName checkOS hline #------------------------------------------------------------------------------ heading "Main OpenFOAM env variables :" COL1=$(fixlen Environment 21) COL2=$(fixlen FileOrDirectory 40) COL3="Valid" COL4="Path" COL5="Crit" hline echo "$COL1 $COL2 $COL3 $COL5" hline reportEnv '$WM_PROJECT_USER_DIR' noPath no reportEnv '$WM_THIRD_PARTY_DIR' noPath maybe reportEnv '$WM_PROJECT_SITE' noPath no hline #------------------------------------------------------------------------------ heading "OpenFOAM env variables in PATH :" hline echo "$COL1 $COL2 $COL3 $COL4 $COL5" hline reportEnv '$WM_PROJECT_DIR' '$PATH' yes echo reportEnv '$FOAM_APPBIN' '$PATH' yes reportEnv '$FOAM_SITE_APPBIN' '$PATH' no reportEnv '$FOAM_USER_APPBIN' '$PATH' no reportEnv '$WM_DIR' '$PATH' often hline #------------------------------------------------------------------------------ heading "OpenFOAM env variables in LD_LIBRARY_PATH :" hline echo "$COL1 $COL2 $COL3 $COL4 $COL5" hline reportEnv '$FOAM_LIBBIN' '$LD_LIBRARY_PATH' yes reportEnv '$FOAM_SITE_LIBBIN' '$LD_LIBRARY_PATH' no reportEnv '$FOAM_USER_LIBBIN' '$LD_LIBRARY_PATH' no reportEnv '$FOAM_EXT_LIBBIN' '$LD_LIBRARY_PATH' maybe reportEnv '$MPI_ARCH_PATH' '$LD_LIBRARY_PATH' yes hline #------------------------------------------------------------------------------ heading "Software Components" hline echo "$(fixlen Software 12) $(fixlen Version 10) $(fixlen Location 10)" hline reportExecutable flex reportExecutable make reportExecutable wmake for compilerType in c cxx do compiler="$(wmake -show-path-"$compilerType" 2>/dev/null)" if [ -n "$compiler" ] then reportExecutable "$compiler" else echo "unknown $compilerType compiler for $WM_COMPILER" fatalError="x${fatalError}" fi done hline reportExecutable "$foamTestApp" "$FOAM_APPBIN/$foamTestApp" #------------------------------------------------------------------------------ heading "Summary" hline if [ "${#fatalError}" -gt 0 ] then echo "The system test evoked ${#fatalError} fatal error(s)." else echo "Base configuration ok." fi if [ "${#criticalError}" -gt 0 ] then echo "The foam installation contains ${#criticalError} critical error(s)." else echo "Critical systems ok." fi if [ "${#criticalError}" -gt 0 ] || [ "${#fatalError}" -gt 0 ] then echo echo "Review the output for warning messages and consult" echo "the installation guide for troubleshooting." fi echo echo Done echo exit 0 #------------------------------------------------------------------------------