secp256k1.cmake raw
1 # Copyright (c) 2023-present The Bitcoin Core developers
2 # Distributed under the MIT software license, see the accompanying
3 # file COPYING or https://opensource.org/license/mit/.
4
5 enable_language(C)
6
7 function(add_secp256k1 subdir)
8 message("")
9 message("Configuring secp256k1 subtree...")
10 set(BUILD_SHARED_LIBS OFF)
11 set(CMAKE_EXPORT_COMPILE_COMMANDS OFF)
12
13 # Unconditionally prevent secp's symbols from being exported by our libs
14 set(CMAKE_C_VISIBILITY_PRESET hidden)
15 set(SECP256K1_ENABLE_API_VISIBILITY_ATTRIBUTES OFF CACHE BOOL "" FORCE)
16
17 set(SECP256K1_ENABLE_MODULE_ECDH OFF CACHE BOOL "" FORCE)
18 set(SECP256K1_ENABLE_MODULE_RECOVERY ON CACHE BOOL "" FORCE)
19 set(SECP256K1_ENABLE_MODULE_MUSIG ON CACHE BOOL "" FORCE)
20 set(SECP256K1_BUILD_BENCHMARK OFF CACHE BOOL "" FORCE)
21 set(SECP256K1_BUILD_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE)
22 set(SECP256K1_BUILD_EXHAUSTIVE_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE)
23 if(NOT BUILD_TESTS)
24 # Always skip the ctime tests, if we are building no other tests.
25 # Otherwise, they are built if Valgrind is available. See SECP256K1_VALGRIND.
26 set(SECP256K1_BUILD_CTIME_TESTS ${BUILD_TESTS} CACHE BOOL "" FORCE)
27 endif()
28 set(SECP256K1_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
29 include(GetTargetInterface)
30 # -fsanitize and related flags apply to both C++ and C,
31 # so we can pass them down to libsecp256k1 as CFLAGS and LDFLAGS.
32 get_target_interface(SECP256K1_APPEND_CFLAGS "" sanitize_interface COMPILE_OPTIONS)
33 string(STRIP "${SECP256K1_APPEND_CFLAGS} ${APPEND_CPPFLAGS}" SECP256K1_APPEND_CFLAGS)
34 string(STRIP "${SECP256K1_APPEND_CFLAGS} ${APPEND_CFLAGS}" SECP256K1_APPEND_CFLAGS)
35 set(SECP256K1_APPEND_CFLAGS ${SECP256K1_APPEND_CFLAGS} CACHE STRING "" FORCE)
36 get_target_interface(SECP256K1_APPEND_LDFLAGS "" sanitize_interface LINK_OPTIONS)
37 string(STRIP "${SECP256K1_APPEND_LDFLAGS} ${APPEND_LDFLAGS}" SECP256K1_APPEND_LDFLAGS)
38 set(SECP256K1_APPEND_LDFLAGS ${SECP256K1_APPEND_LDFLAGS} CACHE STRING "" FORCE)
39 # We want to build libsecp256k1 with the most tested RelWithDebInfo configuration.
40 foreach(config IN LISTS CMAKE_BUILD_TYPE CMAKE_CONFIGURATION_TYPES)
41 if(config STREQUAL "")
42 continue()
43 endif()
44 string(TOUPPER "${config}" config)
45 set(CMAKE_C_FLAGS_${config} "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
46 endforeach()
47 # If the CFLAGS environment variable is defined during building depends
48 # and configuring this build system, its content might be duplicated.
49 if(DEFINED ENV{CFLAGS})
50 deduplicate_flags(CMAKE_C_FLAGS)
51 endif()
52
53 add_subdirectory(${subdir})
54 set_target_properties(secp256k1 PROPERTIES
55 EXCLUDE_FROM_ALL TRUE
56 )
57 endfunction()
58