1# To the extent possible under law, the author(s) have dedicated all 2# copyright and related and neighboring rights to this software to 3# the public domain worldwide. This software is distributed without 4# any warranty. 5# 6# For details, see <https://creativecommons.org/publicdomain/zero/1.0/>. 7 8cmake_minimum_required (VERSION 2.8.12 FATAL_ERROR) 9 10set(XXHASH_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..") 11 12file(STRINGS "${XXHASH_DIR}/xxhash.h" XXHASH_VERSION_MAJOR REGEX "^#define XXH_VERSION_MAJOR +([0-9]+) *$") 13string(REGEX REPLACE "^#define XXH_VERSION_MAJOR +([0-9]+) *$" "\\1" XXHASH_VERSION_MAJOR "${XXHASH_VERSION_MAJOR}") 14file(STRINGS "${XXHASH_DIR}/xxhash.h" XXHASH_VERSION_MINOR REGEX "^#define XXH_VERSION_MINOR +([0-9]+) *$") 15string(REGEX REPLACE "^#define XXH_VERSION_MINOR +([0-9]+) *$" "\\1" XXHASH_VERSION_MINOR "${XXHASH_VERSION_MINOR}") 16file(STRINGS "${XXHASH_DIR}/xxhash.h" XXHASH_VERSION_RELEASE REGEX "^#define XXH_VERSION_RELEASE +([0-9]+) *$") 17string(REGEX REPLACE "^#define XXH_VERSION_RELEASE +([0-9]+) *$" "\\1" XXHASH_VERSION_RELEASE "${XXHASH_VERSION_RELEASE}") 18set(XXHASH_VERSION_STRING "${XXHASH_VERSION_MAJOR}.${XXHASH_VERSION_MINOR}.${XXHASH_VERSION_RELEASE}") 19set(XXHASH_LIB_VERSION ${XXHASH_VERSION_STRING}) 20set(XXHASH_LIB_SOVERSION "${XXHASH_VERSION_MAJOR}") 21mark_as_advanced(XXHASH_VERSION_MAJOR XXHASH_VERSION_MINOR XXHASH_VERSION_RELEASE XXHASH_VERSION_STRING XXHASH_LIB_VERSION XXHASH_LIB_SOVERSION) 22 23if("${CMAKE_VERSION}" VERSION_LESS "3.13") 24 #message(WARNING "CMake ${CMAKE_VERSION} has no CMP0077 policy: options will erase uncached/untyped normal vars!") 25else() 26 cmake_policy (SET CMP0077 NEW) 27endif() 28if("${CMAKE_VERSION}" VERSION_LESS "3.0") 29 project(xxHash C) 30else() 31 cmake_policy (SET CMP0048 NEW) 32 project(xxHash 33 VERSION ${XXHASH_VERSION_STRING} 34 LANGUAGES C) 35endif() 36 37if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) 38 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Project build type" FORCE) 39 set_property(CACHE CMAKE_BUILD_TYPE 40 PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo" "MinSizeRel") 41endif() 42if(NOT CMAKE_CONFIGURATION_TYPES) 43 message(STATUS "xxHash build type: ${CMAKE_BUILD_TYPE}") 44endif() 45 46option(BUILD_SHARED_LIBS "Build shared library" ON) 47option(XXHASH_BUILD_XXHSUM "Build the xxhsum binary" ON) 48 49# If XXHASH is being bundled in another project, we don't want to 50# install anything. However, we want to let people override this, so 51# we'll use the XXHASH_BUNDLED_MODE variable to let them do that; just 52# set it to OFF in your project before you add_subdirectory(xxhash/cmake_unofficial). 53if(NOT DEFINED XXHASH_BUNDLED_MODE) 54 if("${PROJECT_SOURCE_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}") 55 set(XXHASH_BUNDLED_MODE OFF) 56 else() 57 set(XXHASH_BUNDLED_MODE ON) 58 endif() 59endif() 60set(XXHASH_BUNDLED_MODE ${XXHASH_BUNDLED_MODE} CACHE BOOL "" FORCE) 61mark_as_advanced(XXHASH_BUNDLED_MODE) 62 63# Allow people to choose whether to build shared or static libraries 64# via the BUILD_SHARED_LIBS option unless we are in bundled mode, in 65# which case we always use static libraries. 66include(CMakeDependentOption) 67CMAKE_DEPENDENT_OPTION(BUILD_SHARED_LIBS "Build shared libraries" ON "NOT XXHASH_BUNDLED_MODE" OFF) 68 69# libxxhash 70add_library(xxhash "${XXHASH_DIR}/xxhash.c") 71add_library(${PROJECT_NAME}::xxhash ALIAS xxhash) 72 73target_include_directories(xxhash 74 PUBLIC 75 $<BUILD_INTERFACE:${XXHASH_DIR}> 76 $<INSTALL_INTERFACE:include/>) 77if (BUILD_SHARED_LIBS) 78 target_compile_definitions(xxhash PUBLIC XXH_EXPORT) 79endif () 80set_target_properties(xxhash PROPERTIES 81 SOVERSION "${XXHASH_VERSION_STRING}" 82 VERSION "${XXHASH_VERSION_STRING}") 83 84if(XXHASH_BUILD_XXHSUM) 85 set(XXHSUM_DIR "${XXHASH_DIR}/cli") 86 # xxhsum 87 add_executable(xxhsum "${XXHASH_DIR}/xxhsum.c" 88 "${XXHSUM_DIR}/xsum_os_specific.c" 89 "${XXHSUM_DIR}/xsum_output.c" 90 "${XXHSUM_DIR}/xsum_sanity_check.c" 91 ) 92 add_executable(${PROJECT_NAME}::xxhsum ALIAS xxhsum) 93 94 target_link_libraries(xxhsum PRIVATE xxhash) 95 target_include_directories(xxhsum PRIVATE "${XXHASH_DIR}") 96endif(XXHASH_BUILD_XXHSUM) 97 98# Extra warning flags 99include (CheckCCompilerFlag) 100if (XXHASH_C_FLAGS) 101 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${XXHASH_C_FLAGS}") 102endif() 103foreach (flag 104 -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow 105 -Wstrict-aliasing=1 -Wswitch-enum -Wdeclaration-after-statement 106 -Wstrict-prototypes -Wundef) 107 # Because https://gcc.gnu.org/wiki/FAQ#wnowarning 108 string(REGEX REPLACE "\\-Wno\\-(.+)" "-W\\1" flag_to_test "${flag}") 109 string(REGEX REPLACE "[^a-zA-Z0-9]+" "_" test_name "CFLAG_${flag_to_test}") 110 111 check_c_compiler_flag("${ADD_COMPILER_FLAGS_PREPEND} ${flag_to_test}" ${test_name}) 112 113 if(${test_name}) 114 set(CMAKE_C_FLAGS "${flag} ${CMAKE_C_FLAGS}") 115 endif() 116 117 unset(test_name) 118 unset(flag_to_test) 119endforeach (flag) 120 121if(NOT XXHASH_BUNDLED_MODE) 122 include(GNUInstallDirs) 123 124 install(TARGETS xxhash 125 EXPORT xxHashTargets 126 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" 127 LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" 128 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") 129 install(FILES "${XXHASH_DIR}/xxhash.h" 130 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") 131 install(FILES "${XXHASH_DIR}/xxh3.h" 132 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") 133 if(XXHASH_BUILD_XXHSUM) 134 install(TARGETS xxhsum 135 EXPORT xxHashTargets 136 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") 137 install(FILES "${XXHASH_DIR}/xxhsum.1" 138 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1") 139 endif(XXHASH_BUILD_XXHSUM) 140 141 include(CMakePackageConfigHelpers) 142 143 set(xxHash_VERSION_CONFIG "${PROJECT_BINARY_DIR}/xxHashConfigVersion.cmake") 144 set(xxHash_PROJECT_CONFIG "${PROJECT_BINARY_DIR}/xxHashConfig.cmake") 145 set(xxHash_TARGETS_CONFIG "${PROJECT_BINARY_DIR}/xxHashTargets.cmake") 146 set(xxHash_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/xxHash/") 147 write_basic_package_version_file(${xxHash_VERSION_CONFIG} 148 VERSION ${XXHASH_VERSION_STRING} 149 COMPATIBILITY AnyNewerVersion) 150 configure_package_config_file( 151 ${PROJECT_SOURCE_DIR}/xxHashConfig.cmake.in 152 ${xxHash_PROJECT_CONFIG} 153 INSTALL_DESTINATION ${xxHash_CONFIG_INSTALL_DIR}) 154 if("${CMAKE_VERSION}" VERSION_LESS "3.0") 155 set(XXHASH_EXPORT_SET xxhash) 156 if(XXHASH_BUILD_XXHSUM) 157 set(XXHASH_EXPORT_SET ${XXHASH_EXPORT_SET} xxhsum) 158 endif() 159 export(TARGETS ${XXHASH_EXPORT_SET} 160 FILE ${xxHash_TARGETS_CONFIG} 161 NAMESPACE ${PROJECT_NAME}::) 162 else() 163 export(EXPORT xxHashTargets 164 FILE ${xxHash_TARGETS_CONFIG} 165 NAMESPACE ${PROJECT_NAME}::) 166 endif() 167 168 install(FILES ${xxHash_PROJECT_CONFIG} ${xxHash_VERSION_CONFIG} 169 DESTINATION ${xxHash_CONFIG_INSTALL_DIR}) 170 install(EXPORT xxHashTargets 171 DESTINATION ${xxHash_CONFIG_INSTALL_DIR} 172 NAMESPACE ${PROJECT_NAME}::) 173endif(NOT XXHASH_BUNDLED_MODE) 174