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