Skip to content

Commit 4ee187a

Browse files
committedJul 1, 2020
netcdf: apply patches to build system
The netCDF CMake build system does not use find_package in a way which is compatible to conan, so a couple of patches have been required to get the build running.
1 parent 0ad1a39 commit 4ee187a

File tree

5 files changed

+315
-2
lines changed

5 files changed

+315
-2
lines changed
 

‎recipes/netcdf/all/conandata.yml

+8
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,11 @@ sources:
22
"4.7.4":
33
url: "https://github.com/Unidata/netcdf-c/archive/v4.7.4.tar.gz"
44
sha256: "99930ad7b3c4c1a8e8831fb061cb02b2170fc8e5ccaeda733bd99c3b9d31666b"
5+
patches:
6+
"4.7.4":
7+
- patch_file: "patches/use-CURL_LIBRARIES-in-stead-of-CURL_LIBRARY.patch"
8+
base_path: "source_subfolder"
9+
- patch_file: "patches/disable-makedist.patch"
10+
base_path: "source_subfolder"
11+
- patch_file: "patches/use-find_package-for-hdf5.patch"
12+
base_path: "source_subfolder"

‎recipes/netcdf/all/conanfile.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ class NetcdfConan(ConanFile):
1414
url = "https://github.com/conan-io/conan-center-index"
1515
topics = ("array", "dataset", "scientific")
1616

17-
generators = "cmake"
17+
exports_sources = ["CMakeLists.txt", "patches/**"]
18+
generators = "cmake_find_package"
1819
settings = "os", "compiler", "build_type", "arch"
1920
options = {
2021
"shared": [True, False],
@@ -65,10 +66,12 @@ def _configure_cmake(self):
6566
if not self._cmake:
6667
cmake = CMake(self)
6768
cmake.definitions["CMAKE_INSTALL_PREFIX"] = self.package_folder
68-
cmake.definitions["ENABLE_NETCDF4"] = self.options.with_netcdf4
69+
cmake.definitions["ENABLE_NETCDF_4"] = self.options.with_netcdf4
6970
cmake.definitions["ENABLE_DAP"] = self.options.with_dap
7071
cmake.definitions["BUILD_UTILITIES"] = self.options.with_utilities
7172
cmake.definitions["BUILD_SHARED_LIBS"] = self.options.shared
73+
cmake.definitions["ENABLE_TESTS"] = False
74+
cmake.definitions["NC_FIND_SHARED_LIBS"] = self.options["hdf5"].shared
7275

7376
cmake.configure(
7477
source_folder=self._source_subfolder,
@@ -78,7 +81,12 @@ def _configure_cmake(self):
7881

7982
return self._cmake
8083

84+
def _patch_sources(self):
85+
for patch in self.conan_data["patches"][self.version]:
86+
tools.patch(**patch)
87+
8188
def build(self):
89+
self._patch_sources()
8290
cmake = self._configure_cmake()
8391
cmake.build()
8492

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
--- a/CMakeLists.txt
2+
+++ b/CMakeLists.txt
3+
@@ -117,11 +117,6 @@ MACRO(CHECK_C_LINKER_FLAG M_FLAG M_RESULT)
4+
SET(CMAKE_REQUIRED_FLAGS "${T_REQ_FLAG}")
5+
ENDMACRO()
6+
7+
-# Enable 'dist and distcheck'.
8+
-# File adapted from http://ensc.de/cmake/FindMakeDist.cmake
9+
-FIND_PACKAGE(MakeDist)
10+
-# End 'enable dist and distcheck'
11+
-
12+
# Set the build type.
13+
IF(NOT CMAKE_BUILD_TYPE)
14+
SET(CMAKE_BUILD_TYPE DEBUG CACHE STRING "Choose the type of build, options are: None, Debug, Release."
15+
@@ -1932,10 +1927,6 @@ INSTALL(PROGRAMS ${netCDF_BINARY_DIR}/nc-config
16+
##
17+
print_conf_summary()
18+
19+
-# Enable Makedist files.
20+
-ADD_MAKEDIST()
21+
-ENABLE_MAKEDIST(README.md COPYRIGHT RELEASE_NOTES.md INSTALL INSTALL.cmake test_prog.c lib_flags.am cmake CMakeLists.txt COMPILE.cmake.txt config.h.cmake.in cmake_uninstall.cmake.in netcdf-config-version.cmake.in netcdf-config.cmake.in FixBundle.cmake.in nc-config.cmake.in configure configure.ac install-sh config.h.in config.sub CTestConfig.cmake.in)
22+
-
23+
#####
24+
# Configure and print the libnetcdf.settings file.
25+
#####
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--- a/CMakeLists.txt
2+
+++ b/CMakeLists.txt
3+
@@ -854,7 +854,7 @@ ENDIF()
4+
# Option to support byte-range reading of remote datasets
5+
OPTION(ENABLE_BYTERANGE "Enable byte-range access to remote datasets.." OFF)
6+
7+
-IF(NOT CURL_LIBRARY)
8+
+IF(NOT CURL_LIBRARIES)
9+
IF(ENABLE_BYTERANGE)
10+
MESSAGE(FATAL_ERROR "Byte-range support specified, CURL libraries are not found.")
11+
ENDIF()
12+
--- a/liblib/CMakeLists.txt
13+
+++ b/liblib/CMakeLists.txt
14+
@@ -88,7 +88,7 @@ IF(USE_HDF5 OR USE_NETCDF4)
15+
ENDIF()
16+
17+
IF(USE_DAP)
18+
- SET(TLL_LIBS ${TLL_LIBS} ${CURL_LIBRARY})
19+
+ SET(TLL_LIBS ${TLL_LIBS} ${CURL_LIBRARIES})
20+
ENDIF()
21+
22+
IF(USE_HDF4)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,250 @@
1+
--- a/CMakeLists.txt
2+
+++ b/CMakeLists.txt
3+
@@ -571,175 +571,12 @@ OPTION(USE_HDF5 "Use HDF5." ${ENABLE_NETCDF_4})
4+
IF(USE_HDF5 OR ENABLE_NETCDF_4)
5+
SET(USE_HDF5 ON)
6+
SET(USE_NETCDF4 ON)
7+
- ##
8+
- # Accommodate developers who have hdf5 libraries and
9+
- # headers on their system, but do not have a the hdf
10+
- # .cmake files. If this is the case, they should
11+
- # specify HDF5_HL_LIBRARY, HDF5_LIBRARY, HDF5_INCLUDE_DIR manually.
12+
- ##
13+
- IF(HDF5_C_LIBRARY AND HDF5_HL_LIBRARY AND HDF5_INCLUDE_DIR)
14+
- SET(HDF5_LIBRARIES ${HDF5_C_LIBRARY} ${HDF5_HL_LIBRARY})
15+
- SET(HDF5_C_LIBRARIES ${HDF5_C_LIBRARY})
16+
- SET(HDF5_C_LIBRARY_hdf5 ${HDF5_C_LIBRARY})
17+
- SET(HDF5_HL_LIBRARIES ${HDF5_HL_LIBRARY})
18+
- INCLUDE_DIRECTORIES(${HDF5_INCLUDE_DIR})
19+
- MESSAGE(STATUS "Using HDF5 C Library: ${HDF5_C_LIBRARY}")
20+
- MESSAGE(STATUS "Using HDF5 HL LIbrary: ${HDF5_HL_LIBRARY}")
21+
- ELSE(HDF5_C_LIBRARY AND HDF5_HL_LIBRARY AND HDF5_INCLUDE_DIR) # We are seeking out HDF5 with Find Package.
22+
- ###
23+
- # For now we assume that if we are building netcdf
24+
- # as a shared library, we will use hdf5 as a shared
25+
- # library. If we are building netcdf statically,
26+
- # we will use a static library. This can be toggled
27+
- # by explicitly modifying NC_FIND_SHARED_LIBS.
28+
- ##
29+
- IF(NC_FIND_SHARED_LIBS)
30+
- SET(NC_HDF5_LINK_TYPE "shared")
31+
- SET(NC_HDF5_LINK_TYPE_UPPER "SHARED")
32+
- ADD_DEFINITIONS(-DH5_BUILT_AS_DYNAMIC_LIB)
33+
- ELSE(NC_FIND_SHARED_LIBS)
34+
- SET(NC_HDF5_LINK_TYPE "static")
35+
- SET(NC_HDF5_LINK_TYPE_UPPER "STATIC")
36+
- ADD_DEFINITIONS(-DH5_BUILT_AS_STATIC_LIB)
37+
- ENDIF(NC_FIND_SHARED_LIBS)
38+
-
39+
- #####
40+
- # First, find the C and HL libraries.
41+
- #
42+
- # This has been updated to reflect what is in the hdf5
43+
- # examples, even though the previous version of what we
44+
- # had worked.
45+
- #####
46+
- IF(MSVC)
47+
- SET(SEARCH_PACKAGE_NAME ${HDF5_PACKAGE_NAME})
48+
- FIND_PACKAGE(HDF5 NAMES ${SEARCH_PACKAGE_NAME} COMPONENTS C HL CONFIG REQUIRED ${NC_HDF5_LINK_TYPE})
49+
- ELSE(MSVC)
50+
- FIND_PACKAGE(HDF5 COMPONENTS C HL REQUIRED)
51+
- ENDIF(MSVC)
52+
-
53+
- ##
54+
- # Next, check the HDF5 version. This will inform which
55+
- # HDF5 variables we need to munge.
56+
- ##
57+
-
58+
- ##
59+
- # Assert HDF5 version meets minimum required version.
60+
- ##
61+
- SET(HDF5_VERSION_REQUIRED 1.8.10)
62+
- SET(HDF5_PAR_FILTER_VERSION 1.10.3)
63+
-
64+
- IF(HDF5_VERSION_STRING AND NOT HDF5_VERSION)
65+
- SET(HDF5_VERSION ${HDF5_VERSION_STRING})
66+
- ENDIF()
67+
68+
- IF("${HDF5_VERSION}" STREQUAL "")
69+
- MESSAGE(STATUS "Unable to determine hdf5 version. NetCDF requires at least version ${HDF5_VERSION_REQUIRED}")
70+
- ELSE()
71+
- IF(${HDF5_VERSION} VERSION_LESS ${HDF5_VERSION_REQUIRED})
72+
- MESSAGE(FATAL_ERROR
73+
- "netCDF requires at least HDF5 ${HDF5_VERSION_REQUIRED}. Found ${HDF5_VERSION}.")
74+
- ELSE()
75+
- MESSAGE(STATUS "Found HDF5 libraries version ${HDF5_VERSION}")
76+
- ENDIF()
77+
- ENDIF()
78+
+ FIND_PACKAGE(HDF5 REQUIRED)
79+
+ INCLUDE_DIRECTORIES(${HDF5_INCLUDE_DIRS})
80+
+ MESSAGE(STATUS "Using HDF5 Libraries: ${HDF5_LIBRARIES}")
81+
82+
- # Determine whether parallel filter operation is supported.
83+
- IF(${HDF5_VERSION} VERSION_LESS ${HDF5_PAR_FILTER_VERSION})
84+
- SET(HDF5_HAS_PAR_FILTERS, "no")
85+
- ELSE()
86+
- SET(HDF5_HAS_PAR_FILTERS, "yes")
87+
- ENDIF()
88+
-
89+
- ##
90+
- # Include the HDF5 include directory.
91+
- ##
92+
- IF(HDF5_INCLUDE_DIRS AND NOT HDF5_INCLUDE_DIR)
93+
- SET(HDF5_INCLUDE_DIR ${HDF5_INCLUDE_DIRS})
94+
- ENDIF()
95+
- MESSAGE(STATUS "Using HDF5 include dir: ${HDF5_INCLUDE_DIR}")
96+
- INCLUDE_DIRECTORIES(${HDF5_INCLUDE_DIR})
97+
-
98+
- ###
99+
- # This is the block where we figure out what the appropriate
100+
- # variables are, and we ensure that we end up with
101+
- # HDF5_C_LIBRARY, HDF5_HL_LIBRARY and HDF5_LIBRARIES.
102+
- ###
103+
- IF(MSVC)
104+
- ##
105+
- # HDF5 1.8.15 defined HDF5_LIBRARIES.
106+
- ##
107+
- IF(${HDF5_VERSION} VERSION_LESS "1.8.16")
108+
- SET(HDF5_C_LIBRARY hdf5)
109+
- SET(HDF5_C_LIBRARY_hdf5 hdf5)
110+
- ENDIF(${HDF5_VERSION} VERSION_LESS "1.8.16")
111+
-
112+
- IF(${HDF5_VERSION} VERSION_GREATER "1.8.15")
113+
- IF(NOT HDF5_LIBRARIES AND HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY AND HDF5_HL_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY)
114+
- SET(HDF5_C_LIBRARY ${HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
115+
- SET(HDF5_C_LIBRARY_hdf5 ${HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
116+
- SET(HDF5_HL_LIBRARY ${HDF5_HL_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
117+
-
118+
- SET(HDF5_LIBRARIES ${HDF5_C_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY} ${HDF5_HL_${NC_HDF5_LINK_TYPE_UPPER}_LIBRARY})
119+
- ENDIF()
120+
- ENDIF(${HDF5_VERSION} VERSION_GREATER "1.8.15")
121+
-
122+
- ELSE(MSVC)
123+
-
124+
- # Depending on the install, either HDF5_hdf_library or
125+
- # HDF5_C_LIBRARIES may be defined. We must check for either.
126+
- IF(HDF5_C_LIBRARIES AND NOT HDF5_hdf5_LIBRARY)
127+
- SET(HDF5_hdf5_LIBRARY ${HDF5_C_LIBRARIES})
128+
- ENDIF()
129+
-
130+
- ENDIF(MSVC)
131+
- IF(NOT HDF5_C_LIBRARY)
132+
- SET(HDF5_C_LIBRARY hdf5)
133+
- ENDIF()
134+
- ENDIF(HDF5_C_LIBRARY AND HDF5_HL_LIBRARY AND HDF5_INCLUDE_DIR)
135+
-
136+
- FIND_PACKAGE(Threads)
137+
-
138+
- # There is a missing case in the above code so default it
139+
- IF(NOT HDF5_C_LIBRARY_HDF5 OR "${HDF5_C_LIBRARY_hdf5}" STREQUAL "" )
140+
- SET(HDF5_C_LIBRARY_hdf5 "${HDF5_C_LIBRARY}")
141+
- ENDIF()
142+
-
143+
- # Find out if HDF5 was built with parallel support.
144+
- # Do that by checking for the targets H5Pget_fapl_mpiposx and
145+
- # H5Pget_fapl_mpio in ${HDF5_LIB}.
146+
-
147+
- # H5Pset_fapl_mpiposix and H5Pget_fapl_mpiposix have been removed since HDF5 1.8.12.
148+
- # Use H5Pset_fapl_mpio and H5Pget_fapl_mpio, instead.
149+
- # CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pget_fapl_mpiposix "" HDF5_IS_PARALLEL_MPIPOSIX)
150+
-
151+
- CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pget_fapl_mpio "" HDF5_IS_PARALLEL_MPIO)
152+
- IF(HDF5_IS_PARALLEL_MPIO)
153+
- SET(HDF5_PARALLEL ON)
154+
- ELSE()
155+
- SET(HDF5_PARALLEL OFF)
156+
- ENDIF()
157+
-
158+
- #Check to see if HDF5 library has collective metadata APIs, (HDF5 >= 1.10.0)
159+
- CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pset_all_coll_metadata_ops "" HDF5_HAS_COLL_METADATA_OPS)
160+
-
161+
- #Check to see if H5Z_SZIP exists in HDF5_Libraries. If so, we must use szip.
162+
- CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Z_SZIP "" USE_SZIP)
163+
- IF(USE_SZIP)
164+
- FIND_LIBRARY(SZIP NAMES szip sz)
165+
- IF(SZIP)
166+
- SET(HAVE_H5Z_SZIP 1)
167+
- SET(SZIP_LIBRARY ${SZIP})
168+
- SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${SZIP})
169+
- MESSAGE(STATUS "HDF5 has szip.")
170+
- ELSE()
171+
- MESSAGE(FATAL_ERROR "HDF5 Requires SZIP, but cannot find libszip or libsz.")
172+
- ENDIF()
173+
- ENDIF()
174+
-
175+
- CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Pset_libver_bounds "" HAVE_H5PSET_LIBVER_BOUNDS)
176+
- CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5free_memory "" HAVE_H5FREE_MEMORY)
177+
- CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5allocate_memory "" HAVE_H5ALLOCATE_MEMORY)
178+
- CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5resize_memory "" HAVE_H5RESIZE_MEMORY)
179+
+ SET(HDF5_PARALLEL OFF)
180+
181+
IF(HDF5_PARALLEL)
182+
SET(HDF5_CC h5pcc)
183+
@@ -747,39 +584,13 @@ IF(USE_HDF5 OR ENABLE_NETCDF_4)
184+
SET(HDF5_CC h5cc)
185+
ENDIF()
186+
187+
- # Check to see if this is hdf5-1.10.3 or later.
188+
- CHECK_LIBRARY_EXISTS(${HDF5_C_LIBRARY_hdf5} H5Dread_chunk "" HDF5_SUPPORTS_PAR_FILTERS)
189+
-
190+
- SET(H5_USE_16_API 1)
191+
- OPTION(NC_ENABLE_HDF_16_API "Enable HDF5 1.6.x Compatibility(Required)" ON)
192+
- IF(NOT NC_ENABLE_HDF_16_API)
193+
- SET(H5_USE_16_API 0)
194+
- ENDIF()
195+
+ SET(H5_USE_16_API 1)
196+
197+
FIND_PATH(HAVE_HDF5_H hdf5.h PATHS ${HDF5_INCLUDE_DIR} NO_DEFAULT_PATH)
198+
- FIND_PATH(HAVE_HDF5_H hdf5.h)
199+
IF(NOT HAVE_HDF5_H)
200+
MESSAGE(FATAL_ERROR "Compiling a test with hdf5 failed. Either hdf5.h cannot be found, or the log messages should be checked for another reason.")
201+
- ELSE(NOT HAVE_HDF5_H)
202+
- INCLUDE_DIRECTORIES(${HAVE_HDF5_H})
203+
ENDIF(NOT HAVE_HDF5_H)
204+
205+
- # Check to ensure that HDF5 was built with zlib.
206+
- set (CMAKE_REQUIRED_INCLUDES ${HAVE_HDF5_H})
207+
- CHECK_C_SOURCE_COMPILES("#include <H5pubconf.h>
208+
- #if !H5_HAVE_ZLIB_H
209+
- #error
210+
- #endif
211+
- int main() {
212+
- int x = 1;}" HAVE_HDF5_ZLIB)
213+
- IF(NOT HAVE_HDF5_ZLIB)
214+
- MESSAGE(FATAL_ERROR "HDF5 was built without zlib. Rebuild HDF5 with zlib.")
215+
- ENDIF()
216+
-
217+
- #option to include HDF5 High Level header file (hdf5_hl.h) in case we are not doing a make install
218+
- INCLUDE_DIRECTORIES(${HDF5_HL_INCLUDE_DIR})
219+
-
220+
-
221+
ENDIF(USE_HDF5 OR ENABLE_NETCDF_4)
222+
223+
# See if we have libcurl
224+
--- a/liblib/CMakeLists.txt
225+
+++ b/liblib/CMakeLists.txt
226+
@@ -68,23 +68,7 @@ IF(HAVE_LIBDL)
227+
ENDIF()
228+
229+
IF(USE_HDF5 OR USE_NETCDF4)
230+
- IF(NOT MSVC)
231+
- # Some version of cmake define HDF5_hdf5_LIBRARY instead of
232+
- # HDF5_LIBRARY. Same with HDF5_HL_LIBRARIES
233+
- IF(HDF5_hdf5_LIBRARY AND NOT HDF5_C_LIBRARIES)
234+
- SET(HDF5_C_LIBRARIES ${HDF5_hdf5_LIBRARY})
235+
- ENDIF()
236+
- IF(HDF5_hdf5_hl_LIBRARY AND NOT HDF5_HL_LIBRARIES)
237+
- SET(HDF5_HL_LIBRARIES ${HDF5_hdf5_hl_LIBRARY})
238+
- ENDIF()
239+
- # The order of the libraries is important here for static
240+
- # builds:
241+
- # Make sure that HDF5_C_LIBRARY appears *after*
242+
- # HDF5_HL_LIBRARY.
243+
- SET(TLL_LIBS ${HDF5_HL_LIBRARIES} ${HDF5_C_LIBRARIES} ${TLL_LIBS} ${SZIP_LIBRARY})
244+
- ELSE() # Windows CMake defines HDF5_LIBRARIES.
245+
- SET(TLL_LIBS ${HDF5_LIBRARIES} ${TLL_LIBS} ${SZIP_LIBRARY})
246+
- ENDIF()
247+
+ SET(TLL_LIBS ${HDF5_LIBRARIES} ${TLL_LIBS} ${SZIP_LIBRARY})
248+
ENDIF()
249+
250+
IF(USE_DAP)

0 commit comments

Comments
 (0)