Skip to content

Commit fa71348

Browse files
committed
WIP: visibility example for cmake
1 parent c498779 commit fa71348

File tree

2 files changed

+28
-60
lines changed

2 files changed

+28
-60
lines changed

include/secp256k1.h

Lines changed: 13 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -121,45 +121,21 @@ typedef int (*secp256k1_nonce_function)(
121121
#endif
122122

123123
/* Symbol visibility. */
124-
#if defined(_WIN32)
125-
/* GCC for Windows (e.g., MinGW) accepts the __declspec syntax
126-
* for MSVC compatibility. A __declspec declaration implies (but is not
127-
* exactly equivalent to) __attribute__ ((visibility("default"))), and so we
128-
* actually want __declspec even on GCC, see "Microsoft Windows Function
129-
* Attributes" in the GCC manual and the recommendations in
130-
* https://gcc.gnu.org/wiki/Visibility. */
131-
# if defined(SECP256K1_BUILD)
132-
# if defined(DLL_EXPORT) || defined(SECP256K1_DLL_EXPORT)
133-
/* Building libsecp256k1 as a DLL.
134-
* 1. If using Libtool, it defines DLL_EXPORT automatically.
135-
* 2. In other cases, SECP256K1_DLL_EXPORT must be defined. */
136-
# define SECP256K1_API extern __declspec (dllexport)
137-
# else
138-
/* Building libsecp256k1 as a static library on Windows.
139-
* No declspec is needed, and so we would want the non-Windows-specific
140-
* logic below take care of this case. However, this may result in setting
141-
* __attribute__ ((visibility("default"))), which is supposed to be a noop
142-
* on Windows but may trigger warnings when compiling with -flto due to a
143-
* bug in GCC, see
144-
* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116478 . */
145-
# define SECP256K1_API extern
146-
# endif
147-
/* The user must define SECP256K1_STATIC when consuming libsecp256k1 as a static
148-
* library on Windows. */
149-
# elif !defined(SECP256K1_STATIC)
150-
/* Consuming libsecp256k1 as a DLL. */
151-
# define SECP256K1_API extern __declspec (dllimport)
152-
# endif
124+
#if defined(_WIN32) || defined(__CYGWIN__)
125+
# define SECP256K1_EXPORT __declspec(dllexport)
126+
# define SECP256K1_IMPORT __declspec(dllimport)
127+
#else
128+
# define SECP256K1_EXPORT __attribute__((visibility("default")))
129+
# define SECP256K1_IMPORT __attribute__((visibility("default")))
153130
#endif
154131
#ifndef SECP256K1_API
155-
/* All cases not captured by the Windows-specific logic. */
156-
# if defined(__GNUC__) && (__GNUC__ >= 4) && defined(SECP256K1_BUILD)
157-
/* Building libsecp256k1 using GCC or compatible. */
158-
# define SECP256K1_API extern __attribute__ ((visibility ("default")))
159-
# else
160-
/* Fall back to standard C's extern. */
161-
# define SECP256K1_API extern
162-
# endif
132+
# if defined(SECP256K1_STATIC)
133+
# define SECP256K1_API extern
134+
# elif defined(SECP256K1_BUILD)
135+
# define SECP256K1_API extern SECP256K1_EXPORT
136+
# else
137+
# define SECP256K1_API extern SECP256K1_IMPORT
138+
# endif
163139
#endif
164140

165141
/* Warning attributes

src/CMakeLists.txt

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -54,27 +54,16 @@ add_library(secp256k1_precomputed OBJECT EXCLUDE_FROM_ALL
5454
# from being exported.
5555
target_sources(secp256k1 PRIVATE secp256k1.c $<TARGET_OBJECTS:secp256k1_precomputed>)
5656

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)
6357
if(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)
58+
add_library(secp256k1_asm OBJECT EXCLUDE_FROM_ALL asm/field_10x26_arm.s)
59+
else()
60+
add_library(secp256k1_asm INTERFACE)
7161
endif()
7262

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()
63+
# When building a static libary, SECP256K1_STATIC must be defined both for itself and downstream.
64+
# Note that the generator expression is evaluated in the context of the consuming target!
65+
target_compile_definitions(secp256k1 PUBLIC $<$<STREQUAL:$<TARGET_PROPERTY:secp256k1,TYPE>,STATIC_LIBRARY>:SECP256K1_STATIC>)
66+
set_target_properties(secp256k1 PROPERTIES C_VISIBILITY_PRESET hidden VISIBILITY_INLINES_HIDDEN ON)
7867

7968
# Object libs don't know if they're being built for a shared or static lib.
8069
# Grab the PIC property from secp256k1 which knows.
@@ -85,9 +74,6 @@ set_target_properties(secp256k1_precomputed PROPERTIES POSITION_INDEPENDENT_CODE
8574
target_include_directories(secp256k1 INTERFACE
8675
$<BUILD_INTERFACE:$<$<NOT:$<BOOL:${PROJECT_IS_TOP_LEVEL}>>:${PROJECT_SOURCE_DIR}/include>>
8776
)
88-
set_target_properties(secp256k1_objs PROPERTIES
89-
INTERFACE_INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:secp256k1,INTERFACE_INCLUDE_DIRECTORIES>"
90-
)
9177

9278
# This emulates Libtool to make sure Libtool and CMake agree on the ABI version,
9379
# see below "Calculate the version variables" in build-aux/ltmain.sh.
@@ -123,18 +109,21 @@ if(SECP256K1_BUILD_BENCHMARK)
123109
add_executable(bench bench.c)
124110
target_link_libraries(bench secp256k1)
125111
add_executable(bench_internal bench_internal.c)
112+
target_compile_definitions(bench_internal PRIVATE $<TARGET_PROPERTY:secp256k1,INTERFACE_COMPILE_DEFINITIONS>)
126113
target_link_libraries(bench_internal secp256k1_precomputed secp256k1_asm)
127114
add_executable(bench_ecmult bench_ecmult.c)
115+
target_compile_definitions(bench_ecmult PRIVATE $<TARGET_PROPERTY:secp256k1,INTERFACE_COMPILE_DEFINITIONS>)
128116
target_link_libraries(bench_ecmult secp256k1_precomputed secp256k1_asm)
129117
endif()
130118

131119
if(SECP256K1_BUILD_TESTS)
132120
add_executable(noverify_tests tests.c)
121+
target_compile_definitions(noverify_tests PRIVATE $<TARGET_PROPERTY:secp256k1,INTERFACE_COMPILE_DEFINITIONS>)
133122
target_link_libraries(noverify_tests secp256k1_precomputed secp256k1_asm)
134123
add_test(NAME secp256k1_noverify_tests COMMAND noverify_tests)
135124
if(NOT CMAKE_BUILD_TYPE STREQUAL "Coverage")
136125
add_executable(tests tests.c)
137-
target_compile_definitions(tests PRIVATE VERIFY)
126+
target_compile_definitions(tests PRIVATE VERIFY $<TARGET_PROPERTY:secp256k1,INTERFACE_COMPILE_DEFINITIONS>)
138127
target_link_libraries(tests secp256k1_precomputed secp256k1_asm)
139128
add_test(NAME secp256k1_tests COMMAND tests)
140129
endif()
@@ -144,7 +133,10 @@ if(SECP256K1_BUILD_EXHAUSTIVE_TESTS)
144133
# Note: do not include secp256k1_precomputed in exhaustive_tests (it uses runtime-generated tables).
145134
add_executable(exhaustive_tests tests_exhaustive.c)
146135
target_link_libraries(exhaustive_tests secp256k1_asm)
147-
target_compile_definitions(exhaustive_tests PRIVATE $<$<NOT:$<CONFIG:Coverage>>:VERIFY>)
136+
target_compile_definitions(exhaustive_tests PRIVATE
137+
$<$<NOT:$<CONFIG:Coverage>>:VERIFY>
138+
$<TARGET_PROPERTY:secp256k1,INTERFACE_COMPILE_DEFINITIONS>
139+
)
148140
add_test(NAME secp256k1_exhaustive_tests COMMAND exhaustive_tests)
149141
endif()
150142

0 commit comments

Comments
 (0)