2023-12-09 22:28:01 +01:00

189 lines
7.2 KiB
Bash

# Contributor: Oleg A. Khlybov <fougas@mail.ru>
# This package provides multiple library build flavors differentiated by
# the 3-character suffix XYZ as follows:
#
# * X is the scalar type based on the Netlib's SDCZ notation:
# - A for multiprecision or precision-neutral build
# - S for single precision real
# - D for double precision real
# - C for single precision complex
# - Z for double precision complex
#
# * Y is the execution model:
# - S for sequential code
# - M for MPI parallel code
# - T for multithreaded code, either bare threading or OpenMP, OpenACC etc.
# - H for heterogeneous code with CUDA, OpenCL etc.
#
# * Z is the build type:
# - O for optimized build
# - G for debugging build
#
# The suffix is used in the static and dynamic libraires as well as in PkgConfig .pc files.
# That is the ZMO suffix designates the optimized MPI parallel double precision complex library flavor.
# Consider the `pkg-config mumps-zmo --cflags` command to obtain the build-specific compilation flags.
_realname=mumps
pkgbase=mingw-w64-${_realname}
pkgname="${MINGW_PACKAGE_PREFIX}-${_realname}"
pkgver=5.5.1
pkgrel=1
arch=('any')
mingw_arch=('mingw64' 'ucrt64')
pkgdesc="Sparse direct SLAE solver (mingw-w64)"
depends=("${MINGW_PACKAGE_PREFIX}-gcc-libs"
$([[ ${MINGW_PACKAGE_PREFIX} == *-clang-* ]] || echo "${MINGW_PACKAGE_PREFIX}-gcc-libgfortran")
"${MINGW_PACKAGE_PREFIX}-openblas"
"${MINGW_PACKAGE_PREFIX}-metis"
"${MINGW_PACKAGE_PREFIX}-parmetis"
"${MINGW_PACKAGE_PREFIX}-scotch"
"${MINGW_PACKAGE_PREFIX}-scalapack"
"${MINGW_PACKAGE_PREFIX}-msmpi")
makedepends=("${MINGW_PACKAGE_PREFIX}-cc"
"${MINGW_PACKAGE_PREFIX}-fc"
"${MINGW_PACKAGE_PREFIX}-pkgconf")
optdepends=("${MINGW_PACKAGE_PREFIX}-tcl: build & run test suite")
license=('spdx:CECILL-C')
url="https://mumps-solver.org"
source=("https://graal.ens-lyon.fr/MUMPS/MUMPS_${pkgver}.tar.gz"
"0001-makefile.inc.patch"
"0002-skip-examples.patch"
"0003-fix-setenv.patch"
"all.tcl"
"tclbuildtest.tcl"
"mumps.test")
sha256sums=('1abff294fa47ee4cfd50dfd5c595942b72ebfcedce08142a75a99ab35014fa15'
'd4e3d06c316544304ac6fefd595f20fd5865e791c9377e031fbad49b6238406c'
'bbefd4a5f841536132f32c1ffc684a58b778901cd777445ca817dbb34d983450'
'11609d173fc0df7b1d7269c19d5d81b2fd05a3abc57eff8ba12de1597242236c'
'ec5072630e1c0309fe383669e9187790cd135a393c67bc4bc35cf60b0ba396ff'
'15c7af25b91406d5fe5f26cfe00963b6cfde1c3dd466eb25f1b6fae299934966'
'0b58c5bb34403a69bc4c4ab1ab551876695bff1f2be66ecaa9b5528a74e8f8f6')
apply_patch_with_msg() {
for _patch in "$@"
do
msg2 "Applying ${_patch}"
patch -Nbp1 -i "${srcdir}/${_patch}"
done
}
prepare() {
cd "${srcdir}/${_realname}_${pkgver}"
apply_patch_with_msg \
"0001-makefile.inc.patch" \
"0002-skip-examples.patch" \
"0003-fix-setenv.patch"
}
seq_pc="metis scotch openblas"
shm_pc=$seq_pc
mpi_pc="parmetis ptscotch scalapack openblas msmpi"
build() {
cd "${srcdir}/${_realname}_${pkgver}"
if [[ ${MINGW_PACKAGE_PREFIX} != *-clang-* ]]; then
export FC=gfortran
export FFLAGS="-fallow-argument-mismatch -fallow-invalid-boz"
else
export FC=flang
fi
for mod in SEQ SHM PAR; do
cp Makefile.inc.${mod} Makefile.inc
make -j1 clean s d c z
if [[ $mod == SEQ ]]; then
cp libseq/libmpiseq_seq.a lib/libmumps_mpi_seq.a
cp PORD/lib/libpord.a lib/libmumps_pord.a
fi
done
cd lib
rm -rf libmumps-*.a
strip -S *.a # Thin archives require the constituent archives to be stripped beforehand
for x in c z s d; do
ar crsT libmumps-${x}so.a lib${x}mumps_seq.a libmumps_common_seq.a libmumps_pord.a libmumps_mpi_seq.a
ar crsT libmumps-${x}to.a lib${x}mumps_shm.a libmumps_common_shm.a libmumps_pord.a libmumps_mpi_seq.a
ar crsT libmumps-${x}mo.a lib${x}mumps_mpi.a libmumps_common_mpi.a libmumps_pord.a
# TODO export only the required driver routine to reduce the exported symbol table size
${FC} -shared -Wl,--enable-auto-import -Wl,--export-all-symbols -o libmumps-${x}so.dll -Wl,--out-implib,libmumps-${x}so.dll.a -Wl,--whole-archive libmumps-${x}so.a -Wl,--no-whole-archive -lesmumps $(pkg-config ${seq_pc} --libs)
${FC} -shared -fopenmp -Wl,--enable-auto-import -Wl,--export-all-symbols -o libmumps-${x}to.dll -Wl,--out-implib,libmumps-${x}to.dll.a -Wl,--whole-archive libmumps-${x}to.a -Wl,--no-whole-archive -lesmumps $(pkg-config ${shm_pc} --libs)
mpifort -shared -fopenmp -Wl,--enable-auto-import -Wl,--export-all-symbols -o libmumps-${x}mo.dll -Wl,--out-implib,libmumps-${x}mo.dll.a -Wl,--whole-archive libmumps-${x}mo.a -Wl,--no-whole-archive -lptesmumps $(pkg-config ${mpi_pc} --libs)
done
}
package() {
cd "$srcdir/${_realname}_${pkgver}"
mkdir -p ${pkgdir}${MINGW_PREFIX}/{bin,lib,include/mumps/mpi_seq} ${pkgdir}${MINGW_PREFIX}/lib/pkgconfig ${pkgdir}${MINGW_PREFIX}/share/test/mumps
(
cd libseq
install -m644 mpi*.h "${pkgdir}${MINGW_PREFIX}/include/mumps/mpi_seq"
)
(
cd lib
rm -f libpord*.a
install -m644 *.a "${pkgdir}${MINGW_PREFIX}/lib"
install -m644 *.dll "${pkgdir}${MINGW_PREFIX}/bin"
)
(
cd include
install -m644 *.h "${pkgdir}${MINGW_PREFIX}/include"
)
(
cp ${srcdir}/{all.tcl,tclbuildtest.tcl,mumps.test} ${pkgdir}${MINGW_PREFIX}/share/test/mumps
cd "$srcdir/${_realname}_${pkgver}/examples"
cp c_example.c ?simpletest.F input_simpletest_* ${pkgdir}${MINGW_PREFIX}/share/test/mumps
)
if [[ ${MINGW_PACKAGE_PREFIX} != *-clang-* ]]; then
_fc_libs="-lgfortran -lquadmath"
fi
for x in c z s d; do
case $x in
c) scalar='single precision complex';;
z) scalar='double precision complex';;
s) scalar='single precision';;
d) scalar='double precision';;
esac
echo "
prefix=${MINGW_PREFIX}
libdir=\${prefix}/lib
includedir=\${prefix}/include
Name: ${_realname}
URL: ${url}
Version: ${pkgver}
Description: Sequential $scalar MUMPS build
Requires.private: ${seq_pc}
Cflags: -I\${includedir}/mumps/mpi_seq
Libs.private: -lmumps-${x}so -lesmumps ${_fc_libs}
Libs: -lmumps-${x}so
" | sed '/^\s*$/d;s/^\s*//' > "${pkgdir}${MINGW_PREFIX}/lib/pkgconfig/${_realname}-${x}so.pc"
echo "
prefix=${MINGW_PREFIX}
libdir=\${prefix}/lib
includedir=\${prefix}/include
Name: ${_realname}
URL: ${url}
Version: ${pkgver}
Description: OpenMP $scalar MUMPS build
Requires.private: ${shm_pc}
Cflags: -I\${includedir}/mumps/mpi_seq
Libs.private: -fopenmp -lmumps-${x}to -lesmumps ${_fc_libs}
Libs: -lmumps-${x}to
" | sed '/^\s*$/d;s/^\s*//' > "${pkgdir}${MINGW_PREFIX}/lib/pkgconfig/${_realname}-${x}to.pc"
echo "
prefix=${MINGW_PREFIX}
libdir=\${prefix}/lib
includedir=\${prefix}/include
Name: ${_realname}
URL: ${url}
Version: ${pkgver}
Description: MPI+OpenMP $scalar MUMPS build
Cflags:
Requires.private: ${mpi_pc}
Libs.private: -fopenmp -lmumps-${x}mo -lptesmumps ${_fc_libs}
Libs: -lmumps-${x}mo
" | sed '/^\s*$/d;s/^\s*//' > "${pkgdir}${MINGW_PREFIX}/lib/pkgconfig/${_realname}-${x}mo.pc"
done
}