11add_library (secp256k1)
22
3+ # Allow projects in the same source tree to use this as if it had been imported.
4+ # The prefix has to match the NAMESPACE in `install(EXPORT)` further down.
5+ add_library (${PROJECT_NAME} ::secp256k1 ALIAS secp256k1)
6+
37set_property (TARGET secp256k1 PROPERTY PUBLIC_HEADER
48 ${PROJECT_SOURCE_DIR} /include /secp256k1.h
59 ${PROJECT_SOURCE_DIR} /include /secp256k1_preallocated.h
@@ -54,40 +58,24 @@ add_library(secp256k1_precomputed OBJECT EXCLUDE_FROM_ALL
5458# from being exported.
5559target_sources (secp256k1 PRIVATE secp256k1.c $<TARGET_OBJECTS:secp256k1_precomputed>)
5660
57- # Create a helper lib that parent projects can use to link secp256k1 into a
58- # static lib.
59- add_library (secp256k1_objs INTERFACE )
60- target_sources (secp256k1_objs INTERFACE $<TARGET_OBJECTS:secp256k1> $<TARGET_OBJECTS:secp256k1_precomputed>)
61-
62- add_library (secp256k1_asm INTERFACE )
6361if (SECP256K1_ASM STREQUAL "arm32" )
64- add_library (secp256k1_asm_arm OBJECT EXCLUDE_FROM_ALL )
65- target_sources (secp256k1_asm_arm PUBLIC
66- asm/field_10x26_arm.s
67- )
68- target_sources (secp256k1 PRIVATE $<TARGET_OBJECTS:secp256k1_asm_arm>)
69- target_sources (secp256k1_objs INTERFACE $<TARGET_OBJECTS:secp256k1_asm_arm>)
70- target_link_libraries (secp256k1_asm INTERFACE secp256k1_asm_arm)
62+ add_library (secp256k1_asm OBJECT EXCLUDE_FROM_ALL asm/field_10x26_arm.s)
63+ else ()
64+ add_library (secp256k1_asm INTERFACE )
7165endif ()
7266
73- if (WIN32 )
74- # Define our export symbol only for shared libs.
75- set_target_properties (secp256k1 PROPERTIES DEFINE_SYMBOL SECP256K1_DLL_EXPORT)
76- target_compile_definitions (secp256k1 INTERFACE $<$<NOT :$<BOOL :${BUILD_SHARED_LIBS} >>:SECP256K1_STATIC>)
77- endif ()
67+ # When building a static libary, SECP256K1_STATIC must be defined both for itself and downstream.
68+ # Note that the generator expression is evaluated in the context of the consuming target!
69+ target_compile_definitions (secp256k1 PUBLIC $<$<STREQUAL :$<TARGET_PROPERTY:secp256k1,TYPE >,STATIC_LIBRARY>:SECP256K1_STATIC>)
70+ set_target_properties (secp256k1 PROPERTIES C_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN ON )
7871
7972# Object libs don't know if they're being built for a shared or static lib.
8073# Grab the PIC property from secp256k1 which knows.
8174get_target_property (use_pic secp256k1 POSITION_INDEPENDENT_CODE )
8275set_target_properties (secp256k1_precomputed PROPERTIES POSITION_INDEPENDENT_CODE ${use_pic} )
8376
84- # Add the include path for parent projects so that they don't have to manually add it.
85- target_include_directories (secp256k1 INTERFACE
86- $<BUILD_INTERFACE:$<$<NOT :$<BOOL :${PROJECT_IS_TOP_LEVEL} >>:${PROJECT_SOURCE_DIR} /include >>
87- )
88- set_target_properties (secp256k1_objs PROPERTIES
89- INTERFACE_INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:secp256k1,INTERFACE_INCLUDE_DIRECTORIES>"
90- )
77+ # Add the include path for projects in the same source tree.
78+ target_include_directories (secp256k1 INTERFACE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR} /include >)
9179
9280# This emulates Libtool to make sure Libtool and CMake agree on the ABI version,
9381# see below "Calculate the version variables" in build-aux/ltmain.sh.
@@ -123,18 +111,21 @@ if(SECP256K1_BUILD_BENCHMARK)
123111 add_executable (bench bench.c)
124112 target_link_libraries (bench secp256k1)
125113 add_executable (bench_internal bench_internal.c)
114+ target_compile_definitions (bench_internal PRIVATE $<TARGET_PROPERTY:secp256k1,INTERFACE_COMPILE_DEFINITIONS >)
126115 target_link_libraries (bench_internal secp256k1_precomputed secp256k1_asm)
127116 add_executable (bench_ecmult bench_ecmult.c)
117+ target_compile_definitions (bench_ecmult PRIVATE $<TARGET_PROPERTY:secp256k1,INTERFACE_COMPILE_DEFINITIONS >)
128118 target_link_libraries (bench_ecmult secp256k1_precomputed secp256k1_asm)
129119endif ()
130120
131121if (SECP256K1_BUILD_TESTS)
132122 add_executable (noverify_tests tests.c)
123+ target_compile_definitions (noverify_tests PRIVATE $<TARGET_PROPERTY:secp256k1,INTERFACE_COMPILE_DEFINITIONS >)
133124 target_link_libraries (noverify_tests secp256k1_precomputed secp256k1_asm)
134125 add_test (NAME secp256k1_noverify_tests COMMAND noverify_tests)
135126 if (NOT CMAKE_BUILD_TYPE STREQUAL "Coverage" )
136127 add_executable (tests tests.c)
137- target_compile_definitions (tests PRIVATE VERIFY)
128+ target_compile_definitions (tests PRIVATE VERIFY $<TARGET_PROPERTY:secp256k1, INTERFACE_COMPILE_DEFINITIONS > )
138129 target_link_libraries (tests secp256k1_precomputed secp256k1_asm)
139130 add_test (NAME secp256k1_tests COMMAND tests)
140131 endif ()
@@ -144,7 +135,10 @@ if(SECP256K1_BUILD_EXHAUSTIVE_TESTS)
144135 # Note: do not include secp256k1_precomputed in exhaustive_tests (it uses runtime-generated tables).
145136 add_executable (exhaustive_tests tests_exhaustive.c)
146137 target_link_libraries (exhaustive_tests secp256k1_asm)
147- target_compile_definitions (exhaustive_tests PRIVATE $<$<NOT :$<CONFIG:Coverage>>:VERIFY>)
138+ target_compile_definitions (exhaustive_tests PRIVATE
139+ $<$<NOT :$<CONFIG:Coverage>>:VERIFY>
140+ $<TARGET_PROPERTY:secp256k1,INTERFACE_COMPILE_DEFINITIONS >
141+ )
148142 add_test (NAME secp256k1_exhaustive_tests COMMAND exhaustive_tests)
149143endif ()
150144
0 commit comments