Files
hdf5/CMakePlugins.cmake
T

196 lines
8.0 KiB
CMake

#
# Copyright by The HDF Group.
# All rights reserved.
#
# This file is part of HDF5. The full HDF5 copyright notice, including
# terms governing use, modification, and redistribution, is contained in
# the LICENSE file, which can be found at the root of the source code
# distribution tree, or in https://www.hdfgroup.org/licenses.
# If you do not have access to either file, you may request a copy from
# help@hdfgroup.org.
#
# -----------------------------------------------------------------------------
# HDF5 CMake Filter Plugin Support Configuration
# -----------------------------------------------------------------------------
# This CMake module configures support for external filter plugins in HDF5.
# It provides options for enabling/disabling plugin support, selecting
# static/shared builds, and controlling how plugin dependencies are found or
# built (external, local, or via GIT/TGZ).
#
# Key Features:
# - Options to enable/disable plugin support and select external or local builds.
# - Support for building plugins externally (via GIT or TGZ) or using system libraries.
# - Handles configuration of plugin include directories, library targets, and CMake variables.
# - Sets up required variables for HDF5 to use filter plugins.
#
# Usage:
# HDF5 includes this file from the main CMakeLists.txt if filter plugin support
# in HDF5 is enabled (HDF5_ENABLE_PLUGIN_SUPPORT). Configure options as needed before
# including this file.
#
# See comments throughout for details on each option and logic branch.
# -----------------------------------------------------------------------------
# -----------------------------------------------------------------------------
# The FetchContent module is needed for building filter plugins from source
# -----------------------------------------------------------------------------
include (FetchContent)
# -----------------------------------------------------------------------------
# Specify major options at the top of the file
# -----------------------------------------------------------------------------
option (PLUGIN_USE_EXTERNAL "Use External Library Building for filter PLUGIN else search" OFF)
cmake_dependent_option (PLUGIN_USE_LOCALCONTENT "Use local file for PLUGIN FetchContent" OFF PLUGIN_USE_EXTERNAL OFF)
# Function to find an HDF5 filter plugins installation on the system with
# find_package()
function (system_hdf5_plugins_library)
set (HDF5_PLUGINS_FOUND FALSE)
if (DEFINED PLUGIN_PACKAGE_NAME)
set (_package_name "${PLUGIN_PACKAGE_NAME}")
else ()
set (_package_name "${HDF5_FILTER_PLUGINS_PACKAGE_NAME}")
endif ()
find_package (HDF5_PLUGINS NAMES ${_package_name}${HDF_PACKAGE_EXT})
set (HDF5_PLUGINS_FOUND "${HDF5_PLUGINS_FOUND}" PARENT_SCOPE)
endfunction ()
# Function to retrieve the HDF5 filter plugins project from external source (if
# necessary) and add it to the build process
#
# NOTE: This function does NOT patch the upstream HDF5 filter plugins project and
# will need maintenance for any changes in the CMake target names, installed
# configuration files, etc. in new releases.
function (external_hdf5_plugins_library)
if (NOT HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT|TGZ")
message (FATAL_ERROR "HDF5_ALLOW_EXTERNAL_SUPPORT must be 'GIT' or 'TGZ' when PLUGIN_USE_EXTERNAL is ON (Current setting: ${HDF5_ALLOW_EXTERNAL_SUPPORT})")
endif ()
# Setup for FetchContent
if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT")
if (PLUGIN_USE_LOCALCONTENT)
message (FATAL_ERROR "HDF5_ALLOW_EXTERNAL_SUPPORT '${HDF5_ALLOW_EXTERNAL_SUPPORT}' and PLUGIN_USE_LOCALCONTENT options are mutually exclusive")
endif ()
if (DEFINED PLUGIN_GIT_URL)
# PLUGIN_GIT_URL is deprecated, but still available
set (_plugins_url "${PLUGIN_GIT_URL}")
else ()
set (_plugins_url "${HDF5_FILTER_PLUGINS_GIT_URL}")
endif ()
if (DEFINED PLUGIN_GIT_BRANCH)
# PLUGIN_GIT_BRANCH is deprecated, but still available
set (_plugins_tag "${PLUGIN_GIT_BRANCH}")
else ()
set (_plugins_tag "${HDF5_FILTER_PLUGINS_GIT_TAG}")
endif ()
message (STATUS "HDF5 filter plugins project will be built from source ${_plugins_url} (tag ${_plugins_tag})")
# Instruct FetchContent to retrieve HDF5 filter plugins project from GIT
FetchContent_Declare (HDF5_FILTER_PLUGINS
GIT_REPOSITORY ${_plugins_url}
GIT_TAG ${_plugins_tag}
)
else () # HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "TGZ"
if (NOT DEFINED H5PL_TGZPATH)
set (H5PL_TGZPATH ${TGZPATH})
endif ()
if (DEFINED PLUGIN_TGZ_NAME)
# PLUGIN_TGZ_NAME is deprecated, but still available
set (_tgz_name "${PLUGIN_TGZ_NAME}")
else ()
set (_tgz_name "${HDF5_FILTER_PLUGINS_TGZ_NAME}")
endif ()
if (PLUGIN_USE_LOCALCONTENT)
# Use specified HDF5 filter plugins .tgz file from system
set (_plugins_url ${H5PL_TGZPATH}/${_tgz_name})
else ()
if (DEFINED PLUGIN_TGZ_ORIGPATH)
# PLUGIN_TGZ_ORIGPATH is deprecated, but still available
set (_tgz_origpath "${PLUGIN_TGZ_ORIGPATH}")
else ()
set (_tgz_origpath "${HDF5_FILTER_PLUGINS_TGZ_ORIGPATH}")
endif ()
# Use HDF5 filter plugins .tgz file HDF5_FILTER_PLUGINS_TGZ_NAME / PLUGIN_TGZ_NAME downloaded
# from base URL HDF5_FILTER_PLUGINS_TGZ_ORIGPATH / PLUGIN_TGZ_ORIGPATH
set (_plugins_url "${_tgz_origpath}/${_tgz_name}")
endif ()
if (PLUGIN_USE_LOCALCONTENT AND NOT EXISTS "${_plugins_url}")
message (FATAL_ERROR "HDF5 filter plugins file ${_plugins_url} not found (try setting TGZPATH to a directory containing ${_tgz_name})")
endif ()
message (STATUS "HDF5 filter plugins project will be built from source ${_plugins_url}")
# Instruct FetchContent to retrieve HDF5 filter plugins project from .tgz file
FetchContent_Declare (HDF5_FILTER_PLUGINS
URL ${_plugins_url}
URL_HASH ""
)
endif ()
# Include HDF5 filter plugins CMake cache configuration
include (${HDF_RESOURCES_DIR}/HDF5PluginCache.cmake)
# Set other options for build. Set CMake policy CMP0077 so that option()
# commands in Blosc(2) don't override values we set here
set (CMAKE_POLICY_DEFAULT_CMP0077 NEW)
if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR NOT PLUGIN_USE_LOCALCONTENT)
message (VERBOSE "Fetching and configuring HDF5 filter plugins project")
else ()
message (VERBOSE "Configuring HDF5 filter plugins project")
endif ()
# If building zlib externally when building HDF5, instruct Blosc(2) to prefer
# using a system zlib for building so that it doesn't build its own zlib that
# will conflict with the one HDF5 will build.
if (HDF5_ENABLE_ZLIB_SUPPORT AND ZLIB_USE_EXTERNAL)
set (PREFER_EXTERNAL_ZLIB ON)
endif ()
# Make HDF5 filter plugins project available for the build
FetchContent_MakeAvailable (HDF5_FILTER_PLUGINS)
# Set HDF5 filter plugins directory and status variables
set (PLUGIN_BINARY_DIR "${hdf5_filter_plugins_BINARY_DIR}" PARENT_SCOPE)
set (HDF5_PLUGINS_FOUND TRUE PARENT_SCOPE)
endfunction ()
#-----------------------------------------------------------------------------
# Option for HDF5 filter plugins support
#-----------------------------------------------------------------------------
if (HDF5_ENABLE_PLUGIN_SUPPORT)
set (HDF5_PLUGINS_FOUND FALSE)
if (NOT PLUGIN_USE_EXTERNAL)
# Find HDF5 filter plugins installation on the system
system_hdf5_plugins_library ()
else ()
# Retrieve HDF5 filter plugins from external source (if necessary) and add
# them to the build process. Note that in this case "external" could also
# mean a local .tgz file on the system
external_hdf5_plugins_library ()
endif ()
if (HDF5_PLUGINS_FOUND)
message (VERBOSE "External HDF5 filter plugins are enabled")
else ()
if (PLUGIN_USE_EXTERNAL)
message (FATAL_ERROR "External support for HDF5 filter plugins was enabled, but couldn't be processed")
else ()
message (FATAL_ERROR "Support for filter plugins in HDF5 was enabled, but an HDF5 filter plugins installation couldn't be found")
endif ()
endif ()
endif ()