add_library(secp256k1) set_property(TARGET secp256k1 PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1.h ${PROJECT_SOURCE_DIR}/include/secp256k1_preallocated.h ) # Processing must be done in a topological sorting of the dependency graph # (dependent module first). if(SECP256K1_ENABLE_MODULE_ELLSWIFT) add_compile_definitions(ENABLE_MODULE_ELLSWIFT=1) set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_ellswift.h) endif() if(SECP256K1_ENABLE_MODULE_MUSIG) if(DEFINED SECP256K1_ENABLE_MODULE_SCHNORRSIG AND NOT SECP256K1_ENABLE_MODULE_SCHNORRSIG) message(FATAL_ERROR "Module dependency error: You have disabled the schnorrsig module explicitly, but it is required by the musig module.") endif() set(SECP256K1_ENABLE_MODULE_SCHNORRSIG ON) add_compile_definitions(ENABLE_MODULE_MUSIG=1) set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_musig.h) endif() if(SECP256K1_ENABLE_MODULE_SCHNORRSIG) if(DEFINED SECP256K1_ENABLE_MODULE_EXTRAKEYS AND NOT SECP256K1_ENABLE_MODULE_EXTRAKEYS) message(FATAL_ERROR "Module dependency error: You have disabled the extrakeys module explicitly, but it is required by the schnorrsig module.") endif() set(SECP256K1_ENABLE_MODULE_EXTRAKEYS ON) add_compile_definitions(ENABLE_MODULE_SCHNORRSIG=1) set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_schnorrsig.h) endif() if(SECP256K1_ENABLE_MODULE_EXTRAKEYS) add_compile_definitions(ENABLE_MODULE_EXTRAKEYS=1) set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_extrakeys.h) endif() if(SECP256K1_ENABLE_MODULE_RECOVERY) add_compile_definitions(ENABLE_MODULE_RECOVERY=1) set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_recovery.h) endif() if(SECP256K1_ENABLE_MODULE_ECDH) add_compile_definitions(ENABLE_MODULE_ECDH=1) set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_ecdh.h) endif() add_library(secp256k1_precomputed OBJECT EXCLUDE_FROM_ALL precomputed_ecmult.c precomputed_ecmult_gen.c ) # Add objects explicitly rather than linking to the object libs to keep them # from being exported. target_sources(secp256k1 PRIVATE secp256k1.c $) if(NOT SECP256K1_ENABLE_API_VISIBILITY_ATTRIBUTES) target_compile_definitions(secp256k1 PRIVATE SECP256K1_NO_API_VISIBILITY_ATTRIBUTES) endif() # Create a helper lib that parent projects can use to link secp256k1 into a # static lib. add_library(secp256k1_objs INTERFACE) target_sources(secp256k1_objs INTERFACE $ $) add_library(secp256k1_asm INTERFACE) if(SECP256K1_ASM STREQUAL "arm32") add_library(secp256k1_asm_arm OBJECT EXCLUDE_FROM_ALL) target_sources(secp256k1_asm_arm PUBLIC asm/field_10x26_arm.s ) target_sources(secp256k1 PRIVATE $) target_sources(secp256k1_objs INTERFACE $) target_link_libraries(secp256k1_asm INTERFACE secp256k1_asm_arm) endif() if(WIN32) # Define our export symbol only for shared libs. set_target_properties(secp256k1 PROPERTIES DEFINE_SYMBOL SECP256K1_DLL_EXPORT) target_compile_definitions(secp256k1 INTERFACE $<$>:SECP256K1_STATIC>) endif() # Object libs don't know if they're being built for a shared or static lib. # Grab the PIC property from secp256k1 which knows. get_target_property(use_pic secp256k1 POSITION_INDEPENDENT_CODE) set_target_properties(secp256k1_precomputed PROPERTIES POSITION_INDEPENDENT_CODE ${use_pic}) # Add the include path for parent projects so that they don't have to manually add it. target_include_directories(secp256k1 INTERFACE $>:${PROJECT_SOURCE_DIR}/include>> ) set_target_properties(secp256k1_objs PROPERTIES INTERFACE_COMPILE_DEFINITIONS "$" INTERFACE_INCLUDE_DIRECTORIES "$" ) include(SetLibtoolAbiVersion) set_libtool_abi_version(secp256k1 ${${PROJECT_NAME}_LIB_VERSION_CURRENT} ${${PROJECT_NAME}_LIB_VERSION_REVISION} ${${PROJECT_NAME}_LIB_VERSION_AGE} ) if(SECP256K1_BUILD_BENCHMARK) add_executable(bench bench.c) target_link_libraries(bench secp256k1) add_executable(bench_internal bench_internal.c) target_link_libraries(bench_internal secp256k1_precomputed secp256k1_asm) add_executable(bench_ecmult bench_ecmult.c) target_link_libraries(bench_ecmult secp256k1_precomputed secp256k1_asm) endif() if(SECP256K1_BUILD_TESTS) include(CheckIncludeFile) check_include_file(sys/types.h HAVE_SYS_TYPES_H) check_include_file(sys/wait.h HAVE_SYS_WAIT_H) check_include_file(unistd.h HAVE_UNISTD_H) set(TEST_DEFINITIONS "") if(HAVE_SYS_TYPES_H AND HAVE_SYS_WAIT_H AND HAVE_UNISTD_H) list(APPEND TEST_DEFINITIONS SUPPORTS_CONCURRENCY=1) endif() function(add_executable_and_tests exe_name verify_definition) add_executable(${exe_name} tests.c) target_link_libraries(${exe_name} secp256k1_precomputed secp256k1_asm) target_compile_definitions(${exe_name} PRIVATE ${verify_definition} ${TEST_DEFINITIONS}) include(DiscoverTests) discover_tests(${exe_name} DISCOVERY_ARGS "--list_tests" DISCOVERY_MATCH "^\\t\\\\[ *[0-9]+\\\\] ([^ ].*)$" TEST_NAME_REPLACEMENT "secp256k1.${exe_name}.\\\\1" TEST_ARGS_REPLACEMENT "--target=\\\\1 --log=1" PROPERTIES LABELS "secp256k1_${exe_name}" ) endfunction() add_executable_and_tests(noverify_tests "") if(NOT CMAKE_BUILD_TYPE STREQUAL "Coverage") add_executable_and_tests(tests VERIFY) endif() unset(TEST_DEFINITIONS) endif() if(SECP256K1_BUILD_EXHAUSTIVE_TESTS) # Note: do not include secp256k1_precomputed in exhaustive_tests (it uses runtime-generated tables). add_executable(exhaustive_tests tests_exhaustive.c) target_link_libraries(exhaustive_tests secp256k1_asm) target_compile_definitions(exhaustive_tests PRIVATE $<$>:VERIFY>) add_test(NAME secp256k1.exhaustive_tests COMMAND exhaustive_tests) set_tests_properties(secp256k1.exhaustive_tests PROPERTIES LABELS secp256k1_exhaustive ) endif() if(SECP256K1_BUILD_CTIME_TESTS) add_executable(ctime_tests ctime_tests.c) target_link_libraries(ctime_tests secp256k1) endif() if(SECP256K1_INSTALL) include(GNUInstallDirs) target_include_directories(secp256k1 INTERFACE $ ) install(TARGETS secp256k1 EXPORT ${PROJECT_NAME}-targets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ) install(EXPORT ${PROJECT_NAME}-targets FILE ${PROJECT_NAME}-targets.cmake NAMESPACE ${PROJECT_NAME}:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} ) include(CMakePackageConfigHelpers) configure_package_config_file( ${PROJECT_SOURCE_DIR}/cmake/config.cmake.in ${PROJECT_NAME}-config.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} NO_SET_AND_CHECK_MACRO ) write_basic_package_version_file(${PROJECT_NAME}-config-version.cmake COMPATIBILITY SameMinorVersion ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} ) include(GeneratePkgConfigFile) generate_pkg_config_file(${PROJECT_SOURCE_DIR}/libsecp256k1.pc.in) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig ) endif()