]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | cmake_minimum_required(VERSION 3.1) |
2 | ||
3 | # See https://cmake.org/cmake/help/v3.3/policy/CMP0057.html required by certain | |
4 | # versions of gtest | |
5 | cmake_policy(SET CMP0057 NEW) | |
6 | ||
7 | # See https://cmake.org/cmake/help/v3.12/policy/CMP0074.html required by certain | |
8 | # version of zlib which is dependeded by cURL. | |
9 | if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12") | |
10 | cmake_policy(SET CMP0074 NEW) | |
11 | endif() | |
12 | ||
13 | project(opentelemetry-cpp) | |
14 | ||
15 | # Mark variables as used so cmake doesn't complain about them | |
16 | mark_as_advanced(CMAKE_TOOLCHAIN_FILE) | |
17 | ||
18 | # Don't use customized cmake modules if vcpkg is used to resolve dependence. | |
19 | if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) | |
20 | list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/") | |
21 | endif() | |
22 | ||
23 | if(EXISTS "${CMAKE_SOURCE_DIR}/third_party_release") | |
24 | file(STRINGS "${CMAKE_SOURCE_DIR}/third_party_release" third_party_tags) | |
25 | foreach(third_party ${third_party_tags}) | |
26 | string(REGEX REPLACE "^[ ]+" "" third_party ${third_party}) | |
27 | string(REGEX MATCH "^[^=]+" third_party_name ${third_party}) | |
28 | string(REPLACE "${third_party_name}=" "" third_party_tag ${third_party}) | |
29 | set(${third_party_name} "${third_party_tag}") | |
30 | endforeach() | |
31 | endif() | |
32 | ||
33 | if(DEFINED ENV{ARCH}) | |
34 | # Architecture may be specified via ARCH environment variable | |
35 | set(ARCH $ENV{ARCH}) | |
36 | else() | |
37 | # Autodetection logic that populates ARCH variable | |
38 | if(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*") | |
39 | # Windows may report AMD64 even if target is 32-bit | |
40 | if(CMAKE_SIZEOF_VOID_P EQUAL 8) | |
41 | set(ARCH x64) | |
42 | elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) | |
43 | set(ARCH x86) | |
44 | endif() | |
45 | elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*") | |
46 | # Windows may report x86 even if target is 64-bit | |
47 | if(CMAKE_SIZEOF_VOID_P EQUAL 8) | |
48 | set(ARCH x64) | |
49 | elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) | |
50 | set(ARCH x86) | |
51 | endif() | |
52 | elseif(CMAKE_SYSTEM_PROCESSOR MATCHES | |
53 | "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)") | |
54 | set(ARCH arm64) | |
55 | elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)") | |
56 | set(ARCH arm) | |
57 | elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64le") | |
58 | set(ARCH ppc64le) | |
59 | elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64") | |
60 | set(ARCH ppc64) | |
61 | elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(mips.*|MIPS.*)") | |
62 | set(ARCH mips) | |
63 | elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(riscv.*|RISCV.*)") | |
64 | set(ARCH riscv) | |
65 | elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(s390x.*|S390X.*)") | |
66 | set(ARCH s390x) | |
67 | else() | |
68 | message( | |
69 | FATAL_ERROR | |
70 | "opentelemetry-cpp: unrecognized target processor configuration!") | |
71 | endif() | |
72 | endif() | |
73 | message(STATUS "Building for architecture ARCH=${ARCH}") | |
74 | ||
75 | # Autodetect vcpkg toolchain | |
76 | if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE) | |
77 | set(CMAKE_TOOLCHAIN_FILE | |
78 | "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" | |
79 | CACHE STRING "") | |
80 | endif() | |
81 | ||
82 | if(VCPKG_CHAINLOAD_TOOLCHAIN_FILE) | |
83 | include("${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}") | |
84 | endif() | |
85 | ||
86 | file(READ "${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h" | |
87 | OPENTELEMETRY_CPP_HEADER_VERSION_H) | |
88 | if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES | |
89 | "OPENTELEMETRY_ABI_VERSION_NO[ \t\r\n]+\"?([0-9]+)\"?") | |
90 | math(EXPR OPENTELEMETRY_ABI_VERSION_NO ${CMAKE_MATCH_1}) | |
91 | else() | |
92 | message( | |
93 | FATAL_ERROR | |
94 | "OPENTELEMETRY_ABI_VERSION_NO not found on ${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h" | |
95 | ) | |
96 | endif() | |
97 | if(OPENTELEMETRY_CPP_HEADER_VERSION_H MATCHES | |
98 | "OPENTELEMETRY_VERSION[ \t\r\n]+\"?([^\"]+)\"?") | |
99 | set(OPENTELEMETRY_VERSION ${CMAKE_MATCH_1}) | |
100 | else() | |
101 | message( | |
102 | FATAL_ERROR | |
103 | "OPENTELEMETRY_VERSION not found on ${CMAKE_CURRENT_LIST_DIR}/api/include/opentelemetry/version.h" | |
104 | ) | |
105 | endif() | |
106 | ||
107 | option(WITH_STL "Whether to use Standard Library for C++ latest features" OFF) | |
108 | option(WITH_GSL | |
109 | "Whether to use Guidelines Support Library for C++ latest features" OFF) | |
110 | ||
111 | option(WITH_ABSEIL "Whether to use Abseil for C++latest features" OFF) | |
112 | ||
113 | if(NOT DEFINED CMAKE_CXX_STANDARD) | |
114 | if(WITH_STL) | |
115 | # Require at least C++17. C++20 is needed to avoid gsl::span | |
116 | if(CMAKE_VERSION VERSION_GREATER 3.11.999) | |
117 | # Ask for 20, may get anything below | |
118 | set(CMAKE_CXX_STANDARD 20) | |
119 | else() | |
120 | # Ask for 17, may get anything below | |
121 | set(CMAKE_CXX_STANDARD 17) | |
122 | endif() | |
123 | else() | |
124 | set(CMAKE_CXX_STANDARD 11) | |
125 | endif() | |
126 | endif() | |
127 | ||
128 | if(WITH_STL) | |
129 | # These definitions are needed for test projects that do not link against | |
130 | # opentelemetry-api library directly. We ensure that variant implementation | |
131 | # (absl::variant or std::variant) in variant unit test code is consistent with | |
132 | # the global project build definitions. Optimize for speed to reduce the hops | |
133 | if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") | |
134 | if(CMAKE_BUILD_TYPE MATCHES Debug) | |
135 | # Turn off optimizations for DEBUG | |
136 | set(MSVC_CXX_OPT_FLAG "/Od") | |
137 | else() | |
138 | string(REGEX MATCH "\/O" result ${CMAKE_CXX_FLAGS}) | |
139 | if(NOT ${result} MATCHES "\/O") | |
140 | set(MSVC_CXX_OPT_FLAG "/O2") | |
141 | endif() | |
142 | endif() | |
143 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MSVC_CXX_OPT_FLAG}") | |
144 | endif() | |
145 | endif() | |
146 | ||
147 | option(WITH_OTLP "Whether to include the OpenTelemetry Protocol in the SDK" OFF) | |
148 | option(WITH_ZIPKIN "Whether to include the Zipkin exporter in the SDK" OFF) | |
149 | ||
150 | option(WITH_PROMETHEUS "Whether to include the Prometheus Client in the SDK" | |
151 | OFF) | |
152 | ||
153 | option(WITH_ELASTICSEARCH | |
154 | "Whether to include the Elasticsearch Client in the SDK" OFF) | |
155 | ||
156 | option(WITH_ZPAGES "Whether to include the Zpages Server in the SDK" OFF) | |
157 | ||
158 | option(WITH_JAEGER "Whether to include the Jaeger exporter" OFF) | |
159 | ||
160 | option(WITH_NO_GETENV "Whether the platform supports environment variables" OFF) | |
161 | ||
162 | option(BUILD_TESTING "Whether to enable tests" ON) | |
163 | ||
164 | option(BUILD_W3CTRACECONTEXT_TEST "Whether to build w3c trace context" OFF) | |
165 | ||
166 | if(WIN32) | |
167 | if(BUILD_TESTING) | |
168 | if(MSVC) | |
169 | # GTest bug: https://github.com/google/googletest/issues/860 | |
170 | add_compile_options(/wd4275) | |
171 | endif() | |
172 | endif() | |
173 | option(WITH_ETW "Whether to include the ETW Exporter in the SDK" ON) | |
174 | endif(WIN32) | |
175 | ||
176 | # Do not convert deprecated message to error | |
177 | if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang") | |
178 | add_compile_options(-Wno-error=deprecated-declarations) | |
179 | endif() | |
180 | ||
181 | option( | |
182 | WITH_API_ONLY | |
183 | "Only build the API (use as a header-only library). Overrides WITH_EXAMPLES and all options to enable exporters" | |
184 | OFF) | |
185 | option(WITH_EXAMPLES "Whether to build examples" ON) | |
186 | ||
187 | option(WITH_METRICS_PREVIEW "Whether to build metrics preview" OFF) | |
188 | option(WITH_LOGS_PREVIEW "Whether to build logs preview" OFF) | |
189 | ||
190 | find_package(Threads) | |
191 | ||
192 | function(install_windows_deps) | |
193 | # Bootstrap vcpkg from CMake and auto-install deps in case if we are missing | |
194 | # deps on Windows. Respect the target architecture variable. | |
195 | set(VCPKG_TARGET_ARCHITECTURE | |
196 | ${ARCH} | |
197 | PARENT_SCOPE) | |
198 | message("Installing build tools and dependencies...") | |
199 | set(ENV{ARCH} ${ARCH}) | |
200 | execute_process( | |
201 | COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/setup-buildtools.cmd) | |
202 | set(CMAKE_TOOLCHAIN_FILE | |
203 | ${CMAKE_CURRENT_SOURCE_DIR}/tools/vcpkg/scripts/buildsystems/vcpkg.cmake | |
204 | PARENT_SCOPE) | |
205 | endfunction() | |
206 | ||
207 | if(WITH_JAEGER) | |
208 | find_package(Thrift QUIET) | |
209 | if(Thrift_FOUND) | |
210 | find_package(Boost REQUIRED) | |
211 | include_directories(${Boost_INCLUDE_DIR}) | |
212 | else() | |
213 | # Install Thrift and propagate via vcpkg toolchain file | |
214 | if(WIN32 AND (NOT DEFINED CMAKE_TOOLCHAIN_FILE)) | |
215 | install_windows_deps() | |
216 | endif() | |
217 | endif() | |
218 | endif() | |
219 | ||
220 | if(MSVC) | |
221 | # Options for Visual C++ compiler: /Zc:__cplusplus - report an updated value | |
222 | # for recent C++ language standards. Without this option MSVC returns the | |
223 | # value of __cplusplus="199711L" | |
224 | if(MSVC_VERSION GREATER 1900) | |
225 | # __cplusplus flag is not supported by Visual Studio 2015 | |
226 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zc:__cplusplus") | |
227 | endif() | |
228 | # When using vcpkg, all targets build with the same runtime | |
229 | if(VCPKG_TOOLCHAIN) | |
230 | set(CMAKE_MSVC_RUNTIME_LIBRARY | |
231 | "MultiThreaded$<$<CONFIG:Debug>:Debug>$<$<STREQUAL:${VCPKG_CRT_LINKAGE},dynamic>:DLL>" | |
232 | CACHE STRING "") | |
233 | endif() | |
234 | endif() | |
235 | ||
236 | # include GNUInstallDirs before include cmake/opentelemetry-proto.cmake because | |
237 | # opentelemetry-proto installs targets to the location variables defined in | |
238 | # GNUInstallDirs. | |
239 | include(GNUInstallDirs) | |
240 | ||
241 | if((NOT WITH_API_ONLY) | |
242 | AND (WITH_ELASTICSEARCH | |
243 | OR WITH_ZIPKIN | |
244 | OR WITH_OTLP | |
245 | OR WITH_OTLP_HTTP | |
246 | OR WITH_ZPAGES | |
247 | OR BUILD_W3CTRACECONTEXT_TEST | |
248 | OR WITH_ETW | |
249 | )) | |
250 | # nlohmann_json package is required for most SDK build configurations | |
251 | find_package(nlohmann_json QUIET) | |
252 | set(nlohmann_json_clone FALSE) | |
253 | if(nlohmann_json_FOUND) | |
254 | message("Using external nlohmann::json") | |
255 | elseif(EXISTS ${PROJECT_SOURCE_DIR}/.git | |
256 | AND EXISTS | |
257 | ${PROJECT_SOURCE_DIR}/third_party/nlohmann-json/CMakeLists.txt) | |
258 | message("Trying to use local nlohmann::json from submodule") | |
259 | set(JSON_BuildTests | |
260 | OFF | |
261 | CACHE INTERNAL "") | |
262 | set(JSON_Install | |
263 | ON | |
264 | CACHE INTERNAL "") | |
265 | # This option allows to link nlohmann_json::nlohmann_json target | |
266 | add_subdirectory(${PROJECT_SOURCE_DIR}/third_party/nlohmann-json) | |
267 | # This option allows to add header to include directories | |
268 | include_directories( | |
269 | ${PROJECT_SOURCE_DIR}/third_party/nlohmann-json/single_include) | |
270 | else() | |
271 | set(nlohmann_json_clone TRUE) | |
272 | include(cmake/nlohmann-json.cmake) | |
273 | message("\nnlohmann_json package was not found. Cloning from github") | |
274 | endif() | |
275 | endif() | |
276 | ||
277 | if(WITH_PROMETHEUS) | |
278 | find_package(prometheus-cpp CONFIG QUIET) | |
279 | if(NOT prometheus-cpp_FOUND) | |
280 | message("Trying to use local prometheus-cpp from submodule") | |
281 | if(EXISTS ${PROJECT_SOURCE_DIR}/third_party/prometheus-cpp/.git) | |
282 | set(SAVED_ENABLE_TESTING ${ENABLE_TESTING}) | |
283 | set(ENABLE_TESTING OFF) | |
284 | add_subdirectory(third_party/prometheus-cpp) | |
285 | set(ENABLE_TESTING ${SAVED_ENABLE_TESTING}) | |
286 | else() | |
287 | message( | |
288 | FATAL_ERROR | |
289 | "\nprometheus-cpp package was not found. Please either provide it manually or clone with submodules. " | |
290 | "To initialize, fetch and checkout any nested submodules, you can use the following command:\n" | |
291 | "git submodule update --init --recursive") | |
292 | endif() | |
293 | else() | |
294 | message("Using external prometheus-cpp") | |
295 | endif() | |
296 | endif() | |
297 | ||
298 | if(WITH_OTLP) | |
299 | set(protobuf_MODULE_COMPATIBLE ON) | |
300 | find_package(Protobuf) | |
301 | if(WITH_OTLP_GRPC OR (NOT DEFINED WITH_OTLP_GRPC AND NOT DEFINED | |
302 | CACHE{WITH_OTLP_GRPC})) | |
303 | find_package(gRPC) | |
304 | endif() | |
305 | if((NOT Protobuf_FOUND AND NOT PROTOBUF_FOUND) OR (NOT gRPC_FOUND)) | |
306 | if(WIN32 AND (NOT DEFINED CMAKE_TOOLCHAIN_FILE)) | |
307 | install_windows_deps() | |
308 | endif() | |
309 | ||
310 | if(WIN32 AND (NOT DEFINED CMAKE_TOOLCHAIN_FILE)) | |
311 | message(STATUS_FATAL "Windows dependency installation failed!") | |
312 | endif() | |
313 | if(WIN32) | |
314 | include(${CMAKE_TOOLCHAIN_FILE}) | |
315 | endif() | |
316 | ||
317 | if(NOT Protobuf_FOUND AND NOT PROTOBUF_FOUND) | |
318 | find_package(Protobuf REQUIRED) | |
319 | endif() | |
320 | if(NOT gRPC_FOUND | |
321 | AND (WITH_OTLP_GRPC OR (NOT DEFINED WITH_OTLP_GRPC | |
322 | AND NOT DEFINED CACHE{WITH_OTLP_GRPC}))) | |
323 | find_package(gRPC) | |
324 | endif() | |
325 | if(WIN32) | |
326 | # Always use x64 protoc.exe | |
327 | if(NOT EXISTS "${Protobuf_PROTOC_EXECUTABLE}") | |
328 | set(Protobuf_PROTOC_EXECUTABLE | |
329 | ${CMAKE_CURRENT_SOURCE_DIR}/tools/vcpkg/packages/protobuf_x64-windows/tools/protobuf/protoc.exe | |
330 | ) | |
331 | endif() | |
332 | endif() | |
333 | # Latest Protobuf uses mixed case instead of uppercase | |
334 | if(Protobuf_PROTOC_EXECUTABLE) | |
335 | set(PROTOBUF_PROTOC_EXECUTABLE ${Protobuf_PROTOC_EXECUTABLE}) | |
336 | endif() | |
337 | endif() | |
338 | include(CMakeDependentOption) | |
339 | if(WITH_OTLP_HTTP OR (NOT DEFINED WITH_OTLP_HTTP AND NOT DEFINED | |
340 | CACHE{WITH_OTLP_HTTP})) | |
341 | find_package(CURL) | |
342 | endif() | |
343 | ||
344 | cmake_dependent_option( | |
345 | WITH_OTLP_GRPC "Whether to include the OTLP gRPC exporter in the SDK" ON | |
346 | "gRPC_FOUND" OFF) | |
347 | cmake_dependent_option( | |
348 | WITH_OTLP_HTTP "Whether to include the OTLP http exporter in the SDK" ON | |
349 | "CURL_FOUND" OFF) | |
350 | ||
351 | message(STATUS "PROTOBUF_PROTOC_EXECUTABLE=${PROTOBUF_PROTOC_EXECUTABLE}") | |
352 | include(cmake/opentelemetry-proto.cmake) | |
353 | endif() | |
354 | ||
355 | list(APPEND CMAKE_PREFIX_PATH "${CMAKE_BINARY_DIR}") | |
356 | ||
357 | include(CTest) | |
358 | if(BUILD_TESTING) | |
359 | add_definitions(-DENABLE_TEST) | |
360 | if(EXISTS ${CMAKE_BINARY_DIR}/lib/libgtest.a) | |
361 | # Prefer GTest from build tree. GTest is not always working with | |
362 | # CMAKE_PREFIX_PATH | |
363 | set(GTEST_INCLUDE_DIRS | |
364 | ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googletest/include | |
365 | ${CMAKE_CURRENT_SOURCE_DIR}/third_party/googletest/googlemock/include) | |
366 | set(GTEST_BOTH_LIBRARIES | |
367 | ${CMAKE_BINARY_DIR}/lib/libgtest.a | |
368 | ${CMAKE_BINARY_DIR}/lib/libgtest_main.a | |
369 | ${CMAKE_BINARY_DIR}/lib/libgmock.a) | |
370 | elseif(WIN32) | |
371 | # Make sure we are always bootsrapped with vcpkg on Windows | |
372 | find_package(GTest REQUIRED) | |
373 | if(NOT (GTEST_FOUND OR GTest_FOUND)) | |
374 | install_windows_deps() | |
375 | find_package(GTest REQUIRED) | |
376 | endif() | |
377 | else() | |
378 | # Prefer GTest installed by OS distro, brew or vcpkg package manager | |
379 | find_package(GTest REQUIRED) | |
380 | endif() | |
381 | include_directories(SYSTEM ${GTEST_INCLUDE_DIRS}) | |
382 | message("GTEST_INCLUDE_DIRS = ${GTEST_INCLUDE_DIRS}") | |
383 | message("GTEST_BOTH_LIBRARIES = ${GTEST_BOTH_LIBRARIES}") | |
384 | enable_testing() | |
385 | # Benchmark respects the CMAKE_PREFIX_PATH | |
386 | find_package(benchmark CONFIG REQUIRED) | |
387 | endif() | |
388 | ||
389 | include(CMakePackageConfigHelpers) | |
390 | ||
391 | include_directories(api/include) | |
392 | ||
393 | add_subdirectory(api) | |
394 | ||
395 | if(NOT WITH_API_ONLY) | |
396 | set(BUILD_TESTING ${BUILD_TESTING}) | |
397 | include_directories(sdk/include) | |
398 | include_directories(sdk) | |
399 | include_directories(ext/include) | |
400 | ||
401 | add_subdirectory(sdk) | |
402 | add_subdirectory(ext) | |
403 | add_subdirectory(exporters) | |
404 | if(WITH_EXAMPLES) | |
405 | add_subdirectory(examples) | |
406 | endif() | |
407 | endif() | |
408 | ||
409 | # Export cmake config and support find_packages(opentelemetry-cpp CONFIG) Write | |
410 | # config file for find_packages(opentelemetry-cpp CONFIG) | |
411 | set(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") | |
412 | configure_package_config_file( | |
413 | "${CMAKE_CURRENT_LIST_DIR}/cmake/opentelemetry-cpp-config.cmake.in" | |
414 | "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config.cmake" | |
415 | INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}" | |
416 | PATH_VARS OPENTELEMETRY_ABI_VERSION_NO OPENTELEMETRY_VERSION PROJECT_NAME | |
417 | INCLUDE_INSTALL_DIR CMAKE_INSTALL_LIBDIR | |
418 | NO_CHECK_REQUIRED_COMPONENTS_MACRO) | |
419 | ||
420 | # Write version file for find_packages(opentelemetry-cpp CONFIG) | |
421 | write_basic_package_version_file( | |
422 | "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config-version.cmake" | |
423 | VERSION ${OPENTELEMETRY_VERSION} | |
424 | COMPATIBILITY ExactVersion) | |
425 | ||
426 | install( | |
427 | FILES | |
428 | "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config.cmake" | |
429 | "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-config-version.cmake" | |
430 | DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") | |
431 | ||
432 | # Export all components | |
433 | export( | |
434 | EXPORT "${PROJECT_NAME}-target" | |
435 | NAMESPACE "${PROJECT_NAME}::" | |
436 | FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}/${PROJECT_NAME}-target.cmake" | |
437 | ) | |
438 | install( | |
439 | EXPORT "${PROJECT_NAME}-target" | |
440 | NAMESPACE "${PROJECT_NAME}::" | |
441 | DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") |