Repository navigation
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
111 lines (91 loc) · 4 KB
/
Copy pathCMakeLists.txt
File metadata and controls
111 lines (91 loc) · 4 KB
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
cmake_minimum_required(VERSION 3.16)
# Default to a Release build when the user hasn't picked one. For multi-config
# generators (Visual Studio, Xcode), set the default config instead. This must
# go before project() so it influences the initial CMAKE_BUILD_TYPE cache.
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
Debug Release RelWithDebInfo MinSizeRel)
endif()
project(clhash
VERSION 1.0.0
DESCRIPTION "Fast 64-bit universal hashing via carry-less multiplication"
HOMEPAGE_URL "https://github.com/simdhash/clhash"
LANGUAGES C CXX)
option(CLHASH_ENABLE_BITMIX "Enable CLHASH_BITMIX compile definition" OFF)
include(cmake/CPM.cmake)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_library(clhash src/clhash.c)
add_library(clhash::clhash ALIAS clhash)
# Version the library artifact. For a shared build this drives SONAME and the
# symlink chain (libclhash.so -> libclhash.so.1 -> libclhash.so.1.0.0). It is
# harmless for the static build that we default to today.
set_target_properties(clhash PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR})
# Generator expressions so the include path is correct in both the build
# tree and after `cmake --install`.
target_include_directories(clhash PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
# Per-architecture intrinsic flags. GCC/Clang require the user to opt in to
# PCLMULQDQ/SSE4.2 on x86 and to the crypto extension on ARM; MSVC and clang-cl
# on x64 enable the equivalent intrinsics by default.
if(NOT MSVC)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64|i[3-6]86")
target_compile_options(clhash PRIVATE -msse4.2 -mpclmul)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|arm64")
target_compile_options(clhash PRIVATE -march=armv8-a+crypto)
endif()
endif()
if(CLHASH_ENABLE_BITMIX)
target_compile_definitions(clhash PUBLIC CLHASH_BITMIX)
endif()
# Install rules. Disable with -DCLHASH_INSTALL=OFF when consuming clhash via
# add_subdirectory() from another project.
option(CLHASH_INSTALL "Generate install rules for clhash" ON)
if(CLHASH_INSTALL)
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
install(TARGETS clhash
EXPORT clhashTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES include/clhash.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT clhashTargets
FILE clhashTargets.cmake
NAMESPACE clhash::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/clhash)
# Minimal package config so `find_package(clhash)` works for downstream
# CMake users. SameMajorVersion is a sensible default for a 1.x library.
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/clhashConfig.cmake"
"include(\"\${CMAKE_CURRENT_LIST_DIR}/clhashTargets.cmake\")\n")
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/clhashConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY SameMajorVersion)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/clhashConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/clhashConfigVersion.cmake"
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/clhash)
endif()
add_executable(unit tests/unit.c)
target_link_libraries(unit PRIVATE clhash)
add_executable(cppunit tests/cppunit.cpp)
target_link_libraries(cppunit PRIVATE clhash)
add_executable(benchmark benchmarks/benchmark.c)
target_link_libraries(benchmark PRIVATE clhash)
add_executable(example examples/example.c)
target_link_libraries(example PRIVATE clhash)
add_executable(cppexample examples/cppexample.cpp)
target_link_libraries(cppexample PRIVATE clhash)
enable_testing()
add_test(NAME clhash_unit COMMAND unit)
add_test(NAME clhash_cppunit COMMAND cppunit)