Skip to content

Commit 68094d6

Browse files
committed
Squashed 'src/secp256k1/' changes from 4187a46649..93bb76daa1
93bb76daa1 build: Add SECP256K1_FORCE_HIDDEN_VISIBILITY 89096c234d Merge bitcoin-core/secp256k1#1692: cmake: configure libsecp256k1.pc during install 7106dce6fd cmake: configure libsecp256k1.pc during install 29e73f4ba5 Merge bitcoin-core/secp256k1#1685: cmake: Emulate Libtool's behavior on FreeBSD 746e36b141 Merge bitcoin-core/secp256k1#1678: cmake: add a helper for linking into static libs a28c2ffa5c Merge bitcoin-core/secp256k1#1683: README: add link to musig example 2a9d374735 Merge bitcoin-core/secp256k1#1690: ci: Bump GCC snapshot major version to 16 add146e101 ci: Bump GCC snapshot major version to 16 145ae3e28d cmake: add a helper for linking into static libs 819210974b README: add link to musig example, generalize module enabling hint 95db29b144 Merge bitcoin-core/secp256k1#1679: cmake: Use `PUBLIC_HEADER` target property in installation logic 37dd422b5c cmake: Emulate Libtool's behavior on FreeBSD f24b838bed Merge bitcoin-core/secp256k1#1680: doc: Promote "Building with CMake" to standard procedure 3f31ac43e0 doc: Promote "Building with CMake" to standard procedure 6f67151ee2 cmake: Use `PUBLIC_HEADER` target property c32715b2a0 cmake, move-only: Move module option processing to `src/CMakeLists.txt` 201b2b8f06 Merge bitcoin-core/secp256k1#1675: cmake: Bump minimum required CMake version to 3.22 3af71987a8 cmake: Bump minimum required CMake version to 3.22 92394476e9 Merge bitcoin-core/secp256k1#1673: Assert field magnitude at control-flow join 3a4f448cb4 Assert field magnitude at control-flow join 9fab425256 Merge bitcoin-core/secp256k1#1668: bench_ecmult: add benchmark for ecmult_const_xonly 05445377f4 bench_ecmult: add benchmark for ecmult_const_xonly bb597b3d39 Merge bitcoin-core/secp256k1#1670: tests: update wycheproof files d73ed99479 tests: update wycheproof files git-subtree-dir: src/secp256k1 git-subtree-split: 93bb76daa1905974a22fab43f2675a53c85f000d
1 parent c31fcaa commit 68094d6

13 files changed

+156
-115
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ We strongly recommend updating to 0.3.1 if you use or plan to use Clang >=14 to
115115
- Fix "constant-timeness" issue with Clang >=14 that could leave applications using libsecp256k1 vulnerable to a timing side-channel attack. The fix avoids secret-dependent control flow and secret-dependent memory accesses in conditional moves of memory objects when libsecp256k1 is compiled with Clang >=14.
116116

117117
#### Added
118-
- Added tests against [Project Wycheproof's](https://github.com/google/wycheproof/) set of ECDSA test vectors (Bitcoin "low-S" variant), a fixed set of test cases designed to trigger various edge cases.
118+
- Added tests against [Project Wycheproof's](https://github.com/C2SP/wycheproof/) set of ECDSA test vectors (Bitcoin "low-S" variant), a fixed set of test cases designed to trigger various edge cases.
119119

120120
#### Changed
121121
- Increased minimum required CMake version to 3.13. CMake builds remain experimental.

CMakeLists.txt

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.16)
1+
cmake_minimum_required(VERSION 3.22)
22

33
#=============================
44
# Project / Package metadata
@@ -15,17 +15,6 @@ project(libsecp256k1
1515
enable_testing()
1616
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
1717

18-
if(CMAKE_VERSION VERSION_LESS 3.21)
19-
# Emulates CMake 3.21+ behavior.
20-
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
21-
set(PROJECT_IS_TOP_LEVEL ON)
22-
set(${PROJECT_NAME}_IS_TOP_LEVEL ON)
23-
else()
24-
set(PROJECT_IS_TOP_LEVEL OFF)
25-
set(${PROJECT_NAME}_IS_TOP_LEVEL OFF)
26-
endif()
27-
endif()
28-
2918
# The library version is based on libtool versioning of the ABI. The set of
3019
# rules for updating the version can be found here:
3120
# https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
@@ -63,40 +52,6 @@ option(SECP256K1_ENABLE_MODULE_SCHNORRSIG "Enable schnorrsig module." ON)
6352
option(SECP256K1_ENABLE_MODULE_MUSIG "Enable musig module." ON)
6453
option(SECP256K1_ENABLE_MODULE_ELLSWIFT "Enable ElligatorSwift module." ON)
6554

66-
# Processing must be done in a topological sorting of the dependency graph
67-
# (dependent module first).
68-
if(SECP256K1_ENABLE_MODULE_ELLSWIFT)
69-
add_compile_definitions(ENABLE_MODULE_ELLSWIFT=1)
70-
endif()
71-
72-
if(SECP256K1_ENABLE_MODULE_MUSIG)
73-
if(DEFINED SECP256K1_ENABLE_MODULE_SCHNORRSIG AND NOT SECP256K1_ENABLE_MODULE_SCHNORRSIG)
74-
message(FATAL_ERROR "Module dependency error: You have disabled the schnorrsig module explicitly, but it is required by the musig module.")
75-
endif()
76-
set(SECP256K1_ENABLE_MODULE_SCHNORRSIG ON)
77-
add_compile_definitions(ENABLE_MODULE_MUSIG=1)
78-
endif()
79-
80-
if(SECP256K1_ENABLE_MODULE_SCHNORRSIG)
81-
if(DEFINED SECP256K1_ENABLE_MODULE_EXTRAKEYS AND NOT SECP256K1_ENABLE_MODULE_EXTRAKEYS)
82-
message(FATAL_ERROR "Module dependency error: You have disabled the extrakeys module explicitly, but it is required by the schnorrsig module.")
83-
endif()
84-
set(SECP256K1_ENABLE_MODULE_EXTRAKEYS ON)
85-
add_compile_definitions(ENABLE_MODULE_SCHNORRSIG=1)
86-
endif()
87-
88-
if(SECP256K1_ENABLE_MODULE_EXTRAKEYS)
89-
add_compile_definitions(ENABLE_MODULE_EXTRAKEYS=1)
90-
endif()
91-
92-
if(SECP256K1_ENABLE_MODULE_RECOVERY)
93-
add_compile_definitions(ENABLE_MODULE_RECOVERY=1)
94-
endif()
95-
96-
if(SECP256K1_ENABLE_MODULE_ECDH)
97-
add_compile_definitions(ENABLE_MODULE_ECDH=1)
98-
endif()
99-
10055
option(SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS "Enable external default callback functions." OFF)
10156
if(SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS)
10257
add_compile_definitions(USE_EXTERNAL_DEFAULT_CALLBACKS=1)

CMakePresets.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
{
2-
"cmakeMinimumRequired": {"major": 3, "minor": 21, "patch": 0},
32
"version": 3,
43
"configurePresets": [
54
{

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,8 @@ Building with Autotools
108108
109109
To compile optional modules (such as Schnorr signatures), you need to run `./configure` with additional flags (such as `--enable-module-schnorrsig`). Run `./configure --help` to see the full list of available flags.
110110
111-
Building with CMake (experimental)
112-
----------------------------------
111+
Building with CMake
112+
-------------------
113113
114114
To maintain a pristine source tree, CMake encourages to perform an out-of-source build by using a separate dedicated build tree.
115115
@@ -151,8 +151,9 @@ Usage examples can be found in the [examples](examples) directory. To compile th
151151
* [Schnorr signatures example](examples/schnorr.c)
152152
* [Deriving a shared secret (ECDH) example](examples/ecdh.c)
153153
* [ElligatorSwift key exchange example](examples/ellswift.c)
154+
* [MuSig2 Schnorr multi-signatures example](examples/musig.c)
154155
155-
To compile the Schnorr signature and ECDH examples, you also need to configure with `--enable-module-schnorrsig` and `--enable-module-ecdh`.
156+
To compile the examples, make sure the corresponding modules are enabled.
156157
157158
Benchmark
158159
------------

ci/linux-debian.Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
4040
apt-get clean && rm -rf /var/lib/apt/lists/*
4141

4242
# Build and install gcc snapshot
43-
ARG GCC_SNAPSHOT_MAJOR=15
43+
ARG GCC_SNAPSHOT_MAJOR=16
4444
RUN apt-get update && apt-get install --no-install-recommends -y wget libgmp-dev libmpfr-dev libmpc-dev flex && \
4545
mkdir gcc && cd gcc && \
4646
wget --progress=dot:giga --https-only --recursive --accept '*.tar.xz' --level 1 --no-directories "https://gcc.gnu.org/pub/gcc/snapshots/LATEST-${GCC_SNAPSHOT_MAJOR}" && \

cmake/GeneratePkgConfigFile.cmake

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
function(generate_pkg_config_file in_file)
2-
set(prefix ${CMAKE_INSTALL_PREFIX})
2+
set(prefix "@CMAKE_INSTALL_PREFIX@")
33
set(exec_prefix \${prefix})
44
set(libdir \${exec_prefix}/${CMAKE_INSTALL_LIBDIR})
55
set(includedir \${prefix}/${CMAKE_INSTALL_INCLUDEDIR})
66
set(PACKAGE_VERSION ${PROJECT_VERSION})
7-
configure_file(${in_file} ${PROJECT_NAME}.pc @ONLY)
7+
configure_file(${in_file} ${PROJECT_NAME}.pc.in @ONLY)
8+
install(CODE "configure_file(
9+
\"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc.in\"
10+
\"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc\"
11+
@ONLY)" ALL_COMPONENTS)
812
endfunction()

include/secp256k1.h

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,15 +152,37 @@ typedef int (*secp256k1_nonce_function)(
152152
# endif
153153
#endif
154154
#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
155+
# if defined(__GNUC__) && (__GNUC__ == 4) && defined(SECP256K1_BUILD)
156+
/* Building libsecp256k1 using GCC or compatible on non-Windows. */
157+
# if defined(SECP256K1_FORCE_HIDDEN_VISIBILITY)
158+
/* Hidden visibility is requested explicitly.
159+
*
160+
* Forcing hidden visibility can be useful, e.g., when building a static
161+
* library which is linked into a shared library, and the latter should not
162+
* reexport the libsecp256k1 API. Since this will create an unusable shared
163+
* library, SECP256K1_FORCE_HIDDEN_VISIBILITY should only be used when
164+
* building a static library. (You want to ./configure with --disable-shared
165+
* if using Autotools.)
166+
*
167+
* While visibility is a concept that applies only to shared libraries,
168+
* setting visibility will still make a difference when building a static
169+
* library: the visibility settings will be stored in the static library,
170+
* solely for the potential case that the static library will be linked into
171+
* a shared library. In that case, the stored visibility settings will
172+
* resurface and be honored for the shared library. */
173+
# define SECP256K1_API extern __attribute__ ((visibility("hidden")))
174+
# else
175+
/* Set default visibility explicit. This is to not break the build for users
176+
* who pass `-fvisibility=hidden` in the expection that this is a
177+
* visibility-aware library. */
178+
# define SECP256K1_API extern __attribute__ ((visibility("default")))
179+
# endif
162180
# endif
163181
#endif
182+
#ifndef SECP256K1_API
183+
/* Fall back to standard C's extern. */
184+
# define SECP256K1_API extern
185+
#endif
164186

165187
/* Warning attributes
166188
* NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out

src/CMakeLists.txt

Lines changed: 69 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,49 @@
1-
# Must be included before CMAKE_INSTALL_INCLUDEDIR is used.
2-
include(GNUInstallDirs)
1+
add_library(secp256k1)
2+
3+
set_property(TARGET secp256k1 PROPERTY PUBLIC_HEADER
4+
${PROJECT_SOURCE_DIR}/include/secp256k1.h
5+
${PROJECT_SOURCE_DIR}/include/secp256k1_preallocated.h
6+
)
7+
8+
# Processing must be done in a topological sorting of the dependency graph
9+
# (dependent module first).
10+
if(SECP256K1_ENABLE_MODULE_ELLSWIFT)
11+
add_compile_definitions(ENABLE_MODULE_ELLSWIFT=1)
12+
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_ellswift.h)
13+
endif()
14+
15+
if(SECP256K1_ENABLE_MODULE_MUSIG)
16+
if(DEFINED SECP256K1_ENABLE_MODULE_SCHNORRSIG AND NOT SECP256K1_ENABLE_MODULE_SCHNORRSIG)
17+
message(FATAL_ERROR "Module dependency error: You have disabled the schnorrsig module explicitly, but it is required by the musig module.")
18+
endif()
19+
set(SECP256K1_ENABLE_MODULE_SCHNORRSIG ON)
20+
add_compile_definitions(ENABLE_MODULE_MUSIG=1)
21+
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_musig.h)
22+
endif()
23+
24+
if(SECP256K1_ENABLE_MODULE_SCHNORRSIG)
25+
if(DEFINED SECP256K1_ENABLE_MODULE_EXTRAKEYS AND NOT SECP256K1_ENABLE_MODULE_EXTRAKEYS)
26+
message(FATAL_ERROR "Module dependency error: You have disabled the extrakeys module explicitly, but it is required by the schnorrsig module.")
27+
endif()
28+
set(SECP256K1_ENABLE_MODULE_EXTRAKEYS ON)
29+
add_compile_definitions(ENABLE_MODULE_SCHNORRSIG=1)
30+
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_schnorrsig.h)
31+
endif()
32+
33+
if(SECP256K1_ENABLE_MODULE_EXTRAKEYS)
34+
add_compile_definitions(ENABLE_MODULE_EXTRAKEYS=1)
35+
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_extrakeys.h)
36+
endif()
37+
38+
if(SECP256K1_ENABLE_MODULE_RECOVERY)
39+
add_compile_definitions(ENABLE_MODULE_RECOVERY=1)
40+
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_recovery.h)
41+
endif()
42+
43+
if(SECP256K1_ENABLE_MODULE_ECDH)
44+
add_compile_definitions(ENABLE_MODULE_ECDH=1)
45+
set_property(TARGET secp256k1 APPEND PROPERTY PUBLIC_HEADER ${PROJECT_SOURCE_DIR}/include/secp256k1_ecdh.h)
46+
endif()
347

448
add_library(secp256k1_precomputed OBJECT EXCLUDE_FROM_ALL
549
precomputed_ecmult.c
@@ -8,7 +52,12 @@ add_library(secp256k1_precomputed OBJECT EXCLUDE_FROM_ALL
852

953
# Add objects explicitly rather than linking to the object libs to keep them
1054
# from being exported.
11-
add_library(secp256k1 secp256k1.c $<TARGET_OBJECTS:secp256k1_precomputed>)
55+
target_sources(secp256k1 PRIVATE secp256k1.c $<TARGET_OBJECTS:secp256k1_precomputed>)
56+
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>)
1261

1362
add_library(secp256k1_asm INTERFACE)
1463
if(SECP256K1_ASM STREQUAL "arm32")
@@ -17,6 +66,7 @@ if(SECP256K1_ASM STREQUAL "arm32")
1766
asm/field_10x26_arm.s
1867
)
1968
target_sources(secp256k1 PRIVATE $<TARGET_OBJECTS:secp256k1_asm_arm>)
69+
target_sources(secp256k1_objs INTERFACE $<TARGET_OBJECTS:secp256k1_asm_arm>)
2070
target_link_libraries(secp256k1_asm INTERFACE secp256k1_asm_arm)
2171
endif()
2272

@@ -31,10 +81,12 @@ endif()
3181
get_target_property(use_pic secp256k1 POSITION_INDEPENDENT_CODE)
3282
set_target_properties(secp256k1_precomputed PROPERTIES POSITION_INDEPENDENT_CODE ${use_pic})
3383

84+
# Add the include path for parent projects so that they don't have to manually add it.
3485
target_include_directories(secp256k1 INTERFACE
35-
# Add the include path for parent projects so that they don't have to manually add it.
3686
$<BUILD_INTERFACE:$<$<NOT:$<BOOL:${PROJECT_IS_TOP_LEVEL}>>:${PROJECT_SOURCE_DIR}/include>>
37-
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
87+
)
88+
set_target_properties(secp256k1_objs PROPERTIES
89+
INTERFACE_INCLUDE_DIRECTORIES "$<TARGET_PROPERTY:secp256k1,INTERFACE_INCLUDE_DIRECTORIES>"
3890
)
3991

4092
# This emulates Libtool to make sure Libtool and CMake agree on the ABI version,
@@ -43,25 +95,17 @@ math(EXPR ${PROJECT_NAME}_soversion "${${PROJECT_NAME}_LIB_VERSION_CURRENT} - ${
4395
set_target_properties(secp256k1 PROPERTIES
4496
SOVERSION ${${PROJECT_NAME}_soversion}
4597
)
46-
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
98+
if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|FreeBSD)$")
4799
set_target_properties(secp256k1 PROPERTIES
48100
VERSION ${${PROJECT_NAME}_soversion}.${${PROJECT_NAME}_LIB_VERSION_AGE}.${${PROJECT_NAME}_LIB_VERSION_REVISION}
49101
)
50102
elseif(APPLE)
51-
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.17)
52-
math(EXPR ${PROJECT_NAME}_compatibility_version "${${PROJECT_NAME}_LIB_VERSION_CURRENT} + 1")
53-
set_target_properties(secp256k1 PROPERTIES
54-
MACHO_COMPATIBILITY_VERSION ${${PROJECT_NAME}_compatibility_version}
55-
MACHO_CURRENT_VERSION ${${PROJECT_NAME}_compatibility_version}.${${PROJECT_NAME}_LIB_VERSION_REVISION}
56-
)
57-
unset(${PROJECT_NAME}_compatibility_version)
58-
elseif(BUILD_SHARED_LIBS)
59-
message(WARNING
60-
"The 'compatibility version' and 'current version' values of the DYLIB "
61-
"will diverge from the values set by the GNU Libtool. To ensure "
62-
"compatibility, it is recommended to upgrade CMake to at least version 3.17."
63-
)
64-
endif()
103+
math(EXPR ${PROJECT_NAME}_compatibility_version "${${PROJECT_NAME}_LIB_VERSION_CURRENT} + 1")
104+
set_target_properties(secp256k1 PROPERTIES
105+
MACHO_COMPATIBILITY_VERSION ${${PROJECT_NAME}_compatibility_version}
106+
MACHO_CURRENT_VERSION ${${PROJECT_NAME}_compatibility_version}.${${PROJECT_NAME}_LIB_VERSION_REVISION}
107+
)
108+
unset(${PROJECT_NAME}_compatibility_version)
65109
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
66110
set(${PROJECT_NAME}_windows "secp256k1")
67111
if(MSVC)
@@ -110,36 +154,16 @@ if(SECP256K1_BUILD_CTIME_TESTS)
110154
endif()
111155

112156
if(SECP256K1_INSTALL)
157+
include(GNUInstallDirs)
158+
target_include_directories(secp256k1 INTERFACE
159+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
160+
)
113161
install(TARGETS secp256k1
114162
EXPORT ${PROJECT_NAME}-targets
115163
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
116164
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
117165
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
118-
)
119-
set(${PROJECT_NAME}_headers
120-
"${PROJECT_SOURCE_DIR}/include/secp256k1.h"
121-
"${PROJECT_SOURCE_DIR}/include/secp256k1_preallocated.h"
122-
)
123-
if(SECP256K1_ENABLE_MODULE_ECDH)
124-
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_ecdh.h")
125-
endif()
126-
if(SECP256K1_ENABLE_MODULE_RECOVERY)
127-
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_recovery.h")
128-
endif()
129-
if(SECP256K1_ENABLE_MODULE_EXTRAKEYS)
130-
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_extrakeys.h")
131-
endif()
132-
if(SECP256K1_ENABLE_MODULE_SCHNORRSIG)
133-
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_schnorrsig.h")
134-
endif()
135-
if(SECP256K1_ENABLE_MODULE_MUSIG)
136-
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_musig.h")
137-
endif()
138-
if(SECP256K1_ENABLE_MODULE_ELLSWIFT)
139-
list(APPEND ${PROJECT_NAME}_headers "${PROJECT_SOURCE_DIR}/include/secp256k1_ellswift.h")
140-
endif()
141-
install(FILES ${${PROJECT_NAME}_headers}
142-
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
166+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
143167
)
144168

145169
install(EXPORT ${PROJECT_NAME}-targets

0 commit comments

Comments
 (0)