Skip to content

Commit 9140947

Browse files
committed
feat core: allow embedded file in cmake/yamake
commit_hash:b0da7c4dfc838f50b993e81a731a24c1ede5ff2c
1 parent d1356ef commit 9140947

File tree

20 files changed

+339
-1
lines changed

20 files changed

+339
-1
lines changed

.mapping.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@
374374
"cmake/SetupYdbCppSDK.cmake":"taxi/uservices/userver/cmake/SetupYdbCppSDK.cmake",
375375
"cmake/Stacktrace.cmake":"taxi/uservices/userver/cmake/Stacktrace.cmake",
376376
"cmake/UserverCxxCompileOptionsIfSupported.cmake":"taxi/uservices/userver/cmake/UserverCxxCompileOptionsIfSupported.cmake",
377+
"cmake/UserverEmbedFile.cmake":"taxi/uservices/userver/cmake/UserverEmbedFile.cmake",
377378
"cmake/UserverGrpcTargets.cmake":"taxi/uservices/userver/cmake/UserverGrpcTargets.cmake",
378379
"cmake/UserverModule.cmake":"taxi/uservices/userver/cmake/UserverModule.cmake",
379380
"cmake/UserverPack.cmake":"taxi/uservices/userver/cmake/UserverPack.cmake",
@@ -383,6 +384,7 @@
383384
"cmake/UserverSql.cmake":"taxi/uservices/userver/cmake/UserverSql.cmake",
384385
"cmake/UserverTestsuite.cmake":"taxi/uservices/userver/cmake/UserverTestsuite.cmake",
385386
"cmake/UserverVenv.cmake":"taxi/uservices/userver/cmake/UserverVenv.cmake",
387+
"cmake/embedded_config.cmake":"taxi/uservices/userver/cmake/embedded_config.cmake",
386388
"cmake/get_cpm.cmake":"taxi/uservices/userver/cmake/get_cpm.cmake",
387389
"cmake/install/Config.cmake.in":"taxi/uservices/userver/cmake/install/Config.cmake.in",
388390
"cmake/install/userver-chaotic-config.cmake":"taxi/uservices/userver/cmake/install/userver-chaotic-config.cmake",
@@ -3066,6 +3068,15 @@
30663068
"samples/digest_auth_service/tests/test_digest.py":"taxi/uservices/userver/samples/digest_auth_service/tests/test_digest.py",
30673069
"samples/digest_auth_service/tests/test_proxy.py":"taxi/uservices/userver/samples/digest_auth_service/tests/test_proxy.py",
30683070
"samples/digest_auth_service/user_info.hpp":"taxi/uservices/userver/samples/digest_auth_service/user_info.hpp",
3071+
"samples/embedded_files/CMakeLists.txt":"taxi/uservices/userver/samples/embedded_files/CMakeLists.txt",
3072+
"samples/embedded_files/main.cpp":"taxi/uservices/userver/samples/embedded_files/main.cpp",
3073+
"samples/embedded_files/src/hello_handler.cpp":"taxi/uservices/userver/samples/embedded_files/src/hello_handler.cpp",
3074+
"samples/embedded_files/src/hello_handler.hpp":"taxi/uservices/userver/samples/embedded_files/src/hello_handler.hpp",
3075+
"samples/embedded_files/src/say_hello.cpp":"taxi/uservices/userver/samples/embedded_files/src/say_hello.cpp",
3076+
"samples/embedded_files/src/say_hello.hpp":"taxi/uservices/userver/samples/embedded_files/src/say_hello.hpp",
3077+
"samples/embedded_files/static_config.yaml":"taxi/uservices/userver/samples/embedded_files/static_config.yaml",
3078+
"samples/embedded_files/testsuite/conftest.py":"taxi/uservices/userver/samples/embedded_files/testsuite/conftest.py",
3079+
"samples/embedded_files/testsuite/test_hello.py":"taxi/uservices/userver/samples/embedded_files/testsuite/test_hello.py",
30693080
"samples/flatbuf_service/CMakeLists.txt":"taxi/uservices/userver/samples/flatbuf_service/CMakeLists.txt",
30703081
"samples/flatbuf_service/flatbuf_service.cpp":"taxi/uservices/userver/samples/flatbuf_service/flatbuf_service.cpp",
30713082
"samples/flatbuf_service/flatbuffer_schema.fbs":"taxi/uservices/userver/samples/flatbuf_service/flatbuffer_schema.fbs",
@@ -4072,6 +4083,7 @@
40724083
"universal/include/userver/utils/projected_set.hpp":"taxi/uservices/userver/universal/include/userver/utils/projected_set.hpp",
40734084
"universal/include/userver/utils/rand.hpp":"taxi/uservices/userver/universal/include/userver/utils/rand.hpp",
40744085
"universal/include/userver/utils/regex.hpp":"taxi/uservices/userver/universal/include/userver/utils/regex.hpp",
4086+
"universal/include/userver/utils/resources.hpp":"taxi/uservices/userver/universal/include/userver/utils/resources.hpp",
40754087
"universal/include/userver/utils/result_store.hpp":"taxi/uservices/userver/universal/include/userver/utils/result_store.hpp",
40764088
"universal/include/userver/utils/scope_guard.hpp":"taxi/uservices/userver/universal/include/userver/utils/scope_guard.hpp",
40774089
"universal/include/userver/utils/shared_readable_ptr.hpp":"taxi/uservices/userver/universal/include/userver/utils/shared_readable_ptr.hpp",
@@ -4360,6 +4372,7 @@
43604372
"universal/src/utils/rand_test.cpp":"taxi/uservices/userver/universal/src/utils/rand_test.cpp",
43614373
"universal/src/utils/regex.cpp":"taxi/uservices/userver/universal/src/utils/regex.cpp",
43624374
"universal/src/utils/regex_test.cpp":"taxi/uservices/userver/universal/src/utils/regex_test.cpp",
4375+
"universal/src/utils/resources.cpp":"taxi/uservices/userver/universal/src/utils/resources.cpp",
43634376
"universal/src/utils/scope_guard_test.cpp":"taxi/uservices/userver/universal/src/utils/scope_guard_test.cpp",
43644377
"universal/src/utils/shared_readable_ptr_test.cpp":"taxi/uservices/userver/universal/src/utils/shared_readable_ptr_test.cpp",
43654378
"universal/src/utils/small_string_benchmark.cpp":"taxi/uservices/userver/universal/src/utils/small_string_benchmark.cpp",

cmake/UserverEmbedFile.cmake

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
include_guard(GLOBAL)
2+
3+
function(userver_embed_file TARGET)
4+
set(OPTIONS)
5+
set(ONE_VALUE_ARGS NAME FILEPATH HPP_FILENAME)
6+
set(MULTI_VALUE_ARGS SQL_FILES)
7+
cmake_parse_arguments(
8+
ARG "${OPTIONS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN}
9+
)
10+
if(NOT ARG_HPP_FILENAME)
11+
# new cmake: cmake_path(GET ARG_FILEPATH FILENAME ARG_HPP_FILENAME)
12+
string(REGEX REPLACE ".*/" "" ARG_HPP_FILENAME "${ARG_FILEPATH}")
13+
endif()
14+
15+
string(SUBSTRING "${ARG_FILEPATH}" 0 1 START)
16+
if(NOT START STREQUAL /)
17+
set(ARG_FILEPATH "${CMAKE_CURRENT_SOURCE_DIR}/${ARG_FILEPATH}")
18+
endif()
19+
20+
set(CONFIG_HPP ${CMAKE_CURRENT_BINARY_DIR}/embedded/include/generated/${ARG_HPP_FILENAME}.hpp)
21+
add_custom_command(
22+
OUTPUT
23+
${CONFIG_HPP}
24+
DEPENDS
25+
${USERVER_ROOT_DIR}/cmake/embedded_config.cmake
26+
COMMAND
27+
${CMAKE_COMMAND}
28+
-DUSERVER_ROOT_DIR=${USERVER_ROOT_DIR}
29+
-DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
30+
-DFILEPATH=${ARG_FILEPATH}
31+
-DOUTPUT=${CONFIG_HPP}
32+
-DNAME=${ARG_NAME}
33+
-P ${USERVER_ROOT_DIR}/cmake/embedded_config.cmake
34+
)
35+
add_library(${TARGET} STATIC ${CONFIG_HPP})
36+
target_include_directories(${TARGET} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/embedded/include)
37+
target_link_libraries(${TARGET} PUBLIC userver::universal)
38+
endfunction()

cmake/embedded_config.cmake

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
cmake_policy(SET CMP0053 NEW)
2+
3+
set(NAMESPACE userver)
4+
set(FILE_IN ${CMAKE_CURRENT_BINARY_DIR}/embedded.h.in)
5+
set(TEMPLATE "
6+
#pragma once
7+
8+
#include <string_view>
9+
10+
#include <userver/utils/resources.hpp>
11+
12+
__asm__(R\"(
13+
.section .rodata
14+
.align 16
15+
@NAME@_begin:
16+
.incbin \"${FILEPATH}\"
17+
@NAME@_end:
18+
.byte 0
19+
@NAME@_size:
20+
.int @NAME@_end - @NAME@_begin
21+
.section .text
22+
)\");
23+
24+
extern \"C\" const char @NAME@_begin[];
25+
extern \"C\" const char @NAME@_end;
26+
extern \"C\" const int @NAME@_size;
27+
28+
29+
__attribute__((constructor)) void @NAME@_call() {
30+
utils::RegisterResource(\"@NAME@\", std::string_view{@NAME@_begin, static_cast<size_t>(@NAME@_size)});
31+
}
32+
")
33+
string(CONFIGURE "${TEMPLATE}" RENDERED)
34+
file(WRITE "${OUTPUT}" "${RENDERED}")

cmake/install/userver-universal-config.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ include("${USERVER_CMAKE_DIR}/AddGoogleTests.cmake")
3939
include("${USERVER_CMAKE_DIR}/Sanitizers.cmake")
4040
include("${USERVER_CMAKE_DIR}/UserverSetupEnvironment.cmake")
4141
include("${USERVER_CMAKE_DIR}/UserverVenv.cmake")
42+
include("${USERVER_CMAKE_DIR}/UserverEmbedFile.cmake")
4243

4344
userver_setup_environment()
4445
_userver_make_sanitize_blacklist()

core/include/userver/utils/daemon_run.hpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
/// @brief Functions to start a daemon with specified components list.
55

66
#include <userver/components/component_list.hpp>
7+
#include <userver/components/run.hpp>
78

89
USERVER_NAMESPACE_BEGIN
910

1011
namespace utils {
1112

1213
/// Parses command line arguments and calls components::Run with config file
13-
/// from --config parameter.
14+
/// from --config parameter. Reports unhandled exceptions.
1415
///
1516
/// Other command line arguments:
1617
/// * --help - show all command line arguments
@@ -21,6 +22,10 @@ namespace utils {
2122
/// * --print-dynamic-config-defaults - print JSON with dynamic config defaults
2223
int DaemonMain(int argc, const char* const argv[], const components::ComponentList& components_list);
2324

25+
/// Calls components::Run with in-memory config.
26+
/// Reports unhandled exceptions.
27+
int DaemonMain(const components::InMemoryConfig& config, const components::ComponentList& components_list);
28+
2429
} // namespace utils
2530

2631
USERVER_NAMESPACE_END

core/src/utils/daemon_run.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,25 @@ int DaemonMain(const int argc, const char* const argv[], const components::Compo
9090
}
9191
}
9292

93+
int DaemonMain(const components::InMemoryConfig& config, const components::ComponentList& components_list) {
94+
utils::impl::FinishStaticRegistration();
95+
96+
try {
97+
components::Run(config, components_list);
98+
return 0;
99+
} catch (const std::exception& ex) {
100+
auto msg = fmt::format("Unhandled exception in components::Run: {}", ex.what());
101+
std::cerr << msg << "\n";
102+
return 1;
103+
} catch (...) {
104+
auto msg = fmt::format(
105+
"Non-standard exception in components::Run: {}", boost::current_exception_diagnostic_information()
106+
);
107+
std::cerr << msg << '\n';
108+
return 1;
109+
}
110+
}
111+
93112
} // namespace utils
94113

95114
USERVER_NAMESPACE_END

samples/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}-json2yaml)
3838
add_subdirectory(hello_service)
3939
add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}-hello_service)
4040

41+
add_subdirectory(embedded_files)
42+
add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}-embedded_files)
43+
4144
add_subdirectory(http_middleware_service)
4245
add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}-http_middleware_service)
4346

samples/embedded_files/CMakeLists.txt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
cmake_minimum_required(VERSION 3.14)
2+
project(userver-samples-embedded_files CXX)
3+
4+
find_package(userver COMPONENTS core REQUIRED)
5+
6+
add_library(${PROJECT_NAME}_objs OBJECT
7+
src/say_hello.hpp
8+
src/say_hello.cpp
9+
src/hello_handler.hpp
10+
src/hello_handler.cpp
11+
)
12+
target_link_libraries(${PROJECT_NAME}_objs userver::core)
13+
target_include_directories(${PROJECT_NAME}_objs PUBLIC src)
14+
15+
add_executable(${PROJECT_NAME} main.cpp)
16+
target_link_libraries(${PROJECT_NAME} ${PROJECT_NAME}_objs)
17+
18+
# /// [embedded]
19+
userver_embed_file(${PROJECT_NAME}_config
20+
NAME static_config_yaml
21+
FILEPATH static_config.yaml
22+
)
23+
target_link_libraries(${PROJECT_NAME} ${PROJECT_NAME}_config)
24+
# /// [embedded]
25+
26+
userver_testsuite_add_simple()

samples/embedded_files/main.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#include <userver/components/minimal_server_component_list.hpp>
2+
#include <userver/utest/using_namespace_userver.hpp>
3+
#include <userver/utils/daemon_run.hpp>
4+
5+
// Note: this is for the purposes of tests/samples only
6+
#include <userver/utest/using_namespace_userver.hpp>
7+
8+
#include <hello_handler.hpp>
9+
10+
#include <generated/static_config.yaml.hpp>
11+
12+
// [embedded usage]
13+
int main(int, char*[]) {
14+
auto component_list = components::MinimalServerComponentList().Append<samples::hello::HelloHandler>();
15+
16+
return utils::DaemonMain(components::InMemoryConfig{utils::FindResource("static_config_yaml")}, component_list);
17+
}
18+
// [embedded usage]
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include "hello_handler.hpp"
2+
3+
#include "say_hello.hpp"
4+
5+
namespace samples::hello {
6+
7+
std::string HelloHandler::
8+
HandleRequestThrow(const server::http::HttpRequest& request, server::request::RequestContext& /*request_context*/)
9+
const {
10+
// Setting Content-Type: text/plain in a microservice response ensures
11+
// the client interprets it as plain text, preventing misinterpretation or
12+
// errors. Without this header, the client might assume a different format,
13+
// such as JSON, HTML or XML, leading to potential processing issues or
14+
// incorrect handling of the data.
15+
request.GetHttpResponse().SetContentType(http::content_type::kTextPlain);
16+
return samples::hello::SayHelloTo(request.GetArg("name"));
17+
}
18+
19+
} // namespace samples::hello

0 commit comments

Comments
 (0)