sci-libs/hdf5: Port to CMake (again)

Signed-off-by: Michał Górny <mgorny@gentoo.org>
This commit is contained in:
Michał Górny 2025-04-22 21:03:13 +02:00
parent 0416108771
commit 70abb3acfb
No known key found for this signature in database
GPG Key ID: 639ADAE2329E240E
4 changed files with 438 additions and 0 deletions

View File

@ -0,0 +1,64 @@
From 02b701653deb5eeaa6fe4462ba5c9bdd30dc778d Mon Sep 17 00:00:00 2001
From: Atri Bhattacharya <badshah400@gmail.org>
Date: Tue, 11 Mar 2025 22:44:29 +0530
Subject: [PATCH 1/2] h5cc: Fix location of settings and pkgconfig files
In h5cc and other compiler wrappers, drop hardcoded 'lib' as the dir for
libhdf5.settings and pkgconfig scripts and use cmake computed values for
HDF5_INSTALL_LIB_DIR. This fixes issues on systems where the libdir is
'lib64' for instance, as on 64-bit Linux OSes, and 'lib' in the
wrappers point to incorrect locations of the settings and pkgconfig
files.
---
config/cmake/libh5cc.in | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/config/cmake/libh5cc.in b/config/cmake/libh5cc.in
index 2608f49423a..3ac9588740b 100644
--- a/config/cmake/libh5cc.in
+++ b/config/cmake/libh5cc.in
@@ -32,7 +32,7 @@ pc_args=""
# libhdf5.settings file residing in the lib directory.
showconfigure()
{
- cat $dir/lib/libhdf5.settings
+ cat $dir/@HDF5_INSTALL_LIB_DIR@/libhdf5.settings
status=$?
}
@@ -57,7 +57,7 @@ usage() {
exit $EXIT_FAILURE
}
-export PKG_CONFIG_PATH=$dir/lib/pkgconfig
+export PKG_CONFIG_PATH=$dir/@HDF5_INSTALL_LIB_DIR@/pkgconfig
for arg in $@ ; do
case "$arg" in
From b777d6f4d8df67726c7611a945f3e204513efd16 Mon Sep 17 00:00:00 2001
From: Atri Bhattacharya <badshah400@gmail.org>
Date: Tue, 11 Mar 2025 22:52:17 +0530
Subject: [PATCH 2/2] h5cc: Drop -show from output when calling command.
When calling `h5cc -show FOO`, the output should not repeat the '-show'
argument itself. This commit fixes the '-show' command invoked from a
cmake built h5cc to be consistent with an (previously) autotools built
one.
---
config/cmake/libh5cc.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/config/cmake/libh5cc.in b/config/cmake/libh5cc.in
index 3ac9588740b..2af2abf0aff 100644
--- a/config/cmake/libh5cc.in
+++ b/config/cmake/libh5cc.in
@@ -66,7 +66,7 @@ for arg in $@ ; do
exit $status
;;
-show)
- echo @_PKG_CONFIG_COMPILER@ $@ `pkg-config $pc_args --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@`
+ echo @_PKG_CONFIG_COMPILER@ ${@:2} `pkg-config $pc_args --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@`
exit $status
;;
-help)

View File

@ -0,0 +1,63 @@
From 4cca21399b3bca4d21ed962640b8bdee5062550b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
Date: Tue, 22 Apr 2025 20:24:09 +0200
Subject: [PATCH 1/2] h5cc: Fix bashism
Replace the `${@:2}` construct that is specific to bash shell with
a more portable approach based on `shift`, in order to restore
compatibility with more strict POSIX shells. This fixes a regression
introduced in #5361.
---
config/cmake/libh5cc.in | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/config/cmake/libh5cc.in b/config/cmake/libh5cc.in
index 2af2abf0aff..eea811e5e18 100644
--- a/config/cmake/libh5cc.in
+++ b/config/cmake/libh5cc.in
@@ -66,7 +66,8 @@ for arg in $@ ; do
exit $status
;;
-show)
- echo @_PKG_CONFIG_COMPILER@ ${@:2} `pkg-config $pc_args --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@`
+ shift
+ echo @_PKG_CONFIG_COMPILER@ $@ `pkg-config $pc_args --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@`
exit $status
;;
-help)
From a8b2c89ad7d1cfd016e6e901efa14a52f65fa883 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
Date: Tue, 22 Apr 2025 20:27:26 +0200
Subject: [PATCH 2/2] h5cc: Fix passing arguments to compiler subprocesses
Pass arguments to subprocesses via quoted `"$@"` rather than plain `$@`,
in order to prevent the shell from applying word splitting, filename
expansion, etc., and therefore ensure that they are passed through
to the compiler process unchanged.
---
config/cmake/libh5cc.in | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/config/cmake/libh5cc.in b/config/cmake/libh5cc.in
index eea811e5e18..939698c3640 100644
--- a/config/cmake/libh5cc.in
+++ b/config/cmake/libh5cc.in
@@ -67,7 +67,7 @@ for arg in $@ ; do
;;
-show)
shift
- echo @_PKG_CONFIG_COMPILER@ $@ `pkg-config $pc_args --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@`
+ echo @_PKG_CONFIG_COMPILER@ "$@" `pkg-config $pc_args --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@`
exit $status
;;
-help)
@@ -79,7 +79,7 @@ for arg in $@ ; do
pc_args="$pc_args $arg"
;;
*)
- @_PKG_CONFIG_COMPILER@ $@ `pkg-config $pc_args --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@`
+ @_PKG_CONFIG_COMPILER@ "$@" `pkg-config $pc_args --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@`
status=$?
exit $status
;;

View File

@ -0,0 +1,187 @@
From c60ce3e3e9110740bf1f3f0914943ecb549d7d33 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
Date: Tue, 22 Apr 2025 20:54:12 +0200
Subject: [PATCH] h5cc: Allow overriding the compilers written into the file
Add a set of `PKG_CONFIG_C_COMPILER`, `PKG_CONFIG_CXX_COMPILER`
and `PKG_CONFIG_Fortran_COMPILER` variables that can be used to override
the compiler string written into `h5cc`, `h5c++`, etc. This is
particularly useful when e.g. using ccache during the build,
as the ccache path otherwise ends up in `h5cc`.
---
CMakeLists.txt | 24 ++++++++++++++++++++++++
c++/src/CMakeLists.txt | 6 +-----
fortran/src/CMakeLists.txt | 6 +-----
hl/c++/src/CMakeLists.txt | 6 +-----
hl/fortran/src/CMakeLists.txt | 6 +-----
hl/src/CMakeLists.txt | 6 +-----
release_docs/INSTALL_CMake.txt | 4 ++++
src/CMakeLists.txt | 6 +-----
8 files changed, 34 insertions(+), 30 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a95a6e4a48c..d0e2fe8d34c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1057,6 +1057,16 @@ else ()
set (HDF5_ENABLE_MAP_API OFF CACHE BOOL "Build the map API" FORCE)
endif ()
+#-----------------------------------------------------------------------------
+# Option to override the compiler for pkg-config & h5cc
+#-----------------------------------------------------------------------------
+if (HDF5_ENABLE_PARALLEL AND MPI_C_FOUND)
+ set (_PKG_CONFIG_C_COMPILER ${MPI_C_COMPILER})
+else ()
+ set (_PKG_CONFIG_C_COMPILER ${CMAKE_C_COMPILER})
+endif ()
+set (PKG_CONFIG_C_COMPILER ${_PKG_CONFIG_C_COMPILER} CACHE STRING "C compiler to use in h5cc")
+
#-----------------------------------------------------------------------------
# Add the HDF5 Library Target to the build
#-----------------------------------------------------------------------------
@@ -1220,6 +1230,13 @@ if (EXISTS "${HDF5_SOURCE_DIR}/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/for
endif ()
endif ()
+ if (HDF5_ENABLE_PARALLEL AND MPI_Fortran_FOUND)
+ set (_PKG_CONFIG_Fortran_COMPILER ${MPI_Fortran_COMPILER})
+ else ()
+ set (_PKG_CONFIG_Fortran_COMPILER ${CMAKE_Fortran_COMPILER})
+ endif ()
+ set (PKG_CONFIG_Fortran_COMPILER ${_PKG_CONFIG_Fortran_COMPILER} CACHE STRING "Fortran compiler to use in h5cc")
+
add_subdirectory (fortran)
if (HDF5_BUILD_HL_LIB)
if (EXISTS "${HDF5_SOURCE_DIR}/hl/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/fortran")
@@ -1247,6 +1264,13 @@ if (EXISTS "${HDF5_SOURCE_DIR}/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/c++")
include (${HDF_RESOURCES_DIR}/HDFCompilerCXXFlags.cmake)
+ if (HDF5_ENABLE_PARALLEL AND MPI_CXX_FOUND)
+ set (_PKG_CONFIG_CXX_COMPILER ${MPI_CXX_COMPILER})
+ else ()
+ set (_PKG_CONFIG_CXX_COMPILER ${CMAKE_CXX_COMPILER})
+ endif ()
+ set (PKG_CONFIG_CXX_COMPILER ${_PKG_CONFIG_CXX_COMPILER} CACHE STRING "C++ compiler to use in h5cc")
+
add_subdirectory (c++)
if (HDF5_BUILD_HL_LIB)
if (EXISTS "${HDF5_SOURCE_DIR}/hl/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/c++")
diff --git a/c++/src/CMakeLists.txt b/c++/src/CMakeLists.txt
index 09546acd451..21325d6ca50 100644
--- a/c++/src/CMakeLists.txt
+++ b/c++/src/CMakeLists.txt
@@ -206,11 +206,7 @@ install (
)
if (NOT WIN32 AND NOT MINGW)
- if (HDF5_ENABLE_PARALLEL AND MPI_CXX_FOUND)
- set (_PKG_CONFIG_COMPILER ${MPI_CXX_COMPILER})
- else ()
- set (_PKG_CONFIG_COMPILER ${CMAKE_CXX_COMPILER})
- endif ()
+ set (_PKG_CONFIG_COMPILER ${PKG_CONFIG_CXX_COMPILER})
configure_file (
${HDF_RESOURCES_DIR}/libh5cc.in
${HDF5_BINARY_DIR}/CMakeFiles/h5c++
diff --git a/fortran/src/CMakeLists.txt b/fortran/src/CMakeLists.txt
index 2b6da612015..92bf227b813 100644
--- a/fortran/src/CMakeLists.txt
+++ b/fortran/src/CMakeLists.txt
@@ -614,11 +614,7 @@ install (
)
if (NOT WIN32 AND NOT MINGW)
- if (HDF5_ENABLE_PARALLEL AND MPI_Fortran_FOUND)
- set (_PKG_CONFIG_COMPILER ${MPI_Fortran_COMPILER})
- else ()
- set (_PKG_CONFIG_COMPILER ${CMAKE_Fortran_COMPILER})
- endif ()
+ set (_PKG_CONFIG_COMPILER ${PKG_CONFIG_Fortran_COMPILER})
configure_file (
${HDF_RESOURCES_DIR}/libh5cc.in
${HDF5_BINARY_DIR}/CMakeFiles/h5fc
diff --git a/hl/c++/src/CMakeLists.txt b/hl/c++/src/CMakeLists.txt
index 3f2bd5af14a..0e6996437be 100644
--- a/hl/c++/src/CMakeLists.txt
+++ b/hl/c++/src/CMakeLists.txt
@@ -124,11 +124,7 @@ install (
)
if (NOT WIN32 AND NOT MINGW)
- if (HDF5_ENABLE_PARALLEL AND MPI_CXX_FOUND)
- set (_PKG_CONFIG_COMPILER ${MPI_CXX_COMPILER})
- else ()
- set (_PKG_CONFIG_COMPILER ${CMAKE_CXX_COMPILER})
- endif ()
+ set (_PKG_CONFIG_COMPILER ${PKG_CONFIG_CXX_COMPILER})
configure_file (
${HDF_RESOURCES_DIR}/libh5cc.in
${HDF5_BINARY_DIR}/CMakeFiles/h5hlc++
diff --git a/hl/fortran/src/CMakeLists.txt b/hl/fortran/src/CMakeLists.txt
index 649a9674d51..94864a6ceec 100644
--- a/hl/fortran/src/CMakeLists.txt
+++ b/hl/fortran/src/CMakeLists.txt
@@ -359,11 +359,7 @@ install (
)
if (NOT WIN32 AND NOT MINGW)
- if (HDF5_ENABLE_PARALLEL AND MPI_Fortran_FOUND)
- set (_PKG_CONFIG_COMPILER ${MPI_Fortran_COMPILER})
- else ()
- set (_PKG_CONFIG_COMPILER ${CMAKE_Fortran_COMPILER})
- endif ()
+ set (_PKG_CONFIG_COMPILER ${PKG_CONFIG_Fortran_COMPILER})
configure_file (
${HDF_RESOURCES_DIR}/libh5cc.in
${HDF5_BINARY_DIR}/CMakeFiles/h5hlfc
diff --git a/hl/src/CMakeLists.txt b/hl/src/CMakeLists.txt
index 3bca28e29f5..85fe2e87d98 100644
--- a/hl/src/CMakeLists.txt
+++ b/hl/src/CMakeLists.txt
@@ -156,11 +156,7 @@ install (
)
if (NOT WIN32 AND NOT MINGW)
- if (HDF5_ENABLE_PARALLEL AND MPI_C_FOUND)
- set (_PKG_CONFIG_COMPILER ${MPI_C_COMPILER})
- else ()
- set (_PKG_CONFIG_COMPILER ${CMAKE_C_COMPILER})
- endif ()
+ set (_PKG_CONFIG_COMPILER ${PKG_CONFIG_C_COMPILER})
configure_file (
${HDF_RESOURCES_DIR}/libh5cc.in
${HDF5_BINARY_DIR}/CMakeFiles/h5hlcc
diff --git a/release_docs/INSTALL_CMake.txt b/release_docs/INSTALL_CMake.txt
index 14e4fa6d54f..bcec85603db 100644
--- a/release_docs/INSTALL_CMake.txt
+++ b/release_docs/INSTALL_CMake.txt
@@ -861,6 +861,10 @@ HDF5_ENABLE_FORMATTERS "format source files"
HDF5_BUILD_DOC "Build documentation" OFF
HDF5_ENABLE_DOXY_WARNINGS "Enable fail if doxygen parsing has warnings." OFF
+PKG_CONFIG_C_COMPILER "C compiler to use in h5cc" ${CMAKE_C_COMPILER}
+PKG_CONFIG_CXX_COMPILER "C++ compiler to use in h5cc" ${CMAKE_CXX_COMPILER}
+PKG_CONFIG_Fortran_COMPILER "Fortran compiler to use in h5cc" ${CMAKE_Fortran_COMPILER}
+
---------------- HDF5 VFD Options ---------------------
HDF5_ENABLE_DIRECT_VFD "Build the Direct I/O Virtual File Driver" OFF
HDF5_ENABLE_MIRROR_VFD "Build the Mirror Virtual File Driver" OFF
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e81f1d84e95..404d3e35c62 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1253,11 +1253,7 @@ install (
)
if (NOT WIN32)
- if (HDF5_ENABLE_PARALLEL AND MPI_C_FOUND)
- set (_PKG_CONFIG_COMPILER ${MPI_C_COMPILER})
- else ()
- set (_PKG_CONFIG_COMPILER ${CMAKE_C_COMPILER})
- endif ()
+ set (_PKG_CONFIG_COMPILER ${PKG_CONFIG_C_COMPILER})
configure_file (
${HDF_RESOURCES_DIR}/libh5cc.in
${HDF5_BINARY_DIR}/CMakeFiles/h5cc

View File

@ -0,0 +1,124 @@
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
FORTRAN_NEEDED=fortran
inherit cmake fortran-2 flag-o-matic toolchain-funcs
MY_PV=${PV/_p/-}
MY_P=${PN}-${MY_PV}
MAJOR_P=${PN}-$(ver_cut 1-2)
DESCRIPTION="General purpose library and file format for storing scientific data"
HOMEPAGE="https://github.com/HDFGroup/hdf5/"
SRC_URI="https://github.com/HDFGroup/hdf5/releases/download/${PN}_${MY_PV/-/.}/${MY_P}.tar.gz"
S="${WORKDIR}/${MY_P}"
LICENSE="NCSA-HDF"
SLOT="0/310-cmake"
KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~x64-macos"
IUSE="cxx debug fortran +hl mpi szip test threads unsupported zlib"
RESTRICT="!test? ( test )"
REQUIRED_USE="
!unsupported? (
?? ( cxx mpi )
threads? ( !cxx !mpi !fortran !hl )
)
"
DEPEND="
mpi? ( virtual/mpi[romio] )
szip? ( virtual/szip )
zlib? ( sys-libs/zlib:= )
"
RDEPEND="
${DEPEND}
"
BDEPEND="
dev-lang/perl
"
PATCHES=(
# https://github.com/HDFGroup/hdf5/pull/5361
"${FILESDIR}"/hdf5-1.14.6-cmake-h5cc.patch
# https://github.com/HDFGroup/hdf5/pull/5465
"${FILESDIR}"/hdf5-1.14.6-h5cc-sh.patch
# https://github.com/HDFGroup/hdf5/pull/5467
"${FILESDIR}"/hdf5-1.14.6-override-compiler.patch
)
pkg_setup() {
use fortran && fortran-2_pkg_setup
if use mpi; then
if has_version 'sci-libs/hdf5[-mpi]'; then
ewarn "Installing hdf5 with mpi enabled with a previous hdf5 with mpi disabled may fail."
ewarn "Try to uninstall the current hdf5 prior to enabling mpi support."
fi
export CC=mpicc
use fortran && export FC=mpif90
elif has_version 'sci-libs/hdf5[mpi]'; then
ewarn "Installing hdf5 with mpi disabled while having hdf5 installed with mpi enabled may fail."
ewarn "Try to uninstall the current hdf5 prior to disabling mpi support."
fi
}
src_configure() {
# bug #686620
use sparc && tc-is-gcc && append-flags -fno-tree-ccp
local mycmakeargs=(
-DHDF5_INSTALL_CMAKE_DIR=$(get_libdir)/cmake/hdf5
-DHDF5_INSTALL_LIB_DIR=$(get_libdir)
# just COPYING
-DHDF5_INSTALL_DATA_DIR=tmp
# redundant to include?
-DHDF5_INSTALL_MODULE_DIR=tmp
-DHDF5_INSTALL_DOC_DIR=share/doc/${PF}
-DH5_DEFAULT_PLUGINDIR="${EPREFIX}/usr/$(get_libdir)/${PN}/plugin"
-DALLOW_UNSUPPORTED=$(usex unsupported)
-DONLY_SHARED_LIBS=ON
-DHDF5_BUILD_GENERATORS=OFF
-DHDF5_ENABLE_TRACE=$(usex debug)
-DHDF5_ENABLE_HDFS=OFF
-DHDF5_ENABLE_PARALLEL=$(usex mpi)
-DHDF5_ENABLE_SUBFILING_VFD=OFF
-DHDF5_ENABLE_SZIP_SUPPORT=$(usex szip)
-DHDF5_ENABLE_Z_LIB_SUPPORT=$(usex zlib)
-DHDF5_ENABLE_THREADSAFE=$(usex threads)
-DHDF5_ENABLE_MAP_API=OFF
-DHDF5_BUILD_DOC=OFF
-DBUILD_TESTING=$(usex test)
-DHDF5_BUILD_PARALLEL_TOOLS=OFF
-DHDF5_BUILD_TOOLS=ON
-DHDF5_ENABLE_PLUGIN_SUPPORT=OFF
-DHDF5_BUILD_HL_LIB=$(usex hl)
-DHDF5_BUILD_FORTRAN=$(usex fortran)
-DHDF5_BUILD_CPP_LIB=$(usex cxx)
-DHDF5_BUILD_JAVA=OFF
-DHDF5_BUILD_EXAMPLES=OFF
)
# do not force the compiler used for build
if use mpi; then
mycmakeargs+=( -DPKG_CONFIG_C_COMPILER=mpicc )
use cxx && mycmakeargs+=( -DPKG_CONFIG_CXX_COMPILER=mpic++ )
use fortran && mycmakeargs+=( -DPKG_CONFIG_Fortran_COMPILER=mpif90 )
else
mycmakeargs+=( -DPKG_CONFIG_C_COMPILER='${CC:-cc}' )
use cxx && mycmakeargs+=( -DPKG_CONFIG_CXX_COMPILER='${CXX:-c++}' )
use fortran &&
mycmakeargs+=( -DPKG_CONFIG_Fortran_COMPILER='${FC:-gfortran}' )
fi
cmake_src_configure
}
src_install() {
cmake_src_install
rm -r "${ED}/usr/tmp" || die
}