Skip to content

Commit 48cf323

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

File tree

2 files changed

+168
-0
lines changed

2 files changed

+168
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,6 @@ stamp-h1
3333

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

CMakeLists.txt

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

0 commit comments

Comments
 (0)