Skip to content

Commit b4eb644

Browse files
committed
Squashed 'src/secp256k1/' changes from 4258c54..a91ad4864dc
a91ad4864dc Add doc/ellswift.md with ElligatorSwift explanation 874134adaa8 Add ellswift testing to CI e616ba578dd Add benchmarks for ellswift module 0ef5317416a Add ctime tests for ellswift module 4c758e426ea Add _prefix and _bip324 ellswift_xdh hash functions 6048c780b2f Add tests for ellswift module 1c369b8e718 Add ellswift module implementing ElligatorSwift 8576bad51d3 Add functions to test if X coordinate is valid 8ae11550d54 Add benchmark for key generation 3353d3c Merge bitcoin-core/secp256k1#1207: Split fe_set_b32 into reducing and normalizing variants 5b32602 Split fe_set_b32 into reducing and normalizing variants 006ddc1 Merge bitcoin-core/secp256k1#1306: build: Make tests work with external default callbacks 1907f0f build: Make tests work with external default callbacks fb3a806 Merge bitcoin-core/secp256k1#1133: schnorrsig: Add test vectors for variable-length messages cd54ac7 schnorrsig: Improve docs of schnorrsig_sign_custom 28687b0 schnorrsig: Add BIP340 varlen test vectors 97a98be schnorrsig: Refactor test vector code to allow varlen messages ab5a917 Merge bitcoin-core/secp256k1#1303: ct: Use more volatile 9eb6934 Merge bitcoin-core/secp256k1#1305: Remove unused scratch space from API 073d98a Merge bitcoin-core/secp256k1#1292: refactor: Make 64-bit shift explicit 17fa217 ct: Be cautious and use volatile trick in more "conditional" paths 5fb336f ct: Use volatile trick in scalar_cond_negate 712e7f8 Remove unused scratch space from API 54d34b6 Merge bitcoin-core/secp256k1#1300: Avoid normalize conditional on VERIFY c63ec88 Merge bitcoin-core/secp256k1#1066: Abstract out and merge all the magnitude/normalized logic 7fc642f Simplify secp256k1_fe_{impl_,}verify 4e176ad Abstract out verify logic for fe_is_square_var 4371f98 Abstract out verify logic for fe_add_int 89e324c Abstract out verify logic for fe_half 283cd80 Abstract out verify logic for fe_get_bounds d5aa2f0 Abstract out verify logic for fe_inv{,_var} 3167646 Abstract out verify logic for fe_from_storage 76d31e5 Abstract out verify logic for fe_to_storage 1e6894b Abstract out verify logic for fe_cmov be82bd8 Improve comments/checks for fe_sqrt 6ab3508 Abstract out verify logic for fe_sqr 4c25f6e Abstract out verify logic for fe_mul e179e65 Abstract out verify logic for fe_add 7e7ad7f Abstract out verify logic for fe_mul_int 65d82a3 Abstract out verify logic for fe_negate 1446708 Abstract out verify logic for fe_get_b32 f7a7666 Abstract out verify logic for fe_set_b32 ce4d209 Abstract out verify logic for fe_cmp_var 7d7d43c Improve comments/check for fe_equal{,_var} c5e788d Abstract out verify logic for fe_is_odd d3f3fe8 Abstract out verify logic for fe_is_zero c701d9a Abstract out verify logic for fe_clear 19a2bfe Abstract out verify logic for fe_set_int 864f9db Abstract out verify logic for fe_normalizes_to_zero{,_var} 6c31371 Abstract out verify logic for fe_normalize_var e28b51f Abstract out verify logic for fe_normalize_weak b6b6f9c Abstract out verify logic for fe_normalize 7fa5195 Bugfix: correct SECP256K1_FE_CONST mag/norm fields b29566c Merge magnitude/normalized fields, move/improve comments 97c63b9 Avoid normalize conditional on VERIFY 341cc19 Merge bitcoin-core/secp256k1#1299: Infinity handling: ecmult_const(infinity) works, and group verification bbc8344 Avoid secp256k1_ge_set_gej_zinv with uninitialized z 0a2e0b2 Make secp256k1_{fe,ge,gej}_verify work as no-op if non-VERIFY f202667 Add invariant checking to group elements a18821d Always initialize output coordinates in secp256k1_ge_set_gej 3086cb9 Expose secp256k1_fe_verify to other modules a0e696f Make secp256k1_ecmult_const handle infinity 24c768a Merge bitcoin-core/secp256k1#1301: Avoid using bench_verify_data as bench_sign_data; merge them 2e65f1f Avoid using bench_verify_data as bench_sign_data; merge them 1cf15eb Merge bitcoin-core/secp256k1#1296: docs: complete interface description for `secp256k1_schnorrsig_sign_custom` 149c41c docs: complete interface description for `secp256k1_schnorrsig_sign_custom` f30c748 Merge bitcoin-core/secp256k1#1270: cmake: Fix library ABI versioning d1e48e5 refactor: Make 64-bit shift explicit b2e29e4 ci: Treat all compiler warnings as errors in "Windows (VS 2022)" task 3c81838 Merge bitcoin-core/secp256k1#1289: cmake: Use full signature of `add_test()` command 755629b cmake: Use full signature of `add_test()` command bef448f cmake: Fix library ABI versioning 4b0f711 Merge bitcoin-core/secp256k1#1277: autotools: Clean up after adding Wycheproof 222ecaf Merge bitcoin-core/secp256k1#1284: cmake: Some improvements using `PROJECT_IS_TOP_LEVEL` variable 71f746c cmake: Include `include` directory for subtree builds 024a409 Merge bitcoin-core/secp256k1#1240: cmake: Improve and document compiler flag checks a8d059f cmake, doc: Document compiler flags 6ece150 cmake, refactor: Rename `try_add_compile_option` to `try_append_cflags` 19516ed cmake: Use `add_compile_options()` in `try_add_compile_option()` 4b84f4b Merge bitcoin-core/secp256k1#1239: cmake: Bugfix and other improvements after bumping CMake up to 3.13 596b336 Merge bitcoin-core/secp256k1#1234: cmake: Add dev-mode 6b7e5b7 Merge bitcoin-core/secp256k1#1275: build: Fix C4005 "macro redefinition" MSVC warnings in examples 1c89536 Merge bitcoin-core/secp256k1#1286: tests: remove extra semicolon in macro c4062d6 debug: move helper for printing buffers into util.h 7e977b3 autotools: Take VPATH builds into account when generating testvectors 2418d32 autotools: Create src/wycheproof dir before creating file in it 8764034 autotools: Make all "pregenerated" targets .PHONY e1b9ce8 autotools: Use same conventions for all pregenerated files 3858bad tests: remove extra semicolon in macro 1f33bb2 Merge bitcoin-core/secp256k1#1205: field: Improve docs +tests of secp256k1_fe_set_b32 162da73 tests: Add debug helper for printing buffers e9fd3df field: Improve docs and tests of secp256k1_fe_set_b32 f6bef03 Merge bitcoin-core/secp256k1#1283: Get rid of secp256k1_fe_const_b 5431b9d cmake: Make `SECP256K1_INSTALL` default depend on `PROJECT_IS_TOP_LEVEL` 5ec1333 Merge bitcoin-core/secp256k1#1285: bench: Make sys/time.h a system include 68b16a1 bench: Make sys/time.h a system include 162608c cmake: Emulate `PROJECT_IS_TOP_LEVEL` for CMake<3.21 69e1ec0 Get rid of secp256k1_fe_const_b ce5ba9e gitignore: Add CMakeUserPresets.json 0a446a3 cmake: Add dev-mode CMake preset a6f4bcf Merge bitcoin-core/secp256k1#1231: Move `SECP256K1_INLINE` macro definition out from `include/secp256k1.h` a273d74 cmake: Improve version comparison 6a58b48 cmake: Use `if(... IN_LIST ...)` command 2445808 cmake: Use dedicated `GENERATOR_IS_MULTI_CONFIG` property 9f8703e cmake: Use dedicated `CMAKE_HOST_APPLE` variable 8c20170 cmake: Use recommended `add_compile_definitions` command 04d4cc0 cmake: Add `DESCRIPTION` and `HOMEPAGE_URL` options to `project` command 8a8b653 cmake: Use `SameMinorVersion` compatibility mode 5b0444a Merge bitcoin-core/secp256k1#1263: cmake: Make installation optional 47ac3d6 cmake: Make installation optional 2e035af Merge bitcoin-core/secp256k1#1273: build: Make `SECP_VALGRIND_CHECK` preserve `CPPFLAGS` 5be353d Merge bitcoin-core/secp256k1#1279: tests: lint wycheproof's python script 08f4b16 autotools: Move code around to tidy Makefile 04bf3f6 Merge bitcoin-core/secp256k1#1230: Build: allow static or shared but not both 9ce9984 Merge bitcoin-core/secp256k1#1265: Remove bits argument from secp256k1_wnaf_const{_xonly} 566faa1 Merge bitcoin-core/secp256k1#1267: doc: clarify process for patch releases ef49a11 build: allow static or shared but not both 35ada3b tests: lint wycheproof's python script 529b54d autotools: Move Wycheproof header from EXTRA_DIST to noinst_HEADERS dc0657c build: Fix C4005 "macro redefinition" MSVC warnings in examples 1ecb94e build: Make `SECP_VALGRIND_CHECK` preserve `CPPFLAGS` 1b6fb55 doc: clarify process for patch releases a575339 Remove bits argument from secp256k1_wnaf_const (always 256) 36b0adf build: remove warning until it's reproducible 8e142ca Move `SECP256K1_INLINE` macro definition out from `include/secp256k1.h` 7744589 Remove `SECP256K1_INLINE` usage from examples ca92a35 field: Simplify code in secp256k1_fe_set_b32 d93f62e field: Verify field element even after secp256k1_fe_set_b32 fails git-subtree-dir: src/secp256k1 git-subtree-split: a91ad4864dc6945f7eefa3b82de31ce01e2b9b22
1 parent c981671 commit b4eb644

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+3532
-1043
lines changed

.cirrus.yml

+14-6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ env:
2121
ECDH: no
2222
RECOVERY: no
2323
SCHNORRSIG: no
24+
ELLSWIFT: no
2425
### test options
2526
SECP256K1_TEST_ITERS:
2627
BENCH: yes
@@ -74,12 +75,12 @@ task:
7475
<< : *LINUX_CONTAINER
7576
matrix: &ENV_MATRIX
7677
- env: {WIDEMUL: int64, RECOVERY: yes}
77-
- env: {WIDEMUL: int64, ECDH: yes, SCHNORRSIG: yes}
78+
- env: {WIDEMUL: int64, ECDH: yes, SCHNORRSIG: yes, ELLSWIFT: yes}
7879
- env: {WIDEMUL: int128}
79-
- env: {WIDEMUL: int128_struct}
80-
- env: {WIDEMUL: int128, RECOVERY: yes, SCHNORRSIG: yes}
80+
- env: {WIDEMUL: int128_struct, ELLSWIFT: yes}
81+
- env: {WIDEMUL: int128, RECOVERY: yes, SCHNORRSIG: yes, ELLSWIFT: yes}
8182
- env: {WIDEMUL: int128, ECDH: yes, SCHNORRSIG: yes}
82-
- env: {WIDEMUL: int128, ASM: x86_64}
83+
- env: {WIDEMUL: int128, ASM: x86_64 , ELLSWIFT: yes}
8384
- env: { RECOVERY: yes, SCHNORRSIG: yes}
8485
- env: {CTIMETESTS: no, RECOVERY: yes, ECDH: yes, SCHNORRSIG: yes, CPPFLAGS: -DVERIFY}
8586
- env: {BUILD: distcheck, WITH_VALGRIND: no, CTIMETESTS: no, BENCH: no}
@@ -154,6 +155,7 @@ task:
154155
ECDH: yes
155156
RECOVERY: yes
156157
SCHNORRSIG: yes
158+
ELLSWIFT: yes
157159
CTIMETESTS: no
158160
<< : *MERGE_BASE
159161
test_script:
@@ -173,6 +175,7 @@ task:
173175
ECDH: yes
174176
RECOVERY: yes
175177
SCHNORRSIG: yes
178+
ELLSWIFT: yes
176179
CTIMETESTS: no
177180
matrix:
178181
- env: {}
@@ -193,6 +196,7 @@ task:
193196
ECDH: yes
194197
RECOVERY: yes
195198
SCHNORRSIG: yes
199+
ELLSWIFT: yes
196200
CTIMETESTS: no
197201
<< : *MERGE_BASE
198202
test_script:
@@ -210,6 +214,7 @@ task:
210214
ECDH: yes
211215
RECOVERY: yes
212216
SCHNORRSIG: yes
217+
ELLSWIFT: yes
213218
CTIMETESTS: no
214219
<< : *MERGE_BASE
215220
test_script:
@@ -247,6 +252,7 @@ task:
247252
RECOVERY: yes
248253
EXPERIMENTAL: yes
249254
SCHNORRSIG: yes
255+
ELLSWIFT: yes
250256
CTIMETESTS: no
251257
# Use a MinGW-w64 host to tell ./configure we're building for Windows.
252258
# This will detect some MinGW-w64 tools but then make will need only
@@ -286,6 +292,7 @@ task:
286292
ECDH: yes
287293
RECOVERY: yes
288294
SCHNORRSIG: yes
295+
ELLSWIFT: yes
289296
CTIMETESTS: no
290297
matrix:
291298
- name: "Valgrind (memcheck)"
@@ -361,6 +368,7 @@ task:
361368
ECDH: yes
362369
RECOVERY: yes
363370
SCHNORRSIG: yes
371+
ELLSWIFT: yes
364372
<< : *MERGE_BASE
365373
test_script:
366374
- ./ci/cirrus.sh
@@ -397,13 +405,13 @@ task:
397405
- PowerShell -NoLogo -Command if ($env:CIRRUS_PR -ne $null) { git fetch $env:CIRRUS_REPO_CLONE_URL pull/$env:CIRRUS_PR/merge; git reset --hard FETCH_HEAD; }
398406
configure_script:
399407
- '%x64_NATIVE_TOOLS%'
400-
- cmake -G "Visual Studio 17 2022" -A x64 -S . -B build -DSECP256K1_ENABLE_MODULE_RECOVERY=ON -DSECP256K1_BUILD_EXAMPLES=ON
408+
- cmake -E env CFLAGS="/WX" cmake -G "Visual Studio 17 2022" -A x64 -S . -B build -DSECP256K1_ENABLE_MODULE_RECOVERY=ON -DSECP256K1_BUILD_EXAMPLES=ON
401409
build_script:
402410
- '%x64_NATIVE_TOOLS%'
403411
- cmake --build build --config RelWithDebInfo -- -property:UseMultiToolTask=true;CL_MPcount=5
404412
check_script:
405413
- '%x64_NATIVE_TOOLS%'
406-
- ctest --test-dir build -j 5
414+
- ctest -C RelWithDebInfo --test-dir build -j 5
407415
- build\src\RelWithDebInfo\bench_ecmult.exe
408416
- build\src\RelWithDebInfo\bench_internal.exe
409417
- build\src\RelWithDebInfo\bench.exe

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,7 @@ build-aux/compile
5959
build-aux/test-driver
6060
libsecp256k1.pc
6161

62+
### CMake
63+
/CMakeUserPresets.json
6264
# Default CMake build directory.
6365
/build

CMakeLists.txt

+90-55
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,33 @@
11
cmake_minimum_required(VERSION 3.13)
22

3-
if(CMAKE_VERSION VERSION_GREATER 3.14)
3+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.15)
44
# MSVC runtime library flags are selected by the CMAKE_MSVC_RUNTIME_LIBRARY abstraction.
55
cmake_policy(SET CMP0091 NEW)
66
# MSVC warning flags are not in CMAKE_<LANG>_FLAGS by default.
77
cmake_policy(SET CMP0092 NEW)
88
endif()
99

10-
# The package (a.k.a. release) version is based on semantic versioning 2.0.0 of
11-
# the API. All changes in experimental modules are treated as
12-
# backwards-compatible and therefore at most increase the minor version.
13-
project(libsecp256k1 VERSION 0.3.2 LANGUAGES C)
10+
project(libsecp256k1
11+
# The package (a.k.a. release) version is based on semantic versioning 2.0.0 of
12+
# the API. All changes in experimental modules are treated as
13+
# backwards-compatible and therefore at most increase the minor version.
14+
VERSION 0.3.2
15+
DESCRIPTION "Optimized C library for ECDSA signatures and secret/public key operations on curve secp256k1."
16+
HOMEPAGE_URL "https://github.com/bitcoin-core/secp256k1"
17+
LANGUAGES C
18+
)
19+
20+
if(CMAKE_VERSION VERSION_LESS 3.21)
21+
get_directory_property(parent_directory PARENT_DIRECTORY)
22+
if(parent_directory)
23+
set(PROJECT_IS_TOP_LEVEL OFF CACHE INTERNAL "Emulates CMake 3.21+ behavior.")
24+
set(${PROJECT_NAME}_IS_TOP_LEVEL OFF CACHE INTERNAL "Emulates CMake 3.21+ behavior.")
25+
else()
26+
set(PROJECT_IS_TOP_LEVEL ON CACHE INTERNAL "Emulates CMake 3.21+ behavior.")
27+
set(${PROJECT_NAME}_IS_TOP_LEVEL ON CACHE INTERNAL "Emulates CMake 3.21+ behavior.")
28+
endif()
29+
unset(parent_directory)
30+
endif()
1431

1532
# The library version is based on libtool versioning of the ABI. The set of
1633
# rules for updating the version can be found here:
@@ -26,36 +43,43 @@ set(CMAKE_C_EXTENSIONS OFF)
2643

2744
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
2845

29-
# We do not use CMake's BUILD_SHARED_LIBS option.
30-
option(SECP256K1_BUILD_SHARED "Build shared library." ON)
31-
option(SECP256K1_BUILD_STATIC "Build static library." ON)
32-
if(NOT SECP256K1_BUILD_SHARED AND NOT SECP256K1_BUILD_STATIC)
33-
message(FATAL_ERROR "At least one of SECP256K1_BUILD_SHARED and SECP256K1_BUILD_STATIC must be enabled.")
46+
option(BUILD_SHARED_LIBS "Build shared libraries." ON)
47+
option(SECP256K1_DISABLE_SHARED "Disable shared library. Overrides BUILD_SHARED_LIBS." OFF)
48+
if(SECP256K1_DISABLE_SHARED)
49+
set(BUILD_SHARED_LIBS OFF)
3450
endif()
3551

52+
option(SECP256K1_INSTALL "Enable installation." ${PROJECT_IS_TOP_LEVEL})
53+
3654
option(SECP256K1_ENABLE_MODULE_ECDH "Enable ECDH module." ON)
3755
if(SECP256K1_ENABLE_MODULE_ECDH)
38-
add_definitions(-DENABLE_MODULE_ECDH=1)
56+
add_compile_definitions(ENABLE_MODULE_ECDH=1)
3957
endif()
4058

4159
option(SECP256K1_ENABLE_MODULE_RECOVERY "Enable ECDSA pubkey recovery module." OFF)
4260
if(SECP256K1_ENABLE_MODULE_RECOVERY)
43-
add_definitions(-DENABLE_MODULE_RECOVERY=1)
61+
add_compile_definitions(ENABLE_MODULE_RECOVERY=1)
4462
endif()
4563

4664
option(SECP256K1_ENABLE_MODULE_EXTRAKEYS "Enable extrakeys module." ON)
4765
option(SECP256K1_ENABLE_MODULE_SCHNORRSIG "Enable schnorrsig module." ON)
4866
if(SECP256K1_ENABLE_MODULE_SCHNORRSIG)
4967
set(SECP256K1_ENABLE_MODULE_EXTRAKEYS ON)
50-
add_definitions(-DENABLE_MODULE_SCHNORRSIG=1)
68+
add_compile_definitions(ENABLE_MODULE_SCHNORRSIG=1)
5169
endif()
5270
if(SECP256K1_ENABLE_MODULE_EXTRAKEYS)
53-
add_definitions(-DENABLE_MODULE_EXTRAKEYS=1)
71+
add_compile_definitions(ENABLE_MODULE_EXTRAKEYS=1)
5472
endif()
5573

74+
option(SECP256K1_ENABLE_MODULE_ELLSWIFT "Enable ElligatorSwift module." ON)
75+
if(SECP256K1_ENABLE_MODULE_ELLSWIFT)
76+
add_definitions(-DENABLE_MODULE_ELLSWIFT=1)
77+
endif()
78+
79+
5680
option(SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS "Enable external default callback functions." OFF)
5781
if(SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS)
58-
add_definitions(-DUSE_EXTERNAL_DEFAULT_CALLBACKS=1)
82+
add_compile_definitions(USE_EXTERNAL_DEFAULT_CALLBACKS=1)
5983
endif()
6084

6185
set(SECP256K1_ECMULT_WINDOW_SIZE "AUTO" CACHE STRING "Window size for ecmult precomputation for verification, specified as integer in range [2..24]. \"AUTO\" is a reasonable setting for desktop machines (currently 15). [default=AUTO]")
@@ -65,22 +89,22 @@ check_string_option_value(SECP256K1_ECMULT_WINDOW_SIZE)
6589
if(SECP256K1_ECMULT_WINDOW_SIZE STREQUAL "AUTO")
6690
set(SECP256K1_ECMULT_WINDOW_SIZE 15)
6791
endif()
68-
add_definitions(-DECMULT_WINDOW_SIZE=${SECP256K1_ECMULT_WINDOW_SIZE})
92+
add_compile_definitions(ECMULT_WINDOW_SIZE=${SECP256K1_ECMULT_WINDOW_SIZE})
6993

7094
set(SECP256K1_ECMULT_GEN_PREC_BITS "AUTO" CACHE STRING "Precision bits to tune the precomputed table size for signing, specified as integer 2, 4 or 8. \"AUTO\" is a reasonable setting for desktop machines (currently 4). [default=AUTO]")
7195
set_property(CACHE SECP256K1_ECMULT_GEN_PREC_BITS PROPERTY STRINGS "AUTO" 2 4 8)
7296
check_string_option_value(SECP256K1_ECMULT_GEN_PREC_BITS)
7397
if(SECP256K1_ECMULT_GEN_PREC_BITS STREQUAL "AUTO")
7498
set(SECP256K1_ECMULT_GEN_PREC_BITS 4)
7599
endif()
76-
add_definitions(-DECMULT_GEN_PREC_BITS=${SECP256K1_ECMULT_GEN_PREC_BITS})
100+
add_compile_definitions(ECMULT_GEN_PREC_BITS=${SECP256K1_ECMULT_GEN_PREC_BITS})
77101

78102
set(SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY "OFF" CACHE STRING "Test-only override of the (autodetected by the C code) \"widemul\" setting. Legal values are: \"OFF\", \"int128_struct\", \"int128\" or \"int64\". [default=OFF]")
79103
set_property(CACHE SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY PROPERTY STRINGS "OFF" "int128_struct" "int128" "int64")
80104
check_string_option_value(SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY)
81105
if(SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY)
82106
string(TOUPPER "${SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY}" widemul_upper_value)
83-
add_definitions(-DUSE_FORCE_WIDEMUL_${widemul_upper_value}=1)
107+
add_compile_definitions(USE_FORCE_WIDEMUL_${widemul_upper_value}=1)
84108
endif()
85109
mark_as_advanced(FORCE SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY)
86110

@@ -89,13 +113,13 @@ set_property(CACHE SECP256K1_ASM PROPERTY STRINGS "AUTO" "OFF" "x86_64" "arm")
89113
check_string_option_value(SECP256K1_ASM)
90114
if(SECP256K1_ASM STREQUAL "arm")
91115
enable_language(ASM)
92-
add_definitions(-DUSE_EXTERNAL_ASM=1)
116+
add_compile_definitions(USE_EXTERNAL_ASM=1)
93117
elseif(SECP256K1_ASM)
94118
include(Check64bitAssembly)
95119
check_64bit_assembly()
96120
if(HAS_64BIT_ASM)
97121
set(SECP256K1_ASM "x86_64")
98-
add_definitions(-DUSE_ASM_X86_64=1)
122+
add_compile_definitions(USE_ASM_X86_64=1)
99123
elseif(SECP256K1_ASM STREQUAL "AUTO")
100124
set(SECP256K1_ASM "OFF")
101125
else()
@@ -118,7 +142,7 @@ if(SECP256K1_VALGRIND)
118142
if(Valgrind_FOUND)
119143
set(SECP256K1_VALGRIND ON)
120144
include_directories(${Valgrind_INCLUDE_DIR})
121-
add_definitions(-DVALGRIND)
145+
add_compile_definitions(VALGRIND)
122146
elseif(SECP256K1_VALGRIND STREQUAL "AUTO")
123147
set(SECP256K1_VALGRIND OFF)
124148
else()
@@ -165,42 +189,47 @@ mark_as_advanced(
165189
CMAKE_SHARED_LINKER_FLAGS_COVERAGE
166190
)
167191

168-
if(CMAKE_CONFIGURATION_TYPES)
169-
set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo" "Release" "Debug" "MinSizeRel" "Coverage")
170-
endif()
171-
172-
get_property(cached_cmake_build_type CACHE CMAKE_BUILD_TYPE PROPERTY TYPE)
173-
if(cached_cmake_build_type)
192+
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
193+
set(default_build_type "RelWithDebInfo")
194+
if(is_multi_config)
195+
set(CMAKE_CONFIGURATION_TYPES "${default_build_type}" "Release" "Debug" "MinSizeRel" "Coverage" CACHE STRING
196+
"Supported configuration types."
197+
FORCE
198+
)
199+
else()
174200
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
175-
STRINGS "RelWithDebInfo" "Release" "Debug" "MinSizeRel" "Coverage"
201+
STRINGS "${default_build_type}" "Release" "Debug" "MinSizeRel" "Coverage"
176202
)
203+
if(NOT CMAKE_BUILD_TYPE)
204+
message(STATUS "Setting build type to \"${default_build_type}\" as none was specified")
205+
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING
206+
"Choose the type of build."
207+
FORCE
208+
)
209+
endif()
177210
endif()
178211

179-
set(default_build_type "RelWithDebInfo")
180-
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
181-
message(STATUS "Setting build type to \"${default_build_type}\" as none was specified")
182-
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE)
183-
endif()
184-
185-
include(TryAddCompileOption)
212+
include(TryAppendCFlags)
186213
if(MSVC)
187-
try_add_compile_option(/W2)
188-
try_add_compile_option(/wd4146)
214+
# Keep the following commands ordered lexicographically.
215+
try_append_c_flags(/W2) # Moderate warning level.
216+
try_append_c_flags(/wd4146) # Disable warning C4146 "unary minus operator applied to unsigned type, result still unsigned".
189217
else()
190-
try_add_compile_option(-pedantic)
191-
try_add_compile_option(-Wall)
192-
try_add_compile_option(-Wcast-align)
193-
try_add_compile_option(-Wcast-align=strict)
194-
try_add_compile_option(-Wconditional-uninitialized)
195-
try_add_compile_option(-Wextra)
196-
try_add_compile_option(-Wnested-externs)
197-
try_add_compile_option(-Wno-long-long)
198-
try_add_compile_option(-Wno-overlength-strings)
199-
try_add_compile_option(-Wno-unused-function)
200-
try_add_compile_option(-Wreserved-identifier)
201-
try_add_compile_option(-Wshadow)
202-
try_add_compile_option(-Wstrict-prototypes)
203-
try_add_compile_option(-Wundef)
218+
# Keep the following commands ordered lexicographically.
219+
try_append_c_flags(-pedantic)
220+
try_append_c_flags(-Wall) # GCC >= 2.95 and probably many other compilers.
221+
try_append_c_flags(-Wcast-align) # GCC >= 2.95.
222+
try_append_c_flags(-Wcast-align=strict) # GCC >= 8.0.
223+
try_append_c_flags(-Wconditional-uninitialized) # Clang >= 3.0 only.
224+
try_append_c_flags(-Wextra) # GCC >= 3.4, this is the newer name of -W, which we don't use because older GCCs will warn about unused functions.
225+
try_append_c_flags(-Wnested-externs)
226+
try_append_c_flags(-Wno-long-long) # GCC >= 3.0, -Wlong-long is implied by -pedantic.
227+
try_append_c_flags(-Wno-overlength-strings) # GCC >= 4.2, -Woverlength-strings is implied by -pedantic.
228+
try_append_c_flags(-Wno-unused-function) # GCC >= 3.0, -Wunused-function is implied by -Wall.
229+
try_append_c_flags(-Wreserved-identifier) # Clang >= 13.0 only.
230+
try_append_c_flags(-Wshadow)
231+
try_append_c_flags(-Wstrict-prototypes)
232+
try_append_c_flags(-Wundef)
204233
endif()
205234

206235
set(CMAKE_C_VISIBILITY_PRESET hidden)
@@ -225,13 +254,19 @@ message("\n")
225254
message("secp256k1 configure summary")
226255
message("===========================")
227256
message("Build artifacts:")
228-
message(" shared library ...................... ${SECP256K1_BUILD_SHARED}")
229-
message(" static library ...................... ${SECP256K1_BUILD_STATIC}")
257+
if(BUILD_SHARED_LIBS)
258+
set(library_type "Shared")
259+
else()
260+
set(library_type "Static")
261+
endif()
262+
263+
message(" library type ........................ ${library_type}")
230264
message("Optional modules:")
231265
message(" ECDH ................................ ${SECP256K1_ENABLE_MODULE_ECDH}")
232266
message(" ECDSA pubkey recovery ............... ${SECP256K1_ENABLE_MODULE_RECOVERY}")
233267
message(" extrakeys ........................... ${SECP256K1_ENABLE_MODULE_EXTRAKEYS}")
234268
message(" schnorrsig .......................... ${SECP256K1_ENABLE_MODULE_SCHNORRSIG}")
269+
message(" ElligatorSwift ...................... ${SECP256K1_ENABLE_MODULE_ELLSWIFT}")
235270
message("Parameters:")
236271
message(" ecmult window size .................. ${SECP256K1_ECMULT_WINDOW_SIZE}")
237272
message(" ecmult gen precision bits ........... ${SECP256K1_ECMULT_GEN_PREC_BITS}")
@@ -268,15 +303,15 @@ message("CFLAGS ................................ ${CMAKE_C_FLAGS}")
268303
get_directory_property(compile_options COMPILE_OPTIONS)
269304
string(REPLACE ";" " " compile_options "${compile_options}")
270305
message("Compile options ....................... " ${compile_options})
271-
if(DEFINED CMAKE_BUILD_TYPE)
306+
if(NOT is_multi_config)
272307
message("Build type:")
273308
message(" - CMAKE_BUILD_TYPE ................... ${CMAKE_BUILD_TYPE}")
274309
string(TOUPPER "${CMAKE_BUILD_TYPE}" build_type)
275310
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_${build_type}}")
276311
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_${build_type}}")
277312
message(" - LDFLAGS for shared libraries ....... ${CMAKE_SHARED_LINKER_FLAGS_${build_type}}")
278313
else()
279-
message("Available configurations .............. ${CMAKE_CONFIGURATION_TYPES}")
314+
message("Supported configurations .............. ${CMAKE_CONFIGURATION_TYPES}")
280315
message("RelWithDebInfo configuration:")
281316
message(" - CFLAGS ............................. ${CMAKE_C_FLAGS_RELWITHDEBINFO}")
282317
message(" - LDFLAGS for executables ............ ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}")

CMakePresets.json

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"cmakeMinimumRequired": {"major": 3, "minor": 21, "patch": 0},
3+
"version": 3,
4+
"configurePresets": [
5+
{
6+
"name": "dev-mode",
7+
"displayName": "Development mode (intended only for developers of the library)",
8+
"cacheVariables": {
9+
"SECP256K1_EXPERIMENTAL": "ON",
10+
"SECP256K1_ENABLE_MODULE_RECOVERY": "ON",
11+
"SECP256K1_BUILD_EXAMPLES": "ON"
12+
},
13+
"warnings": {
14+
"dev": true,
15+
"uninitialized": true
16+
}
17+
}
18+
]
19+
}

0 commit comments

Comments
 (0)