diff --git a/src/secp256k1/CMakeLists.txt b/src/secp256k1/CMakeLists.txt --- a/src/secp256k1/CMakeLists.txt +++ b/src/secp256k1/CMakeLists.txt @@ -40,14 +40,15 @@ ) # The library -add_library(secp256k1 src/secp256k1.c) -target_include_directories(secp256k1 PUBLIC include) +add_library(secp256k1-object OBJECT src/secp256k1.c) +target_include_directories(secp256k1-object PUBLIC include) +set(SECP256k1_LIBS "") # We need to link in GMP find_package(GMP) if(GMP_FOUND) - target_include_directories(secp256k1 PUBLIC ${GMP_INCLUDE_DIR}) - target_link_libraries(secp256k1 ${GMP_LIBRARY}) + target_include_directories(secp256k1-object PUBLIC ${GMP_INCLUDE_DIR}) + list(APPEND SECP256k1_LIBS ${GMP_LIBRARY}) set(USE_NUM_GMP 1) set(USE_FIELD_INV_NUM 1) set(USE_SCALAR_INV_NUM 1) @@ -148,12 +149,35 @@ COMMAND gen_context ) - target_sources(secp256k1 PRIVATE ecmult_static_context.h) + target_sources(secp256k1-object PRIVATE ecmult_static_context.h) endif() # Generate the config configure_file(src/libsecp256k1-config.h.cmake.in src/libsecp256k1-config.h ESCAPE_QUOTES) -target_compile_definitions(secp256k1 PRIVATE HAVE_CONFIG_H SECP256K1_BUILD) +target_compile_definitions(secp256k1-object PRIVATE HAVE_CONFIG_H SECP256K1_BUILD) + +macro(build_secp256k1_library NAME TYPE) + add_library(${NAME} ${TYPE} $) + + # The following lines can be simplified with cmake >= 3.12: + # target_link_libraries(${NAME} secp256k1-object) + target_compile_definitions(${NAME} PRIVATE $) + target_include_directories(${NAME} PUBLIC $) + + target_link_libraries(${NAME} ${SECP256k1_LIBS}) + set_target_properties(${NAME} PROPERTIES OUTPUT_NAME "secp256k1") +endmacro() + +# Build the static secp256k1 library +build_secp256k1_library(secp256k1 STATIC) + +option(SECP256K1_BUILD_SHARED "Build secp256k1 as a shared library" OFF) +if(SECP256K1_BUILD_SHARED) + # CMake will automatically set the PIC option to the shared library, but not + # when building the object library files, causing a linker failure. + set_target_properties(secp256k1-object PROPERTIES POSITION_INDEPENDENT_CODE ON) + build_secp256k1_library(secp256k1-shared SHARED) +endif() # Tests option(SECP256K1_BUILD_TEST "Build secp256k1's unit tests" ON)