Skip to content

Commit 0196343

Browse files
Repin-DaniilGazizonoki
authored andcommitted
Set up CPM package fetching (draft)
1 parent 757a1ab commit 0196343

13 files changed

+431
-5
lines changed

CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ option(YDB_SDK_TESTS "Build YDB C++ SDK tests" Off)
1212
option(YDB_SDK_EXAMPLES "Build YDB C++ SDK examples" On)
1313
set(YDB_SDK_GOOGLE_COMMON_PROTOS_TARGET "" CACHE STRING "Name of cmake target preparing google common proto library")
1414
option(YDB_SDK_USE_RAPID_JSON "Search for rapid json library in system" ON)
15+
option(YDB_SDK_DOWNLOAD_PACKAGES "Download with CPM if there is no system-provided libraries" ON) # todo изменить сообщение
16+
option(YDB_SDK_FORCE_DOWNLOAD_PACKAGES "Download all possible third party packages even if a system package is available" ON)
1517

1618
set(BUILD_SHARED_LIBS Off)
1719
set(CMAKE_CXX_STANDARD 20)
@@ -69,6 +71,11 @@ if (YDB_SDK_TESTS)
6971
add_subdirectory(tests)
7072
endif()
7173

74+
if(CPM_PACKAGES)
75+
include(DownloadUsingCPM)
76+
_ydb_sdk_print_cpm_packages()
77+
endif()
78+
7279
if (YDB_SDK_INSTALL)
7380
_ydb_sdk_install_headers(${CMAKE_INSTALL_INCLUDEDIR})
7481
install(EXPORT ydb-cpp-sdk-targets

cmake/CPM.cmake

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# SPDX-License-Identifier: MIT
2+
#
3+
# SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors
4+
5+
set(CPM_DOWNLOAD_VERSION 0.42.0)
6+
set(CPM_HASH_SUM "2020b4fc42dba44817983e06342e682ecfc3d2f484a581f11cc5731fbe4dce8a")
7+
8+
if(CPM_SOURCE_CACHE)
9+
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
10+
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
11+
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
12+
else()
13+
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
14+
endif()
15+
16+
# Expand relative path. This is important if the provided path contains a tilde (~)
17+
get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE)
18+
19+
file(DOWNLOAD
20+
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
21+
${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM}
22+
)
23+
24+
include(${CPM_DOWNLOAD_LOCATION})

cmake/DownloadUsingCPM.cmake

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
include_guard()
2+
3+
if(NOT DEFINED CPM_USE_NAMED_CACHE_DIRECTORIES)
4+
set(CPM_USE_NAMED_CACHE_DIRECTORIES ON)
5+
endif()
6+
7+
# Workaround for https://github.com/cpm-cmake/CPM.cmake/issues/505
8+
if(${CMAKE_VERSION} VERSION_LESS "3.17.0")
9+
include(FetchContent)
10+
endif()
11+
12+
include(cmake/CPM.cmake)
13+
14+
if(NOT COMMAND CPMAddPackage)
15+
message(FATAL_ERROR "Failed to find CPM to download a package. You can turn off "
16+
"YDB_SDK_DOWNLOAD_PACKAGES to avoid automatic downloads."
17+
)
18+
endif()
19+
20+
# If A uses find_package(B), and we install A and B using CPM, then: 1. make sure to call write_package_stub in SetupB
21+
# 2. make sure to call SetupB at the beginning of SetupA
22+
function(write_package_stub PACKAGE_NAME)
23+
file(WRITE "${CMAKE_BINARY_DIR}/package_stubs/${PACKAGE_NAME}Config.cmake" )
24+
endfunction()
25+
26+
function(_list_subdirectories directory result_list)
27+
set(result "${directory}")
28+
get_property(
29+
subdirectories
30+
DIRECTORY "${directory}"
31+
PROPERTY SUBDIRECTORIES
32+
)
33+
foreach(subdirectory IN LISTS subdirectories)
34+
_list_subdirectories("${subdirectory}" partial_result)
35+
list(APPEND result ${partial_result})
36+
endforeach()
37+
set("${result_list}"
38+
${result}
39+
PARENT_SCOPE
40+
)
41+
endfunction()
42+
43+
function(mark_targets_as_system directory)
44+
if(NOT directory OR NOT EXISTS "${directory}")
45+
message(FATAL_ERROR "Trying to mark a non-existent subdirectory '${directory}' as SYSTEM")
46+
endif()
47+
_list_subdirectories("${directory}" subdirectories)
48+
foreach(subdirectory IN LISTS subdirectories)
49+
get_property(
50+
targets
51+
DIRECTORY "${subdirectory}"
52+
PROPERTY BUILDSYSTEM_TARGETS
53+
)
54+
# Disable warnings in public headers
55+
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.25.0")
56+
set_target_properties(${targets} PROPERTIES SYSTEM TRUE)
57+
endif()
58+
# Disable warnings in sources
59+
foreach(target IN LISTS targets)
60+
get_target_property(target_sources "${target}" SOURCES)
61+
get_target_property(target_type "${target}" TYPE)
62+
if(target_sources AND NOT target_type STREQUAL "INTERFACE_LIBRARY")
63+
target_compile_options("${target}" PRIVATE -w)
64+
endif()
65+
endforeach()
66+
endforeach()
67+
endfunction()
68+
69+
function(_ydb_sdk_print_cpm_packages)
70+
message(STATUS "Dependencies from CPM:")
71+
foreach(PACKAGE ${CPM_PACKAGES})
72+
message(STATUS "- ${PACKAGE}")
73+
endforeach()
74+
endfunction()
75+

cmake/dependencies.cmake

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
include(DownloadUsingCPM)
2+
3+
if(NOT "${CMAKE_BINARY_DIR}/${STUB_DIR}" IN_LIST CMAKE_PREFIX_PATH)
4+
set(CMAKE_PREFIX_PATH
5+
"${CMAKE_BINARY_DIR}/${STUB_DIR}" ${CMAKE_PREFIX_PATH}
6+
)
7+
endif()
8+
9+
# todo сделать нормально без этих страшных путей
10+
include(${CMAKE_CURRENT_LIST_DIR}/dependencies/SetupBrotli.cmake)
11+
include(${CMAKE_CURRENT_LIST_DIR}/dependencies/SetupBase64.cmake)
12+
include(${CMAKE_CURRENT_LIST_DIR}/dependencies/SetupAbseil.cmake)
13+
include(${CMAKE_CURRENT_LIST_DIR}/dependencies/SetupJwtCpp.cmake)
14+
include(${CMAKE_CURRENT_LIST_DIR}/dependencies/SetupProtobuf.cmake)
15+
include(${CMAKE_CURRENT_LIST_DIR}/dependencies/SetupGrpc.cmake)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
option(YDB_SDK_DOWNLOAD_PACKAGE_ABSEIL "Download and setup Abseil if no Abseil matching version was found"
2+
${YDB_SDK_DOWNLOAD_PACKAGES}
3+
)
4+
option(YDB_SDK_FORCE_DOWNLOAD_ABSEIL "Download Abseil even if it exists in a system" ${YDB_SDK_DOWNLOAD_PACKAGES})
5+
6+
if(NOT YDB_SDK_FORCE_DOWNLOAD_ABSEIL)
7+
set(ABSL_PROPAGATE_CXX_STD ON)
8+
9+
if(YDB_SDK_DOWNLOAD_PACKAGE_ABSEIL)
10+
find_package(absl QUIET)
11+
else()
12+
find_package(absl REQUIRED)
13+
endif()
14+
15+
if(absl_FOUND)
16+
return()
17+
endif()
18+
endif()
19+
20+
include(DownloadUsingCPM)
21+
22+
cpmaddpackage(
23+
NAME
24+
abseil-cpp
25+
VERSION
26+
20230802.0
27+
GIT_TAG
28+
20230802.0
29+
GITHUB_REPOSITORY
30+
abseil/abseil-cpp
31+
OPTIONS
32+
"ABSL_PROPAGATE_CXX_STD ON"
33+
"ABSL_ENABLE_INSTALL ON"
34+
)
35+
36+
mark_targets_as_system("${abseil-cpp_SOURCE_DIR}")
37+
write_package_stub(absl)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
option(YDB_SDK_DOWNLOAD_PACKAGE_BASE64 "Download and setup Base64 if no Base64 of matching version was found"
2+
${YDB_SDK_DOWNLOAD_PACKAGES}
3+
)
4+
5+
set(YDB_SDK_BASE64_VERSION 0.5.2)
6+
7+
if(NOT YDB_SDK_FORCE_DOWNLOAD_PACKAGES)
8+
if(YDB_SDK_DOWNLOAD_PACKAGE_BASE64)
9+
find_package(base64 QUIET)
10+
else()
11+
find_package(base64 REQUIRED)
12+
endif()
13+
14+
if(base64_FOUND)
15+
return()
16+
endif()
17+
endif()
18+
19+
include(DownloadUsingCPM)
20+
cpmaddpackage(
21+
NAME base64
22+
VERSION ${YDB_SDK_BASE64_VERSION}
23+
GITHUB_REPOSITORY
24+
aklomp/base64
25+
OPTIONS
26+
"CMAKE_SKIP_INSTALL_RULES ON"
27+
)
28+
write_package_stub(base64)
29+
add_library(aklomp::base64 ALIAS base64)
30+
set(base64_FOUND TRUE)
31+
32+
33+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
option(YDB_SDK_DOWNLOAD_PACKAGE_BROTLI "Download and setup Brotli if no Brotli of matching version was found"
2+
${YDB_SDK_DOWNLOAD_PACKAGES}
3+
)
4+
5+
set(YDB_SDK_BROTLI_VERSION 1.1.0)
6+
7+
if(NOT YDB_SDK_FORCE_DOWNLOAD_PACKAGES)
8+
if(YDB_SDK_DOWNLOAD_PACKAGE_BROTLI)
9+
find_package(Brotli ${YDB_SDK_BROTLI_VERSION} QUIET)
10+
else()
11+
find_package(Brotli ${YDB_SDK_BROTLI_VERSION} REQUIRED)
12+
endif()
13+
14+
if(Brotli_FOUND)
15+
return()
16+
endif()
17+
endif()
18+
19+
include(DownloadUsingCPM)
20+
cpmaddpackage(
21+
NAME
22+
Brotli
23+
VERSION
24+
${YDB_SDK_BROTLI_VERSION}
25+
GITHUB_REPOSITORY
26+
google/brotli
27+
OPTIONS
28+
"BROTLI_DISABLE_TESTS TRUE"
29+
"BUILD_SHARED_LIBS OFF"
30+
)
31+
32+
set(Brotli_FOUND TRUE)
33+
set(Brotli_VERSION ${YDB_SDK_BROTLI_VERSION})
34+
add_custom_target(Brotli)
35+
write_package_stub(Brotli)
36+
37+
if(NOT TARGET Brotli::dec)
38+
add_library(Brotli::dec ALIAS brotlidec)
39+
endif()
40+
if(NOT TARGET Brotli::enc)
41+
add_library(Brotli::enc ALIAS brotlienc)
42+
endif()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# возможно нужен для grpc

cmake/dependencies/SetupGrpc.cmake

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
cmake_policy(SET CMP0079 NEW)
2+
3+
option(YDB_SDK_DOWNLOAD_PACKAGE_GRPC "Download and setup gRPC" ${YDB_SDK_DOWNLOAD_PACKAGES})
4+
option(YDB_SDK_FORCE_DOWNLOAD_GRPC "Download gRPC even if there is an installed system package"
5+
${YDB_SDK_FORCE_DOWNLOAD_PACKAGES}
6+
)
7+
8+
set(YDB_SDK_GRPC_VERSION 1.54.3)
9+
10+
macro(try_find_cmake_grpc)
11+
find_package(gRPC QUIET CONFIG)
12+
if(NOT gRPC_FOUND)
13+
find_package(gRPC QUIET)
14+
endif()
15+
16+
if(gRPC_FOUND)
17+
# Use the found CMake-enabled gRPC package
18+
get_target_property(PROTO_GRPC_CPP_PLUGIN gRPC::grpc_cpp_plugin LOCATION)
19+
endif()
20+
endmacro()
21+
22+
macro(try_find_system_grpc)
23+
# Find the system gRPC package
24+
set(GRPC_USE_SYSTEM_PACKAGE
25+
ON
26+
CACHE INTERNAL ""
27+
)
28+
29+
if(YDB_SDK_DOWNLOAD_PACKAGE_GRPC)
30+
find_package(YdbSdkGrpc QUIET)
31+
else()
32+
find_package(YdbSdkGrpc REQUIRED)
33+
endif()
34+
35+
if(YdbSdkGrpc_FOUND)
36+
set(gRPC_VERSION
37+
"${YdbSdkGrpc_VERSION}"
38+
CACHE INTERNAL ""
39+
)
40+
41+
if(NOT TARGET gRPC::grpc++)
42+
add_library(gRPC::grpc++ ALIAS YdbSdkGrpc)
43+
endif()
44+
45+
find_program(PROTO_GRPC_CPP_PLUGIN grpc_cpp_plugin)
46+
find_program(PROTO_GRPC_PYTHON_PLUGIN grpc_python_plugin)
47+
endif()
48+
endmacro()
49+
50+
if(NOT YDB_SDK_FORCE_DOWNLOAD_GRPC)
51+
try_find_cmake_grpc()
52+
if(gRPC_FOUND)
53+
return()
54+
endif()
55+
56+
try_find_system_grpc()
57+
if(YdbSdkGrpc_FOUND)
58+
return()
59+
endif()
60+
endif()
61+
62+
63+
# include(${CMAKE_CURRENT_LIST_DIR}/SetupAbseil.cmake)
64+
# include(${CMAKE_CURRENT_LIST_DIR}/SetupCAres.cmake)
65+
# include(${CMAKE_CURRENT_LIST_DIR}/SetupProtobuf.cmake)
66+
include(DownloadUsingCPM)
67+
68+
set(YDB_SDK_GPRC_BUILD_FROM_SOURCE ON)
69+
70+
cpmaddpackage(
71+
NAME gRPC
72+
VERSION ${YDB_SDK_GRPC_VERSION}
73+
GITHUB_REPOSITORY
74+
grpc/grpc
75+
OPTIONS
76+
"BUILD_SHARED_LIBS OFF"
77+
"CARES_BUILD_TOOLS OFF"
78+
"RE2_BUILD_TESTING OFF"
79+
"OPENSSL_NO_ASM ON"
80+
"gRPC_BUILD_TESTS OFF"
81+
"gRPC_BUILD_GRPC_NODE_PLUGIN OFF"
82+
"gRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN OFF"
83+
"gRPC_BUILD_GRPC_PHP_PLUGIN OFF"
84+
"gRPC_BUILD_GRPC_RUBY_PLUGIN OFF"
85+
"gRPC_BUILD_GRPC_CSHARP_PLUGIN OFF"
86+
"gRPC_ZLIB_PROVIDER package"
87+
"gRPC_CARES_PROVIDER package"
88+
"gRPC_RE2_PROVIDER package"
89+
"gRPC_SSL_PROVIDER package"
90+
"gRPC_PROTOBUF_PROVIDER package"
91+
"gRPC_BENCHMARK_PROVIDER none"
92+
"gRPC_ABSL_PROVIDER package"
93+
"gRPC_CARES_LIBRARIES c-ares::cares"
94+
"gRPC_INSTALL OFF"
95+
"gRPC_BUILD_GRPC_PYTHON_PLUGIN OFF"
96+
)
97+
98+
set(gRPC_VERSION "${YDB_SDK_GRPC_VERSION}")
99+
set(PROTO_GRPC_CPP_PLUGIN $<TARGET_FILE:grpc_cpp_plugin>)
100+
101+
write_package_stub(gRPC)
102+
if(NOT TARGET "gRPC::grpc++")
103+
add_library(gRPC::grpc++ ALIAS grpc++)
104+
endif()
105+
if(NOT TARGET "gRPC::grpc_cpp_plugin")
106+
add_executable(gRPC::grpc_cpp_plugin ALIAS grpc_cpp_plugin)
107+
endif()
108+
if(NOT TARGET "gRPC::grpcpp_channelz")
109+
add_library(gRPC::grpcpp_channelz ALIAS grpcpp_channelz)
110+
endif()
111+
mark_targets_as_system("${gRPC_SOURCE_DIR}")

0 commit comments

Comments
 (0)