Skip to content

Commit 654110f

Browse files
committed
cmake: Build bitcoin_crypto library
1 parent 78e2642 commit 654110f

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/module)
3838
# Configurable options.
3939
# When adding a new option, end the <help_text> with a full stop for consistency.
4040
include(CMakeDependentOption)
41+
option(ASM "Use assembly routines." ON)
4142
cmake_dependent_option(CXX20 "Enable compilation in C++20 mode." OFF "NOT MSVC" ON)
4243

4344
if(CXX20)
@@ -110,6 +111,7 @@ else()
110111
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
111112
message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
112113
endif()
114+
message("Use assembly routines ................. ${ASM}")
113115
message("\n")
114116
if(configure_warnings)
115117
message(" ******\n")

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ configure_file(${CMAKE_SOURCE_DIR}/cmake/bitcoin-config.h.in config/bitcoin-conf
66
add_compile_definitions(HAVE_CONFIG_H)
77
include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
88

9+
add_subdirectory(crypto)
910
add_subdirectory(univalue)
1011

1112

src/crypto/CMakeLists.txt

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# Copyright (c) 2023 The Bitcoin Core developers
2+
# Distributed under the MIT software license, see the accompanying
3+
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
if(ASM AND NOT MSVC)
6+
include(CMakePushCheckState)
7+
cmake_push_check_state(RESET)
8+
9+
# Check for SSE4.1 intrinsics.
10+
set(SSE41_CXXFLAGS -msse4.1)
11+
string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${SSE41_CXXFLAGS}")
12+
check_cxx_source_compiles("
13+
#include <immintrin.h>
14+
15+
int main()
16+
{
17+
__m128i l = _mm_set1_epi32(0);
18+
return _mm_extract_epi32(l, 3);
19+
}
20+
" HAVE_SSE41
21+
)
22+
23+
# Check for AVX2 intrinsics.
24+
set(AVX2_CXXFLAGS -mavx -mavx2)
25+
string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${AVX2_CXXFLAGS}")
26+
check_cxx_source_compiles("
27+
#include <immintrin.h>
28+
29+
int main()
30+
{
31+
__m256i l = _mm256_set1_epi32(0);
32+
return _mm256_extract_epi32(l, 7);
33+
}
34+
" HAVE_AVX2
35+
)
36+
37+
# Check for x86 SHA-NI intrinsics.
38+
set(X86_SHANI_CXXFLAGS -msse4 -msha)
39+
string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${X86_SHANI_CXXFLAGS}")
40+
check_cxx_source_compiles("
41+
#include <immintrin.h>
42+
43+
int main()
44+
{
45+
__m128i i = _mm_set1_epi32(0);
46+
__m128i j = _mm_set1_epi32(1);
47+
__m128i k = _mm_set1_epi32(2);
48+
return _mm_extract_epi32(_mm_sha256rnds2_epu32(i, i, k), 0);
49+
}
50+
" HAVE_X86_SHANI
51+
)
52+
53+
# Check for ARMv8 SHA-NI intrinsics.
54+
set(ARM_SHANI_CXXFLAGS -march=armv8-a+crypto)
55+
string(REPLACE ";" " " CMAKE_REQUIRED_FLAGS "${ARM_SHANI_CXXFLAGS}")
56+
check_cxx_source_compiles("
57+
#include <arm_neon.h>
58+
59+
int main()
60+
{
61+
uint32x4_t a, b, c;
62+
vsha256h2q_u32(a, b, c);
63+
vsha256hq_u32(a, b, c);
64+
vsha256su0q_u32(a, b);
65+
vsha256su1q_u32(a, b, c);
66+
}
67+
" HAVE_ARM_SHANI
68+
)
69+
70+
cmake_pop_check_state()
71+
endif()
72+
73+
include(CheckCXXSymbolExists)
74+
check_cxx_symbol_exists(timingsafe_bcmp "string.h" HAVE_TIMINGSAFE_BCMP)
75+
76+
# The `bitcoin_crypto` must be of an `OBJECT` type to include
77+
# its object files into the output static library archives.
78+
add_library(bitcoin_crypto OBJECT EXCLUDE_FROM_ALL
79+
$<$<BOOL:${ASM}>:sha256_sse4.cpp>
80+
$<$<BOOL:${HAVE_SSE41}>:sha256_sse41.cpp>
81+
$<$<BOOL:${HAVE_AVX2}>:sha256_avx2.cpp>
82+
$<$<BOOL:${HAVE_X86_SHANI}>:sha256_x86_shani.cpp>
83+
$<$<BOOL:${HAVE_ARM_SHANI}>:sha256_arm_shani.cpp>
84+
aes.cpp
85+
chacha_poly_aead.cpp
86+
chacha20.cpp
87+
hkdf_sha256_32.cpp
88+
hmac_sha256.cpp
89+
hmac_sha512.cpp
90+
poly1305.cpp
91+
muhash.cpp
92+
ripemd160.cpp
93+
sha1.cpp
94+
sha256.cpp
95+
sha3.cpp
96+
sha512.cpp
97+
siphash.cpp
98+
)
99+
target_compile_definitions(bitcoin_crypto
100+
PRIVATE
101+
$<$<BOOL:${ASM}>:USE_ASM>
102+
$<$<BOOL:${HAVE_SSE41}>:ENABLE_SSE41>
103+
$<$<BOOL:${HAVE_AVX2}>:ENABLE_AVX2>
104+
$<$<BOOL:${HAVE_X86_SHANI}>:ENABLE_X86_SHANI>
105+
$<$<BOOL:${HAVE_ARM_SHANI}>:ENABLE_ARM_SHANI>
106+
$<$<BOOL:${HAVE_TIMINGSAFE_BCMP}>:HAVE_TIMINGSAFE_BCMP>
107+
)
108+
target_compile_options(bitcoin_crypto
109+
PRIVATE
110+
$<$<BOOL:${HAVE_SSE41}>:${SSE41_CXXFLAGS}>
111+
$<$<BOOL:${HAVE_AVX2}>:${AVX2_CXXFLAGS}>
112+
$<$<BOOL:${HAVE_X86_SHANI}>:${X86_SHANI_CXXFLAGS}>
113+
$<$<BOOL:${HAVE_ARM_SHANI}>:${ARM_SHANI_CXXFLAGS}>
114+
)

0 commit comments

Comments
 (0)