minisketch.cmake raw
1 # Copyright (c) 2023-present The Bitcoin Core developers
2 # Distributed under the MIT software license, see the accompanying
3 # file COPYING or https://opensource.org/license/mit/.
4
5 include(CheckSourceCompilesWithFlags)
6
7 # Check for clmul instructions support.
8 if(MSVC)
9 set(CLMUL_CXXFLAGS "")
10 else()
11 set(CLMUL_CXXFLAGS -mpclmul)
12 endif()
13 check_cxx_source_compiles_with_flags("
14 #include <immintrin.h>
15 #include <cstdint>
16
17 int main()
18 {
19 __m128i a = _mm_cvtsi64_si128((uint64_t)7);
20 __m128i b = _mm_clmulepi64_si128(a, a, 37);
21 __m128i c = _mm_srli_epi64(b, 41);
22 __m128i d = _mm_xor_si128(b, c);
23 uint64_t e = _mm_cvtsi128_si64(d);
24 return e == 0;
25 }
26 " HAVE_CLMUL
27 CXXFLAGS ${CLMUL_CXXFLAGS}
28 )
29
30 add_library(minisketch_common INTERFACE)
31 if(MSVC)
32 target_compile_options(minisketch_common INTERFACE
33 /wd4060
34 /wd4065
35 /wd4146
36 /wd4244
37 /wd4267
38 )
39 endif()
40
41 add_library(minisketch STATIC EXCLUDE_FROM_ALL
42 ${PROJECT_SOURCE_DIR}/src/minisketch/src/minisketch.cpp
43 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_1byte.cpp
44 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_2bytes.cpp
45 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_3bytes.cpp
46 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_4bytes.cpp
47 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_5bytes.cpp
48 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_6bytes.cpp
49 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_7bytes.cpp
50 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_8bytes.cpp
51 )
52
53 target_compile_definitions(minisketch
54 PRIVATE
55 DISABLE_DEFAULT_FIELDS
56 ENABLE_FIELD_32
57 )
58
59 target_include_directories(minisketch
60 PUBLIC
61 $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/minisketch/include>
62 )
63
64 target_link_libraries(minisketch
65 PRIVATE
66 core_interface
67 minisketch_common
68 )
69
70 set_target_properties(minisketch PROPERTIES
71 EXPORT_COMPILE_COMMANDS OFF
72 )
73
74 if(HAVE_CLMUL)
75 set(_minisketch_clmul_src
76 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_1byte.cpp
77 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_2bytes.cpp
78 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_3bytes.cpp
79 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_4bytes.cpp
80 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_5bytes.cpp
81 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_6bytes.cpp
82 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_7bytes.cpp
83 ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_8bytes.cpp
84 )
85 target_sources(minisketch PRIVATE ${_minisketch_clmul_src})
86 set_property(SOURCE ${_minisketch_clmul_src} PROPERTY COMPILE_OPTIONS ${CLMUL_CXXFLAGS})
87 target_compile_definitions(minisketch PRIVATE HAVE_CLMUL)
88 unset(_minisketch_clmul_src)
89 endif()
90