-
-
Notifications
You must be signed in to change notification settings - Fork 338
Expand file tree
/
Copy pathCMakePlugins.cmake
More file actions
195 lines (166 loc) · 7.97 KB
/
CMakePlugins.cmake
File metadata and controls
195 lines (166 loc) · 7.97 KB
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
186
187
188
189
190
191
192
193
194
195
#
# 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 ()