1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
#----------------------------------*-sh-*--------------------------------------
# ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration |
# \\ / A nd | www.openfoam.com
# \\/ M anipulation |
#------------------------------------------------------------------------------
# Copyright (C) 2018-2020 OpenCFD Ltd.
#------------------------------------------------------------------------------
# License
# This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
#
# Script
# have_petsc
#
# Description
# Detection/setup of PETSC
#
# Requires
# PETSC_ARCH_PATH
# or config.sh/petsc
#
# Functions provided
# have_petsc, no_petsc, echo_petsc, hint_petsc, query_petsc
#
# Variables set on success
# HAVE_PETSC
# PETSC_ARCH_PATH
# PETSC_INC_DIR
# PETSC_LIB_DIR
#
#------------------------------------------------------------------------------
. ${WM_PROJECT_DIR:?}/wmake/scripts/sysFunctions # General system functions
#------------------------------------------------------------------------------
# Reset variables
no_petsc()
{
unset HAVE_PETSC PETSC_INC_DIR PETSC_LIB_DIR
}
# Report
echo_petsc()
{
echo "petsc=${HAVE_PETSC:-false}"
echo "root=$PETSC_ARCH_PATH"
echo "include=$PETSC_INC_DIR"
echo "library=$PETSC_LIB_DIR"
}
# Hint for enabling
hint_petsc()
{
/bin/cat<<INFORMATION 1>&2
==> petsc not found?
Enable in the OpenFOAM etc/bashrc, define manually or try with the
following (POSIX shell):
eval \$(foamEtcFile -sh -config petsc -- -force)
==
INFORMATION
}
# Query settings
query_petsc()
{
local config="config.sh/petsc"
local settings
if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile -mode=o "$config")"
then
. "$settings"
_process_query petsc "$PETSC_ARCH_PATH"
else
echo "(no $config settings)" 1>&2
echo "petsc=unknown"
fi
}
# On success, return 0 and export variables
# -> HAVE_PETSC, PETSC_INC_DIR, PETSC_LIB_DIR
have_petsc()
{
local warn="==> skip petsc"
local config="config.sh/petsc"
local settings
# Setup - prefer current environment value? (TDB)
if [ ! -d "$PETSC_ARCH_PATH" ]
then
if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config")"
then
. "$settings"
else
[ -n "$warn" ] && echo "$warn (no $config settings)"
return 2
fi
fi
# Expected location, include/library names
local prefix="$PETSC_ARCH_PATH"
local incName="petsc.h"
local libName="libpetsc"
local pkgName="PETSc"
local header library
# ----------------------------------
if isNone "$prefix"
then
[ -n "$warn" ] && echo "$warn (disabled)"
return 1
elif hasAbsdir "$prefix"
then
header=$(findFirstFile "$prefix/include/$incName")
library=$(findExtLib "$libName")
elif isSystem "$prefix"
then
header=$(findSystemInclude -name="$incName")
prefix=$(sysPrefix "$header")
# No system header, attempt discovery with pkg-config
if [ -z "$header" ] && pkg-config --exists "$pkgName" 2>/dev/null
then
header=$(pkg-config --cflags-only-I "$pkgName" | sed -e 's/^-[IL]//')
library=$(pkg-config --libs-only-L "$pkgName" | sed -e 's/^-[IL]//')
prefix="${header%/*}" # Basename
# Artifically adjust names (for later)
[ -n "$header" ] && header="$header/$incName"
[ -n "$library" ] && library="$library/$libName"
fi
else
unset prefix
fi
# ----------------------------------
# Header
[ -n "$header" ] || {
[ -n "$warn" ] && echo "$warn (no header)"
return 2
}
# Library
[ -n "$library" ] \
|| library=$(findLibrary -prefix="$prefix" -name="$libName") \
|| {
[ -n "$warn" ] && echo "$warn (no library)"
return 2
}
# ----------------------------------
# TODO: check size of petsc integer vs label, real vs double?
# OK
export HAVE_PETSC=true
export PETSC_ARCH_PATH="$prefix"
export PETSC_INC_DIR="${header%/*}" # Basename
export PETSC_LIB_DIR="${library%/*}" # Basename
}
# Reset variables
no_petsc
# Test/query
case "$1" in
-test)
have_petsc
echo_petsc
;;
-query)
query_petsc
;;
esac
#------------------------------------------------------------------------------
|