Skip to content

Commit ebd6668

Browse files
committed
Add minimal CMake-based build system
1 parent a571ba2 commit ebd6668

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed

CMakeLists.txt

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
3+
project(minisketch VERSION 0.0.1 LANGUAGES CXX)
4+
5+
set(CMAKE_CXX_STANDARD 11)
6+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
7+
set(CMAKE_CXX_EXTENSIONS OFF)
8+
9+
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
10+
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
11+
12+
if(MSVC)
13+
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
14+
add_compile_options(/Zc:__cplusplus /W1)
15+
else()
16+
add_compile_options(-Wall)
17+
endif()
18+
19+
# Check for clmul instructions support.
20+
if(MSVC)
21+
set(CLMUL_CXXFLAGS "")
22+
else()
23+
set(CLMUL_CXXFLAGS "-mpclmul")
24+
endif()
25+
set(CMAKE_REQUIRED_FLAGS ${CLMUL_CXXFLAGS})
26+
include(CheckCXXSourceCompiles)
27+
check_cxx_source_compiles("
28+
#include <stdint.h>
29+
#ifdef _MSC_VER
30+
#include <intrin.h>
31+
#else
32+
#include <x86intrin.h>
33+
#endif
34+
35+
int main()
36+
{
37+
__m128i a = _mm_cvtsi64_si128((uint64_t)7);
38+
__m128i b = _mm_clmulepi64_si128(a, a, 37);
39+
__m128i c = _mm_srli_epi64(b, 41);
40+
__m128i d = _mm_xor_si128(b, c);
41+
uint64_t e = _mm_cvtsi128_si64(d);
42+
return e == 0;
43+
}
44+
" HAVE_CLMUL)
45+
set(CMAKE_REQUIRED_FLAGS)
46+
47+
# Check for working clz builtins.
48+
check_cxx_source_compiles("
49+
int main()
50+
{
51+
unsigned a = __builtin_clz(1);
52+
unsigned long b = __builtin_clzl(1);
53+
unsigned long long c = __builtin_clzll(1);
54+
}
55+
" HAVE_CLZ)
56+
57+
add_library(${PROJECT_NAME}_sources INTERFACE)
58+
target_sources(${PROJECT_NAME}_sources
59+
INTERFACE
60+
${PROJECT_SOURCE_DIR}/src/minisketch.cpp
61+
${PROJECT_SOURCE_DIR}/src/fields/generic_1byte.cpp
62+
${PROJECT_SOURCE_DIR}/src/fields/generic_2bytes.cpp
63+
${PROJECT_SOURCE_DIR}/src/fields/generic_3bytes.cpp
64+
${PROJECT_SOURCE_DIR}/src/fields/generic_4bytes.cpp
65+
${PROJECT_SOURCE_DIR}/src/fields/generic_5bytes.cpp
66+
${PROJECT_SOURCE_DIR}/src/fields/generic_6bytes.cpp
67+
${PROJECT_SOURCE_DIR}/src/fields/generic_7bytes.cpp
68+
${PROJECT_SOURCE_DIR}/src/fields/generic_8bytes.cpp
69+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_1byte.cpp>
70+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_2bytes.cpp>
71+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_3bytes.cpp>
72+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_4bytes.cpp>
73+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_5bytes.cpp>
74+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_6bytes.cpp>
75+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_7bytes.cpp>
76+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_8bytes.cpp>
77+
)
78+
target_compile_definitions(${PROJECT_NAME}_sources
79+
INTERFACE
80+
$<$<BOOL:${HAVE_CLMUL}>:HAVE_CLMUL>
81+
$<$<BOOL:${HAVE_CLZ}>:HAVE_CLZ>
82+
)
83+
target_compile_options(${PROJECT_NAME}_sources
84+
INTERFACE
85+
$<$<BOOL:${HAVE_CLMUL}>:${CLMUL_CXXFLAGS}>
86+
)
87+
88+
add_library(${PROJECT_NAME} STATIC)
89+
target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_sources)
90+
91+
add_library(${PROJECT_NAME}_verify STATIC EXCLUDE_FROM_ALL)
92+
target_compile_definitions(${PROJECT_NAME}_verify PUBLIC MINISKETCH_VERIFY)
93+
target_link_libraries(${PROJECT_NAME}_verify PRIVATE ${PROJECT_NAME}_sources)
94+
95+
add_executable(test EXCLUDE_FROM_ALL ${PROJECT_SOURCE_DIR}/src/test.cpp)
96+
target_link_libraries(test PRIVATE ${PROJECT_NAME})
97+
98+
add_executable(test_verify EXCLUDE_FROM_ALL ${PROJECT_SOURCE_DIR}/src/test.cpp)
99+
target_link_libraries(test_verify PRIVATE ${PROJECT_NAME}_verify)
100+
101+
add_executable(bench EXCLUDE_FROM_ALL ${PROJECT_SOURCE_DIR}/src/bench.cpp)
102+
target_link_libraries(bench PRIVATE ${PROJECT_NAME})
103+
104+
message("\n")
105+
message("Configure summary")
106+
message("=================")
107+
if(CMAKE_CROSSCOMPILING)
108+
set(cross_status "TRUE, for ${CMAKE_SYSTEM_NAME}, ${CMAKE_SYSTEM_PROCESSOR}")
109+
else()
110+
set(cross_status "FALSE")
111+
endif()
112+
message("Cross compiling ....................... ${cross_status}")
113+
if(HAVE_CLMUL)
114+
set(clmul_status "TRUE")
115+
else()
116+
set(clmul_status "FALSE")
117+
endif()
118+
message("Enable clmul fields ................... ${clmul_status}")
119+
get_directory_property(definitions COMPILE_DEFINITIONS)
120+
message("Preprocessor defined macros ........... ${definitions}")
121+
message("C++ compiler .......................... ${CMAKE_CXX_COMPILER}")
122+
message("CXXFLAGS .............................. ${CMAKE_CXX_FLAGS}")
123+
get_directory_property(compile_options COMPILE_OPTIONS)
124+
string(REPLACE ";" " " compile_options "${compile_options}")
125+
message("Compile options ....................... ${compile_options}")
126+
if(DEFINED CMAKE_BUILD_TYPE)
127+
message("Build type:")
128+
message(" - configuration ...................... ${CMAKE_BUILD_TYPE}")
129+
string(TOUPPER "${CMAKE_BUILD_TYPE}" build_type)
130+
message(" - CXXFLAGS ........................... ${CMAKE_CXX_FLAGS_${build_type}}")
131+
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_${build_type}}")
132+
else()
133+
message("Available configurations .............. ${CMAKE_CONFIGURATION_TYPES}")
134+
message("Debug configuration:")
135+
message(" - CXXFLAGS ........................... ${CMAKE_CXX_FLAGS_DEBUG}")
136+
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
137+
message("Release configuration:")
138+
message(" - CXXFLAGS ........................... ${CMAKE_CXX_FLAGS_RELEASE}")
139+
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
140+
endif()
141+
message("\n")

0 commit comments

Comments
 (0)