Skip to content

Commit 951cd7f

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

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed

CMakeLists.txt

+161
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
cmake_minimum_required(VERSION 3.1)
2+
3+
if(CMAKE_VERSION VERSION_GREATER 3.14)
4+
# MSVC runtime library flags are selected by the CMAKE_MSVC_RUNTIME_LIBRARY abstraction.
5+
cmake_policy(SET CMP0091 NEW)
6+
# MSVC warning flags are not in CMAKE_<LANG>_FLAGS by default.
7+
cmake_policy(SET CMP0092 NEW)
8+
endif()
9+
if(CMAKE_VERSION VERSION_GREATER 3.19)
10+
# MSVC RTTI flag /GR is not added to CMAKE_CXX_FLAGS by default.
11+
cmake_policy(SET CMP0117 NEW)
12+
endif()
13+
14+
project(minisketch VERSION 0.0.1 LANGUAGES CXX)
15+
16+
set(CMAKE_CXX_STANDARD 11)
17+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
18+
set(CMAKE_CXX_EXTENSIONS OFF)
19+
20+
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
21+
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
22+
23+
if(MSVC)
24+
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
25+
add_compile_options(/Zc:__cplusplus /W4 /wd4060 /wd4065 /wd4100 /wd4127 /wd4146 /wd4244 /wd4267 /wd4310)
26+
else()
27+
add_compile_options(-Wall)
28+
endif()
29+
30+
# Check for clmul instructions support.
31+
if(MSVC)
32+
set(CLMUL_CXXFLAGS "")
33+
else()
34+
set(CLMUL_CXXFLAGS "-mpclmul")
35+
endif()
36+
set(CMAKE_REQUIRED_FLAGS ${CLMUL_CXXFLAGS})
37+
include(CheckCXXSourceCompiles)
38+
check_cxx_source_compiles("
39+
#include <immintrin.h>
40+
#include <stdint.h>
41+
42+
int main()
43+
{
44+
__m128i a = _mm_cvtsi64_si128((uint64_t)7);
45+
__m128i b = _mm_clmulepi64_si128(a, a, 37);
46+
__m128i c = _mm_srli_epi64(b, 41);
47+
__m128i d = _mm_xor_si128(b, c);
48+
uint64_t e = _mm_cvtsi128_si64(d);
49+
return e == 0;
50+
}
51+
" HAVE_CLMUL)
52+
set(CMAKE_REQUIRED_FLAGS)
53+
54+
# Check for working clz builtins.
55+
check_cxx_source_compiles("
56+
int main()
57+
{
58+
unsigned a = __builtin_clz(1);
59+
unsigned long b = __builtin_clzl(1);
60+
unsigned long long c = __builtin_clzll(1);
61+
}
62+
" HAVE_CLZ)
63+
64+
add_library(${PROJECT_NAME}_sources INTERFACE)
65+
target_sources(${PROJECT_NAME}_sources
66+
INTERFACE
67+
${PROJECT_SOURCE_DIR}/src/minisketch.cpp
68+
${PROJECT_SOURCE_DIR}/src/fields/generic_1byte.cpp
69+
${PROJECT_SOURCE_DIR}/src/fields/generic_2bytes.cpp
70+
${PROJECT_SOURCE_DIR}/src/fields/generic_3bytes.cpp
71+
${PROJECT_SOURCE_DIR}/src/fields/generic_4bytes.cpp
72+
${PROJECT_SOURCE_DIR}/src/fields/generic_5bytes.cpp
73+
${PROJECT_SOURCE_DIR}/src/fields/generic_6bytes.cpp
74+
${PROJECT_SOURCE_DIR}/src/fields/generic_7bytes.cpp
75+
${PROJECT_SOURCE_DIR}/src/fields/generic_8bytes.cpp
76+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_1byte.cpp>
77+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_2bytes.cpp>
78+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_3bytes.cpp>
79+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_4bytes.cpp>
80+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_5bytes.cpp>
81+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_6bytes.cpp>
82+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_7bytes.cpp>
83+
$<$<BOOL:${HAVE_CLMUL}>:${PROJECT_SOURCE_DIR}/src/fields/clmul_8bytes.cpp>
84+
)
85+
target_compile_definitions(${PROJECT_NAME}_sources
86+
INTERFACE
87+
$<$<BOOL:${HAVE_CLMUL}>:HAVE_CLMUL>
88+
$<$<BOOL:${HAVE_CLZ}>:HAVE_CLZ>
89+
)
90+
target_compile_options(${PROJECT_NAME}_sources
91+
INTERFACE
92+
$<$<BOOL:${HAVE_CLMUL}>:${CLMUL_CXXFLAGS}>
93+
)
94+
95+
add_library(${PROJECT_NAME} STATIC "")
96+
target_include_directories(${PROJECT_NAME}
97+
INTERFACE
98+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
99+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
100+
)
101+
target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_sources)
102+
103+
add_library(${PROJECT_NAME}_verify STATIC EXCLUDE_FROM_ALL "")
104+
target_compile_definitions(${PROJECT_NAME}_verify PUBLIC MINISKETCH_VERIFY)
105+
target_link_libraries(${PROJECT_NAME}_verify PRIVATE ${PROJECT_NAME}_sources)
106+
107+
add_executable(${PROJECT_NAME}_test EXCLUDE_FROM_ALL ${PROJECT_SOURCE_DIR}/src/test.cpp)
108+
target_link_libraries(${PROJECT_NAME}_test PRIVATE ${PROJECT_NAME})
109+
110+
add_executable(${PROJECT_NAME}_test_verify EXCLUDE_FROM_ALL ${PROJECT_SOURCE_DIR}/src/test.cpp)
111+
target_link_libraries(${PROJECT_NAME}_test_verify PRIVATE ${PROJECT_NAME}_verify)
112+
113+
add_executable(${PROJECT_NAME}_bench EXCLUDE_FROM_ALL ${PROJECT_SOURCE_DIR}/src/bench.cpp)
114+
target_link_libraries(${PROJECT_NAME}_bench PRIVATE ${PROJECT_NAME})
115+
116+
message("\n")
117+
message("Configure summary")
118+
message("=================")
119+
message("Build options:")
120+
if(HAVE_CLMUL)
121+
set(clmul_status "TRUE")
122+
else()
123+
set(clmul_status "FALSE")
124+
endif()
125+
message(" - enable clmul fields ................ ${clmul_status}")
126+
if(HAVE_CLZ)
127+
set(clz_status "TRUE")
128+
else()
129+
set(clz_status "FALSE")
130+
endif()
131+
message(" - enable clz builtins ................ ${clz_status}")
132+
message("")
133+
if(CMAKE_CROSSCOMPILING)
134+
set(cross_status "TRUE, for ${CMAKE_SYSTEM_NAME}, ${CMAKE_SYSTEM_PROCESSOR}")
135+
else()
136+
set(cross_status "FALSE")
137+
endif()
138+
message("Cross compiling ....................... ${cross_status}")
139+
get_directory_property(definitions COMPILE_DEFINITIONS)
140+
message("Preprocessor defined macros ........... ${definitions}")
141+
message("C++ compiler .......................... ${CMAKE_CXX_COMPILER}")
142+
message("CXXFLAGS .............................. ${CMAKE_CXX_FLAGS}")
143+
get_directory_property(compile_options COMPILE_OPTIONS)
144+
string(REPLACE ";" " " compile_options "${compile_options}")
145+
message("Compile options ....................... ${compile_options}")
146+
if(DEFINED CMAKE_BUILD_TYPE)
147+
message("Build type:")
148+
message(" - configuration ...................... ${CMAKE_BUILD_TYPE}")
149+
string(TOUPPER "${CMAKE_BUILD_TYPE}" build_type)
150+
message(" - CXXFLAGS ........................... ${CMAKE_CXX_FLAGS_${build_type}}")
151+
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_${build_type}}")
152+
else()
153+
message("Available configurations .............. ${CMAKE_CONFIGURATION_TYPES}")
154+
message("Debug configuration:")
155+
message(" - CXXFLAGS ........................... ${CMAKE_CXX_FLAGS_DEBUG}")
156+
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_DEBUG}")
157+
message("Release configuration:")
158+
message(" - CXXFLAGS ........................... ${CMAKE_CXX_FLAGS_RELEASE}")
159+
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
160+
endif()
161+
message("\n")

0 commit comments

Comments
 (0)