Skip to content

Commit 632adfa

Browse files
committed
UPD | c++20 modules support (in future, because gcc13 doesn't support it and unfortunately it is most popular compiler in Linux)
1 parent 7c35d84 commit 632adfa

9 files changed

Lines changed: 132 additions & 53 deletions

File tree

CMakeLists.txt

Lines changed: 87 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1+
# cmake_minimum_required(VERSION 3.28.2) # CXX Modules Support
12
cmake_minimum_required(VERSION 3.10)
2-
project(manapihttp LANGUAGES CXX VERSION 1.0.0 DESCRIPTION "Fast HTTP Server/Client Library for easy develop API-Services and Web Applications")
3+
project(manapihttp LANGUAGES CXX VERSION 1.0.1 DESCRIPTION "Fast HTTP Server/Client Library for easy develop API-Services and Web Applications")
34

45
set(CMAKE_CXX_STANDARD 23)
6+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
7+
set(CMAKE_CXX_EXTENSIONS OFF)
8+
#set(CMAKE_CXX_VISIBILITY_PRESET hidden)
9+
#set(CMAKE_VISIBILITY_INLINES_HIDDEN TRUE)
510

611
cmake_policy(SET CMP0091 NEW)
712
cmake_policy(SET CMP0070 NEW)
@@ -16,9 +21,9 @@ if (WIN32)
1621
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
1722
endif()
1823

19-
if (CMAKE_COMPILER_IS_GNUCXX)
20-
add_compile_options(-fmerge-all-constants)
21-
endif()
24+
add_compile_options($<$<CXX_COMPILER_ID:GNU>:-fmerge-all-constants>)
25+
# add_compile_options($<$<CXX_COMPILER_ID:GNU>:-fmodules>)
26+
# add_compile_options($<$<CXX_COMPILER_ID:GNU>:-fmodules-ts>)
2227

2328
if (NOT CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
2429
message(STATUS "This project has a top-level one called [${CMAKE_PROJECT_NAME}]")
@@ -74,6 +79,7 @@ message(STATUS "libnghttp2 by nghttp2" ${MANAPIHTTP_NGHTTP2_DEPENDENCY})
7479
message(STATUS "libnghttp3 by nghttp3" ${MANAPIHTTP_NGHTTP3_DEPENDENCY})
7580

7681
set(MANAPIHTTP_GMP_DEPENDENCY_OBJ OFF)
82+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
7783

7884
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
7985
message(STATUS "Build type: Debug")
@@ -584,6 +590,8 @@ string(REPLACE "{{ VAR_MANAPIHTTP_IS_SHARED }}" $<BOOL:${BUILD_SHARED_LIBS}> TEX
584590
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/ManapiParams.hpp" CONTENT "${TEXT}")
585591
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/include/ManapiParams.hpp")
586592

593+
594+
587595
set(MANAPIHTTP_HTTP_FILES
588596
include/ManapiHttp.hpp
589597
include/ManapiThreadPool.hpp
@@ -777,6 +785,11 @@ set(MANAPIHTTP_HTTP_FILES
777785
src/include/ManapiEventLoopCurl.hpp
778786
)
779787

788+
set(MANAPIHTTP_MODULES
789+
modules/ManapiJson.cppm
790+
modules/ManapiJsonBuilder.cppm
791+
)
792+
780793
if (MANAPIHTTP_BUILD_TYPE STREQUAL "exe" OR MANAPIHTTP_BUILD_TYPE STREQUAL "test")
781794
# EXE
782795
message(STATUS "Build type 'exe'")
@@ -906,22 +919,17 @@ if (MANAPIHTTP_BUILD_TYPE STREQUAL "exe" OR MANAPIHTTP_BUILD_TYPE STREQUAL "test
906919

907920
add_compile_definitions(MANAPIHTTP_HTTP_AS_EXECUTABLE)
908921
if (MANAPIHTTP_BUILD_TYPE STREQUAL "exe")
909-
add_executable(${PROJECT_NAME} main.cpp handlers.hpp handlers.cpp ${MANAPIHTTP_HTTP_FILES} ${PROTO_SRCS} ${PROTO_HDRS})
910-
# else ()
911-
# add_executable(${PROJECT_NAME}
912-
# test_package/test_http.hpp
913-
# test_package/test_json.hpp
914-
# test_package/test_parse.hpp
915-
# test_package/test_package.cpp
916-
# test_package/test_bigint.hpp
917-
# test_package/test_json_masks.hpp
918-
# test_package/test_http_and_fetch.cpp
919-
# test_package/test_fetch.hpp
920-
# test_package/test_fs.cpp
921-
# test_package/test_fs.hpp
922-
# test_package/utest.h
923-
# ${MANAPIHTTP_HTTP_FILES} ${PROTO_SRCS} ${PROTO_HDRS})
922+
add_executable(${PROJECT_NAME})
924923
endif ()
924+
925+
target_sources(${PROJECT_NAME} PRIVATE main.cpp handlers.hpp handlers.cpp ${MANAPIHTTP_HTTP_FILES} ${PROTO_SRCS} ${PROTO_HDRS})
926+
927+
# target_sources(${PROJECT_NAME} PUBLIC
928+
# FILE_SET CXX_MODULES
929+
# BASE_DIRS ${CMAKE_SOURCE_DIR}/modules
930+
# FILES ${MANAPIHTTP_MODULES}
931+
# )
932+
925933
else ()
926934
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
927935
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
@@ -931,20 +939,33 @@ else ()
931939

932940
add_compile_definitions(MANAPIHTTP_HTTP_AS_LIBRARY)
933941
if (BUILD_SHARED_LIBS)
934-
add_library(${PROJECT_NAME} SHARED ${MANAPIHTTP_HTTP_FILES})
942+
add_library(${PROJECT_NAME} SHARED)
935943
else ()
936-
add_library(${PROJECT_NAME} ${MANAPIHTTP_HTTP_FILES})
944+
add_library(${PROJECT_NAME})
937945
endif ()
938946

947+
target_sources(${PROJECT_NAME} PRIVATE ${MANAPIHTTP_HTTP_FILES})
948+
939949
set_target_properties(${PROJECT_NAME} PROPERTIES
940950
VERSION ${PROJECT_VERSION}
941951
SOVERSION ${PROJECT_VERSION_MAJOR})
942952

953+
# target_sources(${PROJECT_NAME} PUBLIC
954+
# FILE_SET CXX_MODULES
955+
# BASE_DIRS ${CMAKE_SOURCE_DIR}/modules
956+
# FILES ${MANAPIHTTP_MODULES}
957+
# )
958+
943959
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/${PROJECT_NAME}.pc.in ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc @ONLY)
944960
endif ()
945961

946-
set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION})
962+
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_23)
963+
964+
include(GenerateExportHeader)
947965

966+
generate_export_header(${PROJECT_NAME} EXPORT_FILE_NAME ./include/ManapiExport.hpp)
967+
968+
set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION})
948969

949970
if (WIN32 AND BUILD_SHARED_LIBS)
950971
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
@@ -1251,20 +1272,59 @@ else ()
12511272
endif ()
12521273

12531274

1254-
install(TARGETS ${PROJECT_NAME} EXPORT ManapiHttpConfig
1275+
install(TARGETS ${PROJECT_NAME} EXPORT manapihttp-targets
12551276
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
12561277
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
12571278
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1258-
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1279+
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
1280+
# FILE_SET CXX_MODULES
1281+
# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}/src
1282+
# CXX_MODULES_BMI
1283+
# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}/bmi-${CMAKE_CXX_COMPILER_ID}_$<CONFIG>
1284+
# FILE_SET HEADERS DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECTNAME}
1285+
)
1286+
12591287
install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
12601288
install(DIRECTORY ${CMAKE_BINARY_DIR}/include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
12611289

1262-
install(EXPORT ManapiHttpConfig DESTINATION lib/cmake/${PROJECT_NAME})
1290+
install(EXPORT manapihttp-targets
1291+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
1292+
# CXX_MODULES_DIRECTORY .
1293+
)
12631294

12641295
set_target_properties(${PROJECT_NAME} PROPERTIES
12651296
COMPILE_PDB_NAME ${PROJECT_NAME}
12661297
COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_INSTALL_BINDIR}
12671298
)
12681299

1269-
export(TARGETS ${PROJECT_NAME} FILE ManapiHttpConfig.cmake)
1270-
endif ()
1300+
install(FILES cmake/manapihttp-config.cmake
1301+
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
1302+
)
1303+
#
1304+
# export(TARGETS ${PROJECT_NAME} FILE ManapiHttpConfig.cmake)
1305+
endif ()
1306+
1307+
#include("${manapihttp_PACKAGE_FOLDER_DEBUG}/lib/cmake/manapihttp/manapihttp-config.cmake")
1308+
#
1309+
#set_target_properties(manapihttp::manapihttp PROPERTIES
1310+
# CXX_EXTENSIONS "OFF"
1311+
# CXX_MODULE_STD ""
1312+
# IMPORTED_CXX_MODULES_COMPILE_DEFINITIONS "MANAPIHTTP_HTTP_BUILD_DEBUG;MANAPIHTTP_QUICHE_VERSION=\"0.24.4\";MANAPIHTTP_HTTP_AS_LIBRARY"
1313+
# IMPORTED_CXX_MODULES_COMPILE_FEATURES "cxx_std_23"
1314+
# IMPORTED_CXX_MODULES_INCLUDE_DIRECTORIES "/home/Timur/.conan2/p/b/manap001c9f726cfa4/b/include;/home/Timur/.conan2/p/b/manap001c9f726cfa4/b/build/Debug/include;/home/Timur/.conan2/p/b/manap001c9f726cfa4/b/build/Debug/generated;${manapihttp_PACKAGE_FOLDER_DEBUG}/include/manapihttp"
1315+
# INTERFACE_COMPILE_FEATURES "cxx_std_23"
1316+
# INTERFACE_INCLUDE_DIRECTORIES "${manapihttp_PACKAGE_FOLDER_DEBUG}/include/manapihttp"
1317+
#)
1318+
#
1319+
#target_sources(manapihttp::manapihttp
1320+
# INTERFACE
1321+
# FILE_SET "CXX_MODULES"
1322+
# TYPE "CXX_MODULES"
1323+
# BASE_DIRS "${manapihttp_PACKAGE_FOLDER_DEBUG}/lib/cmake/manapihttp/src"
1324+
# FILES "${manapihttp_PACKAGE_FOLDER_DEBUG}/lib/cmake/manapihttp/src/ManapiJson.cppm"
1325+
#)
1326+
#
1327+
#set_property(TARGET "manapihttp::manapihttp"
1328+
# PROPERTY IMPORTED_CXX_MODULES_DEBUG
1329+
# "manapi=${manapihttp_PACKAGE_FOLDER_DEBUG}/lib/cmake/manapihttp/src/ManapiJson.cppm,${manapihttp_PACKAGE_FOLDER_DEBUG}/lib/cmake/manapihttp/bmi-GNU_Debug/manapi.gcm"
1330+
#)

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,17 +149,17 @@ int main () {
149149
}).unwrap();
150150

151151
router.GET("/cat", [](http::req &req, http::resp &resp) -> manapi::future<> {
152-
auto fetch = (co_await manapi::net::fetch2::fetch ("https://dragonball-api.com/api/planets/7", {
152+
auto fetch = manapi::unwrap(co_await manapi::net::fetch2::fetch ("https://dragonball-api.com/api/planets/7", {
153153
{"verify_peer", false},
154154
{"alpn", true},
155155
{"method", "GET"}
156-
})).unwrap();
156+
})));
157157

158158
if (!fetch.ok()) {
159159
co_return resp.json ({{"error", true}, {"message", "fetch failed"}}).unwrap();
160160
}
161161

162-
auto data = (co_await fetch.json()).unwrap();
162+
auto data = manapi::unwrap(co_await fetch.json());
163163

164164
co_return resp.text(std::move(data["description"].as_string())).unwrap();
165165
}).unwrap();
@@ -213,8 +213,8 @@ int main () {
213213
* works in this context as long as possible.
214214
*/
215215
manapi::async::run([router, db] () mutable -> manapi::future<> {
216-
(co_await db.connect("127.0.0.1", "7879", "development", "password", "db")).unwrap();
217-
(co_await router.config_object({
216+
manapi::unwrap(co_await db.connect("127.0.0.1", "7879", "development", "password", "db"));
217+
manapi::unwrap(co_await router.config_object({
218218
{"pools", manapi::json::array({
219219
{
220220
{"address", "127.0.0.1"},
@@ -233,9 +233,9 @@ int main () {
233233
}
234234
})},
235235
{"save_config", false}
236-
})).unwrap();
236+
}));
237237

238-
(co_await router.start()).unwrap();
238+
manapi::unwrap(co_await router.start());
239239
});
240240

241241
/* bind event loop in the current context */
@@ -324,7 +324,7 @@ int main () {
324324
- [ ] Cross-Platform Build
325325
- [x] Linux
326326
- [ ] MacOs
327-
- [ ] Windows
327+
- [x] Windows
328328

329329
## Tested
330330
- Hyprland Arch Linux x86_64 kernel 6.9.3-zen1-1-zen wayland Debug/Release

cmake/manapihttp-config.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
include("${CMAKE_CURRENT_LIST_DIR}/manapihttp-targets.cmake")

conanfile.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
class ManapiHttpConan(ConanFile):
1212
name = "manapihttp"
1313
description = "Fast http server/client"
14-
version = "1.0.0"
14+
version = "1.0.1"
1515

1616
settings = "os", "compiler", "build_type", "arch"
1717

@@ -55,7 +55,7 @@ class ManapiHttpConan(ConanFile):
5555
"cpptrace_dependency": False
5656
}
5757

58-
exports_sources = "src/*", "include/*", "cmake/*", "CMakeLists.txt", "preprocess/*"
58+
exports_sources = "src/*", "include/*", "cmake/*", "CMakeLists.txt", "preprocess/*", "modules/*"
5959

6060
def config_options(self):
6161
if self.settings.os == "Windows":
@@ -102,12 +102,16 @@ def configure(self):
102102
def layout(self):
103103
cmake_layout(self)
104104

105+
def validate(self):
106+
check_min_cppstd(self, "20")
107+
105108
def generate(self):
106109
VirtualBuildEnv(self).generate()
107110

108111
runenv = VirtualRunEnv(self)
109112
runenv.generate()
110113

114+
# generator="Ninja"
111115
tc = CMakeToolchain(self)
112116
tc.variables['MANAPIHTTP_BUILD_METHOD'] = "conan"
113117
tc.variables['MANAPIHTTP_JSON_DEBUG'] = self.options.get_safe('json_debug', False)

examples/00-main.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,28 @@
22
#include <format>
33

44
#include <manapihttp/ManapiHttp.hpp>
5-
#include <manapihttp/ManapiFilesystem.hpp>
5+
#include <manapihttp/fs/ManapiFilesystem.hpp>
66
#include <manapihttp/ManapiInitTools.hpp>
77

88
int main () {
99
manapi::init_tools::log_trace_init (manapi::debug::LOG_TRACE_LOW);
1010
manapi::async::context::threadpoolfs(4);
1111

12+
manapi::async::context::gbs (manapi::async::context::blockedsignals());
13+
1214
auto ctx = manapi::async::context::create(0).unwrap();
1315
ctx->eventloop()->setup_handle_interrupt();
1416

15-
auto router_ctx = manapi::async::context::create().unwrap();
17+
auto router_ctx = manapi::net::http::server_ctx::create().unwrap();
1618

1719
std::atomic<bool> flag = false;
1820

19-
manapi::async::context::run(ctx, [router_ctx, &flag] () mutable -> void {
21+
manapi::async::context::run(ctx, 0, [router_ctx, &flag] (std::function<void()> bind) mutable -> void {
2022
using http = manapi::net::http::server;
2123
auto router = http::create(router_ctx).unwrap();
2224

23-
router.GET ("/", [](http::req &req, manapi::net::http::response *resp) -> void {
25+
router.GET ("/", [](http::req &req, manapi::net::http::uresponse resp) -> void {
2426
resp->text("hello world").unwrap();
25-
resp->finish();
2627
}).unwrap();
2728

2829
router.GET ("/", ".").unwrap();
@@ -43,7 +44,7 @@ int main () {
4344
}).unwrap();
4445

4546
router.GET ("/api/[key]/toggle", [&flag](manapi::net::http::request &req, manapi::net::http::response &resp) -> manapi::future<> {
46-
if (req.param("key") != "123")
47+
if (req.param("key").unwrap() != "123")
4748
{
4849
throw std::runtime_error ("bad key");
4950
}
@@ -53,12 +54,14 @@ int main () {
5354
co_return resp.text ("ok").unwrap();
5455
}).unwrap();
5556

56-
manapi::async::run(ctx, [router] () mutable
57+
manapi::async::run([router] () mutable
5758
-> manapi::future<> {
58-
(co_await router.config("config.json")).unwrap();
59-
(co_await router.start()).unwrap();
59+
manapi::unwrap(co_await router.config("config.json"));
60+
manapi::unwrap(co_await router.start());
6061
});
62+
63+
bind();
6164
}).unwrap();
6265

6366
return 0;
64-
}
67+
}

examples/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ project(Test)
33

44
set(CMAKE_CXX_STANDARD 23)
55

6-
find_package(ManapiHttp REQUIRED)
6+
find_package(manapihttp REQUIRED)
77

88
add_executable(${PROJECT_NAME} 00-main.cpp)
99

include/ManapiErrors.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,11 @@ namespace manapi {
367367
status status_internal ();
368368
status status_data_loss (std::string_view msg);
369369
}
370+
371+
template<typename T>
372+
auto unwrap (T status) {
373+
return status.unwrap();
374+
}
370375
}
371376

372377
template <>

main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
#include "include/std/ManapiFunction.hpp"
2828
// //
29-
#include "ext/pq/AsyncPostgreClient.hpp"
29+
// #include "ext/pq/AsyncPostgreClient.hpp"
3030
//
3131
//
3232
// // Logic and data behind the server's behavior.
@@ -143,7 +143,7 @@ int main () {
143143

144144
manapi::async::context::run(ctx, loops, [&thrcnt, &a, server_ctx/*,grpc_server_ctx*/] (const std::function<void()> &bind) -> void {
145145
using http = manapi::net::http::server;
146-
auto db = manapi::ext::pq::connection::create().unwrap();
146+
// auto db = manapi::ext::pq::connection::create().unwrap();
147147

148148
/**
149149
* grpc
@@ -300,8 +300,8 @@ int main () {
300300

301301
init_http_server (router, folder);
302302

303-
manapi::async::run([router, db] () mutable -> manapi::future<> {
304-
(co_await db.connect("127.0.0.1", "7879", "development", "12345", "workflow-main")).unwrap();
303+
manapi::async::run([router/*, db*/] () mutable -> manapi::future<> {
304+
//(co_await db.connect("127.0.0.1", "7879", "development", "rv8FY--PHz_QV<wvT4=n_Ru+cUJE}>KCqmBj9&#M3\\\"Gb.tx", "workflow-main")).unwrap();
305305

306306
(co_await router.config("/home/Timur/Desktop/WorkSpace/ManapiHTTP/cmake-build-debug/config.json")).unwrap();
307307
(co_await router.start()).unwrap();

0 commit comments

Comments
 (0)