Skip to content

Commit 8965fe4

Browse files
authored
Added cmake install command (ydb-platform#254)
1 parent cc17eb0 commit 8965fe4

File tree

314 files changed

+1705
-2515
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

314 files changed

+1705
-2515
lines changed

.github/actions/build/action.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ runs:
99
run: |
1010
mkdir -p ../build
1111
rm -rf ../build/*
12-
cmake --preset release
12+
cmake -DYDB_SDK_TESTS=On -DYDB_SDK_EXAMPLES=On --preset release
1313
- name: Build
1414
shell: bash
1515
run: |

CMakeLists.txt

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,82 @@
11
cmake_minimum_required(VERSION 3.15)
22
project(YDB-CPP-SDK LANGUAGES C CXX ASM)
33

4+
option(YDB_SDK_INSTALL "Install YDB C++ SDK" Off)
5+
option(YDB_SDK_TESTS "Build YDB C++ SDK tests" Off)
6+
option(YDB_SDK_EXAMPLES "Build YDB C++ SDK examples" On)
7+
set(YDB_SDK_GOOGLE_COMMON_PROTOS_TARGET "" CACHE STRING "Name of cmake target preparing google common proto library")
8+
option(YDB_SDK_USE_RAPID_JSON "Search for rapid json library in system" ON)
9+
410
set(BUILD_SHARED_LIBS Off)
511
set(CMAKE_CXX_STANDARD 20)
612
set(CMAKE_CXX_STANDARD_REQUIRED On)
713
set(CMAKE_CXX_EXTENSIONS On)
814

915
set(YDB_SDK_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
1016
set(YDB_SDK_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
17+
set(YDB-CPP-SDK_AVAILABLE_COMPONENTS "" CACHE INTERNAL "")
18+
set(YDB-CPP-SDK_COMPONENT_TARGETS "" CACHE INTERNAL "")
1119

12-
list(APPEND CMAKE_MODULE_PATH ${YDB_SDK_BINARY_DIR} ${YDB_SDK_SOURCE_DIR}/cmake)
20+
list(APPEND CMAKE_MODULE_PATH ${YDB_SDK_SOURCE_DIR}/cmake)
1321
include_directories(${YDB_SDK_SOURCE_DIR} ${YDB_SDK_SOURCE_DIR}/include ${YDB_SDK_BINARY_DIR})
14-
enable_testing()
1522

23+
if (YDB_SDK_INSTALL)
24+
include(GNUInstallDirs)
25+
include(CMakePackageConfigHelpers)
26+
endif()
27+
28+
include(cmake/global_flags.cmake)
29+
include(cmake/global_vars.cmake)
30+
include(cmake/install.cmake)
1631
include(cmake/common.cmake)
1732
include(cmake/ccache.cmake)
18-
include(cmake/global_flags.cmake)
1933
include(cmake/protobuf.cmake)
20-
include(cmake/global_vars.cmake)
21-
include(cmake/external_libs.cmake)
2234
include(cmake/testing.cmake)
35+
include(cmake/external_libs.cmake)
2336

2437
add_subdirectory(tools)
2538
add_subdirectory(contrib)
2639
add_subdirectory(src)
27-
add_subdirectory(examples)
28-
add_subdirectory(tests)
40+
41+
if (YDB_SDK_EXAMPLES)
42+
add_subdirectory(examples)
43+
endif()
44+
45+
if (YDB_SDK_TESTS)
46+
enable_testing()
47+
add_subdirectory(tests)
48+
endif()
49+
50+
if (${YDB_SDK_INSTALL})
51+
_ydb_sdk_directory_install(DIRECTORY ${YDB_SDK_SOURCE_DIR}/include/ydb-cpp-sdk
52+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
53+
)
54+
_ydb_sdk_directory_install(DIRECTORY ${YDB_SDK_BINARY_DIR}/ydb-cpp-sdk
55+
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
56+
PATTERN "*.h"
57+
)
58+
install(EXPORT ydb-cpp-sdk-targets
59+
FILE ydb-cpp-sdk-targets.cmake
60+
CONFIGURATIONS RELEASE
61+
NAMESPACE YDB-CPP-SDK::
62+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ydb-cpp-sdk/release
63+
)
64+
configure_package_config_file(
65+
${YDB_SDK_SOURCE_DIR}/cmake/ydb-cpp-sdk-config.cmake.in
66+
${CMAKE_CURRENT_BINARY_DIR}/ydb-cpp-sdk-config.cmake
67+
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ydb-cpp-sdk
68+
)
69+
_ydb_sdk_directory_install(FILES
70+
${CMAKE_CURRENT_BINARY_DIR}/ydb-cpp-sdk-config.cmake
71+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ydb-cpp-sdk
72+
)
73+
_ydb_sdk_directory_install(FILES
74+
${YDB_SDK_SOURCE_DIR}/cmake/FindBrotli.cmake
75+
${YDB_SDK_SOURCE_DIR}/cmake/FindgRPC.cmake
76+
${YDB_SDK_SOURCE_DIR}/cmake/FindIDN.cmake
77+
${YDB_SDK_SOURCE_DIR}/cmake/FindLZ4.cmake
78+
${YDB_SDK_SOURCE_DIR}/cmake/FindxxHash.cmake
79+
${YDB_SDK_SOURCE_DIR}/cmake/FindZSTD.cmake
80+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/ydb-cpp-sdk/Modules
81+
)
82+
endif()

cmake/common.cmake

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -114,28 +114,15 @@ function(generate_enum_serilization Tgt Input)
114114
target_sources(${Tgt} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${BaseName}_serialized.cpp)
115115
endfunction()
116116

117-
118-
if (MSVC AND (${CMAKE_VERSION} VERSION_LESS "3.21.0"))
119-
message(FATAL_ERROR "Build with MSVC-compatible toolchain requires at least cmake 3.21.0 because of used TARGET_OBJECTS feature")
120-
endif()
121-
122117
function(add_global_library_for TgtName MainName)
123-
if (MSVC)
124-
add_library(${TgtName} OBJECT ${ARGN})
125-
add_dependencies(${TgtName} ${MainName}) # needed because object library can use some extra generated files in MainName
126-
target_link_libraries(${MainName} INTERFACE ${TgtName} "$<TARGET_OBJECTS:${TgtName}>")
118+
add_library(${TgtName} STATIC ${ARGN})
119+
if(APPLE)
120+
target_link_options(${MainName} INTERFACE "SHELL:-Wl,-force_load,$<TARGET_FILE:$<INSTALL_INTERFACE:YDB-CPP-SDK::>${TgtName}>")
127121
else()
128-
add_library(${TgtName} STATIC ${ARGN})
129-
add_library(${TgtName}.wholearchive INTERFACE)
130-
add_dependencies(${TgtName}.wholearchive ${TgtName})
131-
add_dependencies(${TgtName} ${MainName})
132-
if(APPLE)
133-
target_link_options(${TgtName}.wholearchive INTERFACE "SHELL:-Wl,-force_load,$<TARGET_FILE:${TgtName}>")
134-
else()
135-
target_link_options(${TgtName}.wholearchive INTERFACE "SHELL:-Wl,--whole-archive $<TARGET_FILE:${TgtName}> -Wl,--no-whole-archive")
136-
endif()
137-
target_link_libraries(${MainName} INTERFACE ${TgtName}.wholearchive)
122+
target_link_options(${MainName} INTERFACE "SHELL:-Wl,--whole-archive $<TARGET_FILE:$<INSTALL_INTERFACE:YDB-CPP-SDK::>${TgtName}> -Wl,--no-whole-archive")
138123
endif()
124+
add_dependencies(${MainName} ${TgtName})
125+
target_link_libraries(${MainName} INTERFACE ${TgtName})
139126
endfunction()
140127

141128
function(vcs_info Tgt)
@@ -184,3 +171,11 @@ function(resources Tgt Output)
184171
DEPENDS ${RESOURCE_ARGS_INPUTS} ${rescompiler_bin}
185172
)
186173
endfunction()
174+
175+
function(_ydb_sdk_make_client_component CmpName Tgt)
176+
add_library(YDB-CPP-SDK::${CmpName} ALIAS ${Tgt})
177+
178+
_ydb_sdk_install_targets(TARGETS ${Tgt} ${ARGN})
179+
set(YDB-CPP-SDK_AVAILABLE_COMPONENTS ${YDB-CPP-SDK_AVAILABLE_COMPONENTS} ${CmpName} CACHE INTERNAL "")
180+
set(YDB-CPP-SDK_COMPONENT_TARGETS ${YDB-CPP-SDK_COMPONENT_TARGETS} ${Tgt} CACHE INTERNAL "")
181+
endfunction()

cmake/external_libs.cmake

Lines changed: 27 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
set(YDB_SDK_GOOGLE_COMMON_PROTOS_TARGET "" CACHE STRING "Name of cmake target preparing google common proto library")
2-
option(YDB_SDK_USE_RAPID_JSON "" ON)
3-
option(YDB_SDK_GRPC_CONFIG_SEARCH "" OFF)
4-
51
find_package(IDN REQUIRED)
62
find_package(Iconv REQUIRED)
73
find_package(OpenSSL REQUIRED)
@@ -28,68 +24,50 @@ if (YDB_SDK_USE_RAPID_JSON)
2824
target_include_directories(RapidJSON::RapidJSON INTERFACE
2925
${RAPIDJSON_INCLUDE_DIRS}
3026
)
31-
endif ()
27+
endif()
3228

3329
# api-common-protos
3430
if (YDB_SDK_GOOGLE_COMMON_PROTOS_TARGET)
3531
add_library(api-common-protos ALIAS ${YDB_SDK_GOOGLE_COMMON_PROTOS_TARGET})
36-
else ()
37-
add_library(api-common-protos)
38-
39-
set_property(TARGET api-common-protos PROPERTY
40-
PROTOC_EXTRA_OUTS .grpc.pb.cc .grpc.pb.h
32+
else()
33+
file(GLOB_RECURSE API_COMMON_PROTOS_SOURCES
34+
${YDB_SDK_SOURCE_DIR}/third_party/api-common-protos/google/*.proto
4135
)
4236

37+
_ydb_sdk_init_proto_library_impl(api-common-protos Off)
38+
4339
set_property(TARGET api-common-protos PROPERTY
4440
PROTO_NAMESPACE third_party/api-common-protos
4541
)
4642

47-
target_include_directories(api-common-protos PUBLIC
48-
${YDB_SDK_BINARY_DIR}/third_party/api-common-protos
49-
)
50-
51-
target_link_libraries(api-common-protos PUBLIC
52-
gRPC::grpc++
53-
protobuf::libprotobuf
54-
)
55-
56-
file(GLOB_RECURSE SOURCES
57-
${YDB_SDK_SOURCE_DIR}/third_party/api-common-protos/google/*.proto
58-
)
59-
60-
target_proto_messages(api-common-protos PRIVATE
61-
${SOURCES}
43+
set_property(TARGET api-common-protos APPEND PROPERTY
44+
PROTO_ADDINCL
45+
./third_party/api-common-protos
46+
${YDB_SDK_SOURCE_DIR}
6247
)
6348

64-
target_proto_addincls(api-common-protos
65-
./third_party/api-common-protos
66-
${YDB_SDK_BINARY_DIR}
67-
${YDB_SDK_SOURCE_DIR}
68-
${YDB_SDK_SOURCE_DIR}/third_party/api-common-protos
49+
target_include_directories(api-common-protos PUBLIC
50+
$<BUILD_INTERFACE:${YDB_SDK_BINARY_DIR}/third_party/api-common-protos>
6951
)
7052

71-
target_proto_outs(api-common-protos
72-
--cpp_out=${YDB_SDK_BINARY_DIR}/third_party/api-common-protos
73-
)
53+
_ydb_sdk_gen_proto_messages(api-common-protos PRIVATE Off ${API_COMMON_PROTOS_SOURCES})
7454

75-
target_proto_plugin(api-common-protos
76-
grpc_cpp
77-
gRPC::grpc_cpp_plugin
78-
)
79-
endif ()
55+
_ydb_sdk_install_targets(TARGETS api-common-protos)
56+
endif()
8057

8158
# FastLZ
8259
add_library(FastLZ
83-
${YDB_SDK_SOURCE_DIR}/third_party/FastLZ/fastlz.c
60+
${YDB_SDK_SOURCE_DIR}/third_party/FastLZ/fastlz.c
61+
)
62+
63+
target_include_directories(FastLZ PUBLIC
64+
$<BUILD_INTERFACE:${YDB_SDK_SOURCE_DIR}/third_party/FastLZ>
8465
)
8566

86-
target_include_directories(FastLZ PUBLIC ${YDB_SDK_SOURCE_DIR}/third_party/FastLZ)
67+
_ydb_sdk_install_targets(TARGETS FastLZ)
8768

8869
# nayuki_md5
8970
add_library(nayuki_md5)
90-
target_link_libraries(nayuki_md5 PUBLIC
91-
yutil
92-
)
9371

9472
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
9573
target_sources(nayuki_md5 PRIVATE
@@ -101,5 +79,9 @@ target_sources(nayuki_md5 PRIVATE
10179
)
10280
endif()
10381

104-
target_include_directories(nayuki_md5 PUBLIC ${YDB_SDK_SOURCE_DIR}/third_party/nayuki_md5)
105-
82+
target_include_directories(nayuki_md5 PUBLIC
83+
$<BUILD_INTERFACE:${YDB_SDK_SOURCE_DIR}/third_party/nayuki_md5>
84+
$<INSTALL_INTERFACE:third_party/nayuki_md5>
85+
)
86+
87+
_ydb_sdk_install_targets(TARGETS nayuki_md5)

cmake/install.cmake

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
function(_ydb_sdk_install_targets)
2+
if (NOT YDB_SDK_INSTALL)
3+
return()
4+
endif()
5+
set(multiValueArgs TARGETS)
6+
cmake_parse_arguments(
7+
ARG "${option}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}"
8+
)
9+
if (NOT ARG_TARGETS)
10+
message(FATAL_ERROR "No TARGETS given for install")
11+
return()
12+
endif()
13+
foreach (ITEM_TARGET IN LISTS ARG_TARGETS)
14+
if(NOT TARGET ${ITEM_TARGET})
15+
message(FATAL_ERROR "${ITEM_TARGET} is not target. You should use only targets")
16+
return()
17+
endif()
18+
endforeach()
19+
install(TARGETS ${ARG_TARGETS}
20+
EXPORT ydb-cpp-sdk-targets
21+
CONFIGURATIONS RELEASE
22+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
23+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
24+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
25+
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
26+
)
27+
endfunction()
28+
29+
function(_ydb_sdk_directory_install)
30+
if (NOT ${YDB_SDK_INSTALL})
31+
return()
32+
endif()
33+
set(oneValueArgs DESTINATION PATTERN)
34+
set(multiValueArgs FILES DIRECTORY)
35+
cmake_parse_arguments(
36+
ARG "${option}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}"
37+
)
38+
if (NOT ARG_DESTINATION)
39+
message(FATAL_ERROR "No DESTINATION for install")
40+
endif()
41+
if (NOT ARG_FILES AND NOT ARG_DIRECTORY)
42+
message(FATAL_ERROR "No FILES or DIRECTORY provided to install")
43+
endif()
44+
if (ARG_FILES AND ARG_DIRECTORY)
45+
message(FATAL_ERROR "FILES and DIRECTORY are mutually exclusive install arguments")
46+
endif()
47+
if (ARG_FILES)
48+
install(FILES ${ARG_FILES} DESTINATION ${ARG_DESTINATION})
49+
else()
50+
if (DEFINED ARG_PATTERN)
51+
install(DIRECTORY ${ARG_DIRECTORY} DESTINATION ${ARG_DESTINATION} USE_SOURCE_PERMISSIONS FILES_MATCHING PATTERN ${ARG_PATTERN})
52+
else()
53+
install(DIRECTORY ${ARG_DIRECTORY} DESTINATION ${ARG_DESTINATION} USE_SOURCE_PERMISSIONS)
54+
endif()
55+
endif()
56+
endfunction()

0 commit comments

Comments
 (0)