Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,18 @@ endif()

project(userver)

option(USERVER_GEN_GDB_DEBUGINFO "Compile with generation of gdb3 debug info format" OFF)

if (USERVER_BUILD_SHARED_LIBS)
set(BUILD_SHARED_LIBS ${USERVER_BUILD_SHARED_LIBS})
endif()

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib/)
set(CMAKE_INSTALL_BINDIR bin/userver)

#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/userver)

set(USERVER_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}")

set(USERVER_NOT_INCLUDED_AS_SUBDIR OFF)
Expand Down Expand Up @@ -64,13 +76,17 @@ option(USERVER_DISABLE_PHDR_CACHE "Disable caching of dl_phdr_info items, which

option(USERVER_CHECK_PACKAGE_VERSIONS "Check package versions" ON)

include(GNUInstallDirs)

include(cmake/SetupEnvironment.cmake)
include(AddGoogleTests)
include(CheckSubmodule)
include(Sanitizers)
include(FindPackageRequired)
include(IncludeWhatYouUse)
include(FindPython)
include(UServerAddLibrary)
include(UServerInstall)

message(STATUS "Generating cmake files ...")
execute_process(
Expand Down Expand Up @@ -170,3 +186,24 @@ endif()
if (USERVER_IS_THE_ROOT_PROJECT)
add_subdirectory(samples)
endif()

set(CMAKE_INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/userver)
set(CMAKE_CONFIG_TARGETS_FILE "userverConfigTargets.cmake")
INSTALL (EXPORT userver-targets
FILE "${CMAKE_CONFIG_TARGETS_FILE}" DESTINATION ${CMAKE_INSTALL_CONFIGDIR})
EXPORT (EXPORT userver-targets
FILE "${CMAKE_INSTALL_CONFIGDIR}/${CMAKE_CONFIG_TARGETS_FILE}")

include(CMakePackageConfigHelpers)
set(CMAKE_VERSION_CONFIG_OUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/userverConfigVersion.cmake")
set(CMAKE_CONFIG_IN_FILE "${CMAKE_CURRENT_LIST_DIR}/cmake/userverConfig.cmake.in")
set(CMAKE_CONFIG_OUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/userverConfig.cmake")
set(CMAKE_CONFIG_TARGETS_FILE "userverConfigTargets.cmake")
configure_package_config_file(
"${CMAKE_CONFIG_IN_FILE}"
"${CMAKE_CONFIG_OUT_FILE}"
INSTALL_DESTINATION "${CMAKE_INSTALL_CONFIGDIR}/")
write_basic_package_version_file("${CMAKE_VERSION_CONFIG_OUT_FILE}"
VERSION "1.0.0"
COMPATIBILITY SameMajorVersion)
install(FILES "${CMAKE_CONFIG_OUT_FILE}" "${CMAKE_VERSION_CONFIG_OUT_FILE}" DESTINATION "${CMAKE_INSTALL_CONFIGDIR}")
12 changes: 9 additions & 3 deletions clickhouse/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ file(GLOB_RECURSE CH_FUNCTIONAL_TEST_SOURCES
)
list(REMOVE_ITEM SOURCES ${CH_FUNCTIONAL_TEST_SOURCES})

add_library(${PROJECT_NAME} STATIC ${SOURCES})
userver_add_library(${PROJECT_NAME} SOURCES ${SOURCES})

if (USERVER_CONAN)
find_package(clickhouse-cpp REQUIRED)
Expand All @@ -32,15 +32,19 @@ else()
target_link_libraries(${PROJECT_NAME} PRIVATE clickhouse-cpp)
endif()

target_link_libraries(${PROJECT_NAME}
userver_target_link_libraries(${PROJECT_NAME}
PUBLIC
userver-core
PRIVATE
clickhouse-cpp
STATIC_PRIVATE
userver-compiler-rt-parts
)
target_include_directories(
${PROJECT_NAME}
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include/userver>
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
)

Expand Down Expand Up @@ -79,3 +83,5 @@ if (USERVER_IS_THE_ROOT_PROJECT)

add_subdirectory(functional_tests)
endif()

userver_install_library(TARGETS ${PROJECT_NAME})
16 changes: 11 additions & 5 deletions cmake/GrpcTargets.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,9 @@ function(generate_grpc_files)

set(did_generate_proto_sources FALSE)
if("${newest_proto_dependency}" IS_NEWER_THAN "${GENERATED_PROTO_DIR}/${path_base}.pb.cc")
# resolve root_path, proto_file to real path's - protoc check that root_path is prefix of proto_file (this can be non true if project inside folder sym linked to other dir)
get_filename_component(real_root_path ${root_path} REALPATH)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few lines above we already do this, so the root_path should be already a real path. Are we missing something?

get_filename_component(real_proto_file ${proto_file} REALPATH)
execute_process(
COMMAND mkdir -p proto
COMMAND ${PROTOBUF_PROTOC} ${include_options}
Expand All @@ -156,12 +159,12 @@ function(generate_grpc_files)
--python_out=${GENERATED_PROTO_DIR}
--grpc_python_out=${GENERATED_PROTO_DIR}
${pyi_out_param}
-I ${root_path}
-I ${real_root_path}
-I ${USERVER_PROTOBUF_IMPORT_DIR}
--plugin=protoc-gen-grpc=${PROTO_GRPC_CPP_PLUGIN}
--plugin=protoc-gen-usrv=${PROTO_GRPC_USRV_PLUGIN}
--plugin=protoc-gen-grpc_python=${PROTO_GRPC_PYTHON_PLUGIN}
${proto_file}
${real_proto_file}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
RESULT_VARIABLE execute_process_result
)
Expand Down Expand Up @@ -229,9 +232,12 @@ function(add_grpc_library NAME)
CPP_FILES generated_sources
CPP_USRV_FILES generated_usrv_sources
)
add_library(${NAME} STATIC ${generated_sources} ${generated_usrv_sources})
userver_add_library(${NAME} SOURCES ${generated_sources} ${generated_usrv_sources})
target_compile_options(${NAME} PUBLIC -Wno-unused-parameter)
target_include_directories(${NAME} SYSTEM PUBLIC ${include_paths})

target_link_libraries(${NAME} PUBLIC userver-grpc)
target_include_directories(${NAME} SYSTEM PUBLIC
$<BUILD_INTERFACE:${include_paths}>
)

target_link_libraries(${NAME} PUBLIC userver-grpc-internal)
endfunction()
6 changes: 3 additions & 3 deletions cmake/RequireDWCAS.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ if(USERVER_IMPL_DWCAS_CHECKED)
return()
endif()

if(NOT MACOS AND NOT "${CMAKE_SYSTEM}" MATCHES "BSD")
list(APPEND TEST_LIBRARIES "atomic")
endif()
#if(NOT MACOS AND NOT "${CMAKE_SYSTEM}" MATCHES "BSD")
# list(APPEND TEST_LIBRARIES "atomic")
#endif()

# Make try_run honor parent CMAKE_CXX_STANDARD
cmake_policy(SET CMP0067 NEW)
Expand Down
1 change: 1 addition & 0 deletions cmake/Sanitizers.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ set(USERVER_SANITIZE_ENUM "mem, addr, thread, ub")
set(USERVER_SANITIZE "" CACHE STRING "Sanitizer, possible values: ${USERVER_SANITIZE_ENUM}")

add_library(sanitize-target INTERFACE)
install(TARGETS sanitize-target EXPORT userver-targets) # formal export for correct export dependent targets

if (USERVER_SANITIZE)
if (CLANG)
Expand Down
36 changes: 35 additions & 1 deletion cmake/SetupEnvironment.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,37 @@ set (CMAKE_CXX_STANDARD_REQUIRED ON)
set (CMAKE_CXX_EXTENSIONS OFF)
set (CMAKE_VISIBILITY_INLINES_HIDDEN ON)

add_compile_options ("-pipe" "-g" "-gz" "-fPIC")
function(remove_option OUT_LIST_NAME IN_LIST_NAME REMOVE_ITEM)
string(REPLACE " " ";" LOCAL_LIST "${IN_LIST_NAME}")
list (REMOVE_ITEM LOCAL_LIST "${REMOVE_ITEM}")
string(REPLACE ";" " " LOCAL_LIST "${LOCAL_LIST}")
set(${OUT_LIST_NAME} "${LOCAL_LIST}" PARENT_SCOPE)
endfunction()

# remove default -g debug option (we will add it if required)
remove_option(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" "-g")
set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING "Flags used by the C compiler during DEBUG builds" FORCE)
remove_option(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" "-g")
set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING "Flags used by the CXX compiler during DEBUG builds" FORCE)

remove_option(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}" "-g")
set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}" CACHE STRING "Flags used by the C compiler during RELWITHDEBINFO builds" FORCE)
remove_option(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" "-g")
set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}" CACHE STRING "Flags used by the CXX compiler during RELEASE builds" FORCE)

if (USERVER_GEN_GDB_DEBUGINFO)
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ggdb3")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb3")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -ggdb3")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -ggdb3")
else ()
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -g -gz")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -gz")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -g -gz")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -gz")
endif()

add_compile_options ("-pipe" "-fPIC")
add_definitions ("-DPIC")
add_definitions(-DUSERVER)

Expand Down Expand Up @@ -140,4 +170,8 @@ else ()
add_definitions(-D_FORTIFY_SOURCE=2)
endif ()

if (UNIX AND BUILD_SHARED_LIBS)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do not support building userver as a dynamic library. Doing so will result in performance drops (we rely on LTO heavily) and bugs around non-constexpr inline variables and things like AnyMovable comparing std::type_info by pointer value

link_libraries(dl)
endif ()

enable_testing ()
22 changes: 20 additions & 2 deletions cmake/SetupGoogleProtoApis.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,28 @@ generate_grpc_files(
CPP_USRV_FILES generated_usrv_sources
)

add_library(userver-api-common-protos STATIC ${generated_sources})
userver_add_library(userver-api-common-protos SOURCES ${generated_sources})

set_target_properties(userver-api-common-protos PROPERTIES LINKER_LANGUAGE CXX)

target_compile_options(userver-api-common-protos PUBLIC -Wno-unused-parameter)
target_include_directories(userver-api-common-protos SYSTEM PUBLIC ${include_paths})
target_include_directories(userver-api-common-protos SYSTEM PUBLIC
$<BUILD_INTERFACE:${include_paths}>
$<INSTALL_INTERFACE:include/userver/grpc/proto>)

target_link_libraries(userver-api-common-protos PUBLIC userver-core userver-grpc-deps)

set(api-common-proto_LIBRARY userver-api-common-protos)
set(api-common-proto_USRV_SOURCES ${generated_usrv_sources})

# workaround for INSTALL dependent libraries without install this static library
set_target_properties(userver-api-common-protos PROPERTIES LINKER_LANGUAGE CXX)

install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/proto"
DESTINATION "include/userver/grpc/"
FILES_MATCHING
PATTERN "*.pb.hpp"
PATTERN "*.pb.h"
)

userver_export(TARGETS userver-api-common-protos)
64 changes: 64 additions & 0 deletions cmake/UServerAddLibrary.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
function(userver_add_library NAME)

set(options)
set(one_value_args)
set(multi_value_args
SOURCES
PUBLIC_LINK_LIBRARIES
PRIVATE_LINK_LIBRARIES
)
cmake_parse_arguments(USERVER_ADD_LIBRARY "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN})

if (BUILD_SHARED_LIBS)
add_library(${NAME} SHARED ${USERVER_ADD_LIBRARY_SOURCES})

set_property(TARGET "${NAME}" PROPERTY POSITION_INDEPENDENT_CODE 1)

target_link_libraries(${NAME}
PUBLIC
${USERVER_ADD_LIBRARY_PUBLIC_LINK_LIBRARIES}
PRIVATE
${USERVER_ADD_LIBRARY_PRIVATE_LINK_LIBRARIES}
)
else()
add_library(${NAME} STATIC ${USERVER_ADD_LIBRARY_SOURCES})

target_link_libraries(${NAME}
PUBLIC
${USERVER_ADD_LIBRARY_PUBLIC_LINK_LIBRARIES}
PRIVATE
${USERVER_ADD_LIBRARY_PRIVATE_LINK_LIBRARIES}
)
endif()

endfunction()

function(userver_target_link_libraries NAME)
set(options)
set(one_value_args)
set(multi_value_args
PUBLIC
PRIVATE
STATIC_PRIVATE
)
cmake_parse_arguments(USERVER_ADD_LIBRARY "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN})

if(BUILD_SHARED_LIBS)
target_link_libraries(${NAME}
PUBLIC
${USERVER_ADD_LIBRARY_PUBLIC}
${USERVER_ADD_LIBRARY_PRIVATE}
PRIVATE
${USERVER_ADD_LIBRARY_STATIC_PRIVATE}
)
else()
target_link_libraries(${NAME}
PUBLIC
${USERVER_ADD_LIBRARY_PUBLIC}
PRIVATE
${USERVER_ADD_LIBRARY_PRIVATE}
${USERVER_ADD_LIBRARY_STATIC_PRIVATE}
)
endif()

endfunction()
35 changes: 35 additions & 0 deletions cmake/UServerInstall.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
function(userver_install_library)

set(options)
set(one_value_args)
set(multi_value_args TARGETS INCLUDE_DIR)
cmake_parse_arguments(USERVER_INSTALL "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN})

install(TARGETS ${USERVER_INSTALL_TARGETS} EXPORT userver-targets
PUBLIC_HEADER DESTINATION include)

if (NOT DEFINED USERVER_INSTALL_INCLUDE_DIR)
set(USERVER_INSTALL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include/")
endif()

install(DIRECTORY "${USERVER_INSTALL_INCLUDE_DIR}/"
DESTINATION "include"
FILES_MATCHING
PATTERN "*.hpp"
PATTERN "*.ipp"
PATTERN "*.h"
PATTERN "*.inc"
)

endfunction()

function(userver_export)
set(options)
set(one_value_args)
set(multi_value_args TARGETS)
cmake_parse_arguments(USERVER_EXPORT "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN})

install(TARGETS ${USERVER_EXPORT_TARGETS} EXPORT userver-targets
PUBLIC_HEADER DESTINATION include)

endfunction()
Loading