• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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