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}")
|