Skip to content

Commit be68da4

Browse files
committed
build: Add CMake-based build system
1 parent 3472e2f commit be68da4

File tree

4 files changed

+242
-0
lines changed

4 files changed

+242
-0
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,6 @@ stamp-h1
3333

3434
test*
3535
bench
36+
37+
# CMake build directories.
38+
/build*

CMakeLists.txt

+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
cmake_minimum_required(VERSION 3.22)
2+
3+
project(minisketch
4+
VERSION 0.0.1
5+
DESCRIPTION "A library for BCH-based set reconciliation"
6+
HOMEPAGE_URL "http://github.com/sipa/minisketch/"
7+
LANGUAGES CXX
8+
)
9+
10+
if(DEFINED CMAKE_CXX_STANDARD)
11+
if(CMAKE_CXX_STANDARD EQUAL 98 OR CMAKE_CXX_STANDARD LESS 11)
12+
message(FATAL_ERROR "This project requires at least C++11")
13+
endif()
14+
else()
15+
set(CMAKE_CXX_STANDARD 11)
16+
endif()
17+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
18+
if(NOT DEFINED CMAKE_CXX_EXTENSIONS)
19+
set(CMAKE_CXX_EXTENSIONS OFF)
20+
endif()
21+
22+
option(MINISKETCH_TESTS "Build tests." ON)
23+
option(MINISKETCH_BENCHMARK "Build benchmark." OFF)
24+
25+
set(supported_fields "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")
26+
set(MINISKETCH_FIELDS ${supported_fields} CACHE STRING "Comma-separated list of field sizes to build. Default=all. Available sizes: ${supported_fields}.")
27+
string(REPLACE "," ";" supported_field_list "${supported_fields}")
28+
string(REPLACE "," ";" provided_field_list "${MINISKETCH_FIELDS}")
29+
foreach(field IN LISTS supported_field_list)
30+
if(NOT field IN_LIST provided_field_list)
31+
set(have_disabled_fields TRUE)
32+
add_compile_definitions(DISABLE_FIELD_${field})
33+
endif()
34+
endforeach()
35+
36+
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
37+
set(CMAKE_VISIBILITY_INLINES_HIDDEN TRUE)
38+
39+
if(MSVC)
40+
add_compile_options(/Zc:__cplusplus /W4 /wd4060 /wd4065 /wd4100 /wd4127 /wd4146 /wd4244 /wd4267 /wd4310)
41+
else()
42+
add_compile_options(-Wall)
43+
endif()
44+
45+
if(MINGW)
46+
add_link_options(-static)
47+
endif()
48+
49+
add_subdirectory(src)
50+
51+
message("\n")
52+
message("minisketch configure summary")
53+
message("============================")
54+
if(BUILD_SHARED_LIBS)
55+
set(library_type "Shared")
56+
else()
57+
set(library_type "Static")
58+
endif()
59+
message("Library type .......................... ${library_type}")
60+
message("Build options:")
61+
if(HAVE_CLMUL)
62+
set(clmul_status "ENABLED")
63+
else()
64+
set(clmul_status "DISABLED")
65+
endif()
66+
message(" clmul fields ........................ ${clmul_status}")
67+
if(CMAKE_CXX_STANDARD GREATER_EQUAL 20)
68+
set(clz_status "c++20")
69+
elseif(HAVE_CLZ)
70+
set(clz_status "compiler builtin")
71+
else()
72+
set(clz_status "default")
73+
endif()
74+
message(" clz implementation .................. ${clz_status}")
75+
message("Optional binaries:")
76+
message(" benchmark ........................... ${MINISKETCH_BENCHMARK}")
77+
message(" tests ............................... ${MINISKETCH_TESTS}")
78+
message("")
79+
if(CMAKE_CROSSCOMPILING)
80+
set(cross_status "TRUE, for ${CMAKE_SYSTEM_NAME}, ${CMAKE_SYSTEM_PROCESSOR}")
81+
else()
82+
set(cross_status "FALSE")
83+
endif()
84+
message("Cross compiling ....................... ${cross_status}")
85+
message("C++ compiler .......................... ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}, ${CMAKE_CXX_COMPILER}")
86+
87+
get_directory_property(compile_options COMPILE_OPTIONS)
88+
string(REPLACE ";" " " compile_options "${compile_options}")
89+
macro(print_flags_per_config config indent dots)
90+
string(TOUPPER "${config}" config_uppercase)
91+
string(STRIP "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${config_uppercase}}" combined_cxx_flags)
92+
string(STRIP "${combined_cxx_flags} ${compile_options}" combined_cxx_flags)
93+
message("${indent}" "C++ flags ...........................${dots} ${combined_cxx_flags}")
94+
endmacro()
95+
96+
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
97+
if(is_multi_config)
98+
list(JOIN CMAKE_CONFIGURATION_TYPES ", " configs)
99+
message("Available build configurations ........ ${configs}")
100+
if(CMAKE_GENERATOR MATCHES "Visual Studio")
101+
set(default_config "Debug")
102+
else()
103+
list(GET CMAKE_CONFIGURATION_TYPES 0 default_config)
104+
endif()
105+
message("Default build configuration ........... ${default_config}")
106+
foreach(config IN LISTS CMAKE_CONFIGURATION_TYPES)
107+
message("'${config}' build configuration:")
108+
print_flags_per_config("${config}" " " "")
109+
endforeach()
110+
else()
111+
message("Build configuration ................... ${CMAKE_BUILD_TYPE}")
112+
print_flags_per_config("${CMAKE_BUILD_TYPE}" "" "..")
113+
endif()
114+
115+
if(have_disabled_fields)
116+
message("")
117+
message(WARNING
118+
"Only compiling in support for field sizes: ${MINISKETCH_FIELDS}\n"
119+
"This means the library will lack support for other field sizes entirely.")
120+
endif()
121+
message("")

src/CMakeLists.txt

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Check for clmul instructions support.
2+
if(MSVC)
3+
set(CLMUL_CXXFLAGS "")
4+
else()
5+
set(CLMUL_CXXFLAGS "-mpclmul")
6+
endif()
7+
include(CMakePushCheckState)
8+
cmake_push_check_state(RESET)
9+
set(CMAKE_REQUIRED_FLAGS ${CLMUL_CXXFLAGS})
10+
include(CheckCXXSourceCompiles)
11+
check_cxx_source_compiles("
12+
#include <immintrin.h>
13+
#include <stdint.h>
14+
15+
int main()
16+
{
17+
__m128i a = _mm_cvtsi64_si128((uint64_t)7);
18+
__m128i b = _mm_clmulepi64_si128(a, a, 37);
19+
__m128i c = _mm_srli_epi64(b, 41);
20+
__m128i d = _mm_xor_si128(b, c);
21+
uint64_t e = _mm_cvtsi128_si64(d);
22+
return e == 0;
23+
}
24+
" HAVE_CLMUL
25+
)
26+
cmake_pop_check_state()
27+
28+
add_subdirectory(fields)
29+
30+
add_library(minisketch minisketch.cpp)
31+
target_include_directories(minisketch
32+
PUBLIC
33+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
34+
)
35+
target_link_libraries(minisketch
36+
PRIVATE
37+
minisketch_field_generic_sources
38+
$<$<BOOL:${HAVE_CLMUL}>:minisketch_field_clmul_sources>
39+
)
40+
41+
add_library(minisketch_verify EXCLUDE_FROM_ALL minisketch.cpp)
42+
target_compile_definitions(minisketch_verify
43+
PUBLIC
44+
MINISKETCH_VERIFY
45+
)
46+
target_link_libraries(minisketch_verify
47+
PRIVATE
48+
minisketch_field_generic_sources
49+
$<$<BOOL:${HAVE_CLMUL}>:minisketch_field_clmul_sources>
50+
)
51+
52+
if(MINISKETCH_TESTS)
53+
add_executable(test test.cpp)
54+
target_link_libraries(test PRIVATE minisketch)
55+
56+
add_executable(test-verify test.cpp)
57+
target_link_libraries(test-verify PRIVATE minisketch_verify)
58+
endif()
59+
60+
if(MINISKETCH_BENCHMARK)
61+
add_executable(bench bench.cpp)
62+
target_link_libraries(bench PRIVATE minisketch)
63+
endif()
64+
65+
if(CMAKE_CXX_STANDARD LESS 20)
66+
# Check for working clz builtins.
67+
check_cxx_source_compiles("
68+
int main()
69+
{
70+
unsigned a = __builtin_clz(1);
71+
unsigned long b = __builtin_clzl(1);
72+
unsigned long long c = __builtin_clzll(1);
73+
}
74+
" HAVE_CLZ
75+
)
76+
target_compile_definitions(minisketch
77+
PRIVATE
78+
$<$<BOOL:${HAVE_CLZ}>:HAVE_CLZ>
79+
)
80+
target_compile_definitions(minisketch_verify
81+
PRIVATE
82+
$<$<BOOL:${HAVE_CLZ}>:HAVE_CLZ>
83+
)
84+
endif()
85+

src/fields/CMakeLists.txt

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
add_library(minisketch_field_generic_sources INTERFACE)
2+
target_sources(minisketch_field_generic_sources
3+
INTERFACE
4+
generic_1byte.cpp
5+
generic_2bytes.cpp
6+
generic_3bytes.cpp
7+
generic_4bytes.cpp
8+
generic_5bytes.cpp
9+
generic_6bytes.cpp
10+
generic_7bytes.cpp
11+
generic_8bytes.cpp
12+
)
13+
14+
add_library(minisketch_field_clmul_sources INTERFACE)
15+
target_sources(minisketch_field_clmul_sources
16+
INTERFACE
17+
clmul_1byte.cpp
18+
clmul_2bytes.cpp
19+
clmul_3bytes.cpp
20+
clmul_4bytes.cpp
21+
clmul_5bytes.cpp
22+
clmul_6bytes.cpp
23+
clmul_7bytes.cpp
24+
clmul_8bytes.cpp
25+
)
26+
target_compile_definitions(minisketch_field_clmul_sources
27+
INTERFACE
28+
HAVE_CLMUL
29+
)
30+
target_compile_options(minisketch_field_clmul_sources
31+
INTERFACE
32+
${CLMUL_CXXFLAGS}
33+
)

0 commit comments

Comments
 (0)