512 lines
13 KiB
Bash
Executable File
512 lines
13 KiB
Bash
Executable File
#!/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 installation dir>/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
|
|
|
|
#------------------------------------------------------------------------------
|