-
Notifications
You must be signed in to change notification settings - Fork 16
/
CMakeLists.txt
207 lines (168 loc) · 7.56 KB
/
CMakeLists.txt
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
196
197
198
199
200
201
202
203
204
205
206
207
if(WIN32)
cmake_minimum_required(VERSION 3.4)
else()
cmake_minimum_required(VERSION 3.1)
endif()
# Fail immediately if not using an out-of-source build
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
message(FATAL_ERROR
"In-source builds are not supported. Please create a build directory "
"separate from the source directory")
endif()
#------------------------------------------------------------------------------#
# Parse version number from fpzip.h
#------------------------------------------------------------------------------#
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/fpzip.h _fpzip_h_contents)
string(REGEX REPLACE ".*#define[ \t]+FPZIP_VERSION_MAJOR[ \t]+([0-9]+).*"
"\\1" FPZIP_VERSION_MAJOR ${_fpzip_h_contents})
string(REGEX REPLACE ".*#define[ \t]+FPZIP_VERSION_MINOR[ \t]+([0-9]+).*"
"\\1" FPZIP_VERSION_MINOR ${_fpzip_h_contents})
string(REGEX REPLACE ".*#define[ \t]+FPZIP_VERSION_PATCH[ \t]+([0-9]+).*"
"\\1" FPZIP_VERSION_PATCH ${_fpzip_h_contents})
set(FPZIP_VERSION
"${FPZIP_VERSION_MAJOR}.${FPZIP_VERSION_MINOR}.${FPZIP_VERSION_PATCH}")
project(FPZIP VERSION ${FPZIP_VERSION})
#------------------------------------------------------------------------------#
# Some boilerplate to setup nice output directories
#------------------------------------------------------------------------------#
include(GNUInstallDirs)
set(CMAKE_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/fpzip
CACHE STRING "Installation CMake subdirectory")
list(INSERT CMAKE_MODULE_PATH 0 "${FPZIP_SOURCE_DIR}/cmake")
if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${FPZIP_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
endif()
if(NOT CMAKE_LIBRARY_OUTPUT_DIRECTORY)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${FPZIP_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
endif()
if(NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${FPZIP_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
endif()
#------------------------------------------------------------------------------#
# Top level options
#------------------------------------------------------------------------------#
# Windows (Visual Studio) specific options
if(MSVC)
# Use this to get a usable export library when building a DLL on Windows
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
# Silence extraneous Visual Studio specific warnings
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS /wd4146 /wd4305)
endif()
# Suggest C99
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
if(MSVC OR MINGW)
set(CMAKE_C_STANDARD 90)
endif()
message(STATUS "Compiling with C standard: ${CMAKE_C_STANDARD}")
# Suggest C++98
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 98)
endif()
message(STATUS "Compiling with C++ standard: ${CMAKE_CXX_STANDARD}")
include(CMakeDependentOption)
# Typically you'd always be able to enable shared libraries but default
# configurations with the Cray toolchain will explicitly disable shared lib
# support and only allow static libs. Making this a cmake_dependent_option
# will ensure that shared library support will be disabled if the system does
# not support it.
# Setup shared library / -fPIC stuff
get_property(SHARED_LIBS_SUPPORTED GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS)
cmake_dependent_option(BUILD_SHARED_LIBS
"Whether or not to build shared libraries" ON
"SHARED_LIBS_SUPPORTED" OFF)
# PIC is always on for shared libs. This allows it to be selectable for
# static libs.
if(DEFINED FPZIP_ENABLE_PIC)
set(FPZIP_ENABLE_PIC_DEFAULT ${FPZIP_ENABLE_PIC})
elseif(DEFINED CMAKE_POSITION_INDEPENDENT_CODE)
set(FPZIP_ENABLE_PIC_DEFAULT ${CMAKE_POSITION_INDEPENDENT_CODE})
else()
set(FPZIP_ENABLE_PIC_DEFAULT ${SHARED_LIBS_SUPPORTED})
endif()
cmake_dependent_option(FPZIP_ENABLE_PIC
"Build with Position Independent Code" ${FPZIP_ENABLE_PIC_DEFAULT}
"SHARED_LIBS_SUPPORTED" OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ${FPZIP_ENABLE_PIC})
# Compile-time options
set(FPZIP_BLOCK_SIZE 4096 CACHE STRING "I/O unit in bytes")
set_property(CACHE FPZIP_BLOCK_SIZE PROPERTY STRINGS "4096")
set(FPZIP_FP FPZIP_FP_FAST CACHE STRING "Floating-point arithmetic")
set_property(CACHE FPZIP_FP PROPERTY STRINGS "FPZIP_FP_FAST;FPZIP_FP_SAFE;FPZIP_FP_EMUL;FPZIP_FP_INT")
option(FPZIP_WITH_REINTERPRET_CAST "Convert to int via reinterpret_cast" OFF)
option(FPZIP_WITH_UNION "Convert to int via union" OFF)
# Handle compile-time macros
list(APPEND fpzip_public_defs FPZIP_FP=${FPZIP_FP})
list(APPEND fpzip_private_defs FPZIP_BLOCK_SIZE=${FPZIP_BLOCK_SIZE})
if((DEFINED FPZIP_INT64) AND (DEFINED FPZIP_INT64_SUFFIX))
list(APPEND fpzip_public_defs FPZIP_INT64=${FPZIP_INT64})
list(APPEND fpzip_public_defs FPZIP_INT64_SUFFIX=${FPZIP_INT64_SUFFIX})
endif()
if((DEFINED FPZIP_UINT64) AND (DEFINED FPZIP_UINT64_SUFFIX))
list(APPEND fpzip_public_defs FPZIP_UINT64=${FPZIP_UINT64})
list(APPEND fpzip_public_defs FPZIP_UINT64_SUFFIX=${FPZIP_UINT64_SUFFIX})
endif()
# Link libm only if necessary
include(CheckCSourceCompiles)
check_c_source_compiles("#include<math.h>\nfloat f; int main(){sqrt(f);return 0;}" HAVE_MATH)
if(NOT HAVE_MATH)
set(CMAKE_REQUIRED_LIBRARIES m)
check_c_source_compiles("#include<math.h>\nfloat f; int main(){sqrt(f);return 0;}" HAVE_LIBM_MATH)
unset(CMAKE_REQUIRED_LIBRARIES)
if(NOT HAVE_LIBM_MATH)
message(FATAL_ERROR "Unable to use C math library functions (with or without -lm)")
endif()
endif()
#------------------------------------------------------------------------------#
# Add source code
#------------------------------------------------------------------------------#
include(CTest)
if(BUILD_TESTING)
enable_testing()
endif()
set(FPZIP_LIBRARY_PREFIX "" CACHE STRING
"Prefix to prepend to the output library name")
mark_as_advanced(FPZIP_LIBRARY_PREFIX)
add_subdirectory(src)
option(BUILD_ALL "Build all subdirectories" OFF)
if(BUILD_ALL)
set(BUILD_UTILITIES ON CACHE BOOL "Build command-line utilities for fpzip" FORCE)
set(BUILD_TESTING ON CACHE BOOL "Build tests" FORCE)
endif()
option(BUILD_UTILITIES "Build command-line utilities for fpzip" ON)
if(BUILD_UTILITIES)
add_subdirectory(utils)
endif()
option(BUILD_TESTING "Build tests" ON)
if(BUILD_TESTING)
add_subdirectory(tests)
endif()
#------------------------------------------------------------------------------#
# Header install
#------------------------------------------------------------------------------#
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
#------------------------------------------------------------------------------#
# Build type: one of None, Debug, Release, RelWithDebInfo, MinSizeRel
#------------------------------------------------------------------------------#
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY VALUE Release)
endif()
#------------------------------------------------------------------------------#
# Packaging
#------------------------------------------------------------------------------#
# Add all targets to the build-tree export set
export(TARGETS fpzip NAMESPACE fpzip::
FILE "${PROJECT_BINARY_DIR}/fpzip-targets.cmake")
configure_file(fpzip-config.cmake.in
"${PROJECT_BINARY_DIR}/fpzip-config.cmake" @ONLY)
configure_file(fpzip-config-version.cmake.in
"${PROJECT_BINARY_DIR}/fpzip-config-version.cmake" @ONLY)
# Install the fpzip-config.cmake and fpzip-config-version.cmake
install(FILES
"${PROJECT_BINARY_DIR}/fpzip-config.cmake"
"${PROJECT_BINARY_DIR}/fpzip-config-version.cmake"
DESTINATION "${CMAKE_INSTALL_CMAKEDIR}")
# Install the export set for use with the install-tree
install(EXPORT fpzip-targets NAMESPACE fpzip::
DESTINATION "${CMAKE_INSTALL_CMAKEDIR}")