From fa93e06bd5af2cbb28140eeda222945ddb36132a Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Tue, 24 Oct 2023 13:11:04 -0400 Subject: [PATCH 1/7] get build working --- CMakeLists.txt | 13 +++++++ cmake/xo_pywebsockConfig.cmake.in | 4 ++ include/README.md | 1 + src/pywebsock/CMakeLists.txt | 9 +++++ src/pywebsock/pywebsock.cpp | 63 +++++++++++++++++++++++++++++++ src/pywebsock/pywebsock.hpp.in | 25 ++++++++++++ 6 files changed, 115 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 cmake/xo_pywebsockConfig.cmake.in create mode 100644 include/README.md create mode 100644 src/pywebsock/CMakeLists.txt create mode 100644 src/pywebsock/pywebsock.cpp create mode 100644 src/pywebsock/pywebsock.hpp.in diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..20774e1c --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,13 @@ +# xo-pywebsock/CMakeLists.txt + +cmake_minimum_required(VERSION 3.10) + +project(xo_pywebsock VERSION 1.0) + +include(xo_macros/xo-project-macros) + +xo_cxx_toplevel_options() + +add_subdirectory(src/pywebsock) + +xo_export_cmake_config(${PROJECT_NAME} ${PROJECT_VERSION} ${PROJECT_NAME}Targets) diff --git a/cmake/xo_pywebsockConfig.cmake.in b/cmake/xo_pywebsockConfig.cmake.in new file mode 100644 index 00000000..9c15f36a --- /dev/null +++ b/cmake/xo_pywebsockConfig.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +check_required_components("@PROJECT_NAME@") diff --git a/include/README.md b/include/README.md new file mode 100644 index 00000000..1c13f62a --- /dev/null +++ b/include/README.md @@ -0,0 +1 @@ +placeholder. needed at install for generated .hpp file diff --git a/src/pywebsock/CMakeLists.txt b/src/pywebsock/CMakeLists.txt new file mode 100644 index 00000000..0ad6f596 --- /dev/null +++ b/src/pywebsock/CMakeLists.txt @@ -0,0 +1,9 @@ +# xo_pywebsock/src/pywebsock/CMakeLists.txt + +set(SELF_LIB pywebsock) +set(SELF_SRCS pywebsock.cpp) + +xo_pybind11_library(${SELF_LIB} ${PROJECT_NAME}Targets ${SELF_SRCS}) +xo_pybind11_dependency(${SELF_LIB} websock) +#xo_pybind11_header_dependency(${SELF_LIB pyfoo) +xo_pybind11_dependency(${SELF_LIB} xo_pyutil) diff --git a/src/pywebsock/pywebsock.cpp b/src/pywebsock/pywebsock.cpp new file mode 100644 index 00000000..e92c43ee --- /dev/null +++ b/src/pywebsock/pywebsock.cpp @@ -0,0 +1,63 @@ +/* @file pywebsock.cpp */ + +#include "pywebsock.hpp" +#include "xo/pywebutil/pywebutil.hpp" +#include "xo/websock/Webserver.hpp" +#include "xo/printjson/PrintJson.hpp" +//#include "web_util/EndpointDescr.hpp" +#include "xo/pyutil/pyutil.hpp" +#include + +namespace xo { + using xo::web::WebserverConfig; + using xo::web::Webserver; + using xo::web::Runstate; + using xo::json::PrintJsonSingleton; + using xo::ref::rp; + namespace py = pybind11; + + namespace web { + PYBIND11_MODULE(PYWEBSOCK_MODULE_NAME(), m) { + PYWEBUTIL_IMPORT_MODULE(); // = py::module_::import("pywebutil") + + /* module docstring */ + m.doc() = "pybind11 plugin for xo.websock"; + + py::enum_(m, "Runstate") + .value("stopped", Runstate::stopped) + .value("stop_requested", Runstate::stop_requested) + .value("running", Runstate::running); + + py::class_(m, "WebserverConfig") + .def(py::init(), + py::arg("port"), + py::arg("tls_flag"), + py::arg("host_check_flag"), + py::arg("use_retry_flag")) + .def_property_readonly("port", &WebserverConfig::port) + .def_property_readonly("tls_flag", &WebserverConfig::tls_flag) + .def_property_readonly("host_check_flag", &WebserverConfig::host_check_flag) + .def_property_readonly("use_retry_flag", &WebserverConfig::use_retry_flag); + + py::class_>(m, "Webserver") + .def_static("make", + [](WebserverConfig const & ws_config) + { + return Webserver::make(ws_config, + PrintJsonSingleton::instance()); + }) + .def_property_readonly("state", &Webserver::state) + .def("register_http_endpoint", &Webserver::register_http_endpoint) + .def("register_stream_endpoint", &Webserver::register_stream_endpoint) + .def("start_webserver", &Webserver::start_webserver) + .def("stop_webserver", &Webserver::stop_webserver) + .def("join_webserver", &Webserver::join_webserver) + .def("__repr__", &Webserver::display_string); + + m.def("make_webserver", + &Webserver::make); + } /*pywebsock*/ + } /*web*/ +} /*namespace xo*/ + +/* end pywebsock.cpp */ diff --git a/src/pywebsock/pywebsock.hpp.in b/src/pywebsock/pywebsock.hpp.in new file mode 100644 index 00000000..4d3ec777 --- /dev/null +++ b/src/pywebsock/pywebsock.hpp.in @@ -0,0 +1,25 @@ +/* @file pywebsock.hpp + * + * automatically generated from src/pywebsock/pywebsock.hpp.in + * see src/pywebsock/CMakeLists.txt + */ + +/* python requires module name = library name + * example: + * PYBIND11_MODULE(PYWEBSOCK_MODULE_NAME(), m) { ... } + */ +#define PYWEBSOCK_MODULE_NAME() @SELF_LIB@ + +/* example: + * py::module_::import(PYWEBSOCK_MODULE_NAME_STR) + */ +#define PYWEBSOCK_MODULE_NAME_STR "@SELF_LIB@" + +/* example: + * PYWEBSOCK_IMPORT_MODULE() + * replaces + * py::module_::import("pywebsock") + */ +#define PYWEBSOCK_IMPORT_MODULE() py::module_::import("@SELF_LIB@") + +/* end pywebsock.hpp */ From e9b9da29696fe14534add8f25a08bb34688bf132 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Tue, 24 Oct 2023 13:47:56 -0400 Subject: [PATCH 2/7] build: need pywebutil dep --- src/pywebsock/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pywebsock/CMakeLists.txt b/src/pywebsock/CMakeLists.txt index 0ad6f596..2823da75 100644 --- a/src/pywebsock/CMakeLists.txt +++ b/src/pywebsock/CMakeLists.txt @@ -5,5 +5,5 @@ set(SELF_SRCS pywebsock.cpp) xo_pybind11_library(${SELF_LIB} ${PROJECT_NAME}Targets ${SELF_SRCS}) xo_pybind11_dependency(${SELF_LIB} websock) -#xo_pybind11_header_dependency(${SELF_LIB pyfoo) +xo_pybind11_header_dependency(${SELF_LIB} pywebutil) xo_pybind11_dependency(${SELF_LIB} xo_pyutil) From 8c1c0c181102ab69867201a6da7c10e5850e6db0 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Tue, 24 Oct 2023 17:08:47 -0400 Subject: [PATCH 3/7] build: pywebutil -> xo_pywebutil --- src/pywebsock/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pywebsock/CMakeLists.txt b/src/pywebsock/CMakeLists.txt index 2823da75..57c5d75a 100644 --- a/src/pywebsock/CMakeLists.txt +++ b/src/pywebsock/CMakeLists.txt @@ -5,5 +5,5 @@ set(SELF_SRCS pywebsock.cpp) xo_pybind11_library(${SELF_LIB} ${PROJECT_NAME}Targets ${SELF_SRCS}) xo_pybind11_dependency(${SELF_LIB} websock) -xo_pybind11_header_dependency(${SELF_LIB} pywebutil) +xo_pybind11_header_dependency(${SELF_LIB} xo_pywebutil) xo_pybind11_dependency(${SELF_LIB} xo_pyutil) From 8472e4196d7627331a5a7893b226b87b3f3697e7 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Tue, 24 Oct 2023 22:11:18 -0400 Subject: [PATCH 4/7] + .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..d6536bad --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build +compile_commands.json From f7abb8fedba3f1ae98ae9f2af7c9ca6908dba824 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 15 Mar 2024 19:42:35 -0400 Subject: [PATCH 5/7] build: streamline CMAKE_MODULE_PATH interaction --- .gitignore | 6 ++- CMakeLists.txt | 3 +- README.md | 71 +++++++++++++++++++++++++++++++++ cmake/xo-bootstrap-macros.cmake | 12 ++++++ src/pywebsock/CMakeLists.txt | 2 +- 5 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 README.md create mode 100644 cmake/xo-bootstrap-macros.cmake diff --git a/.gitignore b/.gitignore index d6536bad..13c0afb7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ -build +# clangd working space (see emacs+lsp) +.cache +# typical cmake build directory (source-tree-nephew) +.build* +# symlink to builddir/compile_commands.json; should be set manually in dev sandbox compile_commands.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 20774e1c..56e9f2eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,9 @@ # xo-pywebsock/CMakeLists.txt cmake_minimum_required(VERSION 3.10) - project(xo_pywebsock VERSION 1.0) -include(xo_macros/xo-project-macros) +include(cmake/xo-bootstrap-macros.cmake) xo_cxx_toplevel_options() diff --git a/README.md b/README.md new file mode 100644 index 00000000..468c605d --- /dev/null +++ b/README.md @@ -0,0 +1,71 @@ +# python bindings for c++ websocket library (xo-websock) + +## Getting Started + +### build + install dependencies + +- [github/Rconybea/xo-websock](https://github.com/Rconybea/xo-websock) +- [github/Rconybea/xo-pyutil](https://github.com/Rconybea/xo-pyutil) +- [github/Rconybea/xo-pyreactor](https://github.com/Rconybea/xo-pyreactor) + +### build + install + +``` +$ cd xo-pywebsock +$ mkdir build +$ cd build +$ INSTALL_PREFIX=/usr/local # or wherever you prefer, e.g. ~/local +$ cmake \ + -DCMAKE_MODULE_PATH=${INSTALL_PREFIX}/share/cmake \ + -DCMAKE_PREFIX_PATH=${INSTALL_PREFIX} \ + -DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX} .. +$ make +$ make install +``` +(also see .github/workflows/main.yml) + +## Examples + +Assumes `xo-pywebsock` installed to `~/local2/lib` +``` +PYTHONPATH=~/local2/lib:$PYTHONPATH python +>>> import xo_pywebsock +>>> dir(xo_pywebsock) +['Runstate', 'Webserver', 'WebserverConfig', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'make_webserver'] +>>> +``` + +## Development + +### build for unit test coverage +``` +$ cd xo-pywebsock +$ mkdir build-ccov +$ cd build-ccov +$ cmake \ + -DCMAKE_MODULE_PATH=${INSTALL_PREFIX}/share/cmake \ + -DCMAKE_PREFIX_PATH=${INSTALL_PREFIX} \ + -DCODE_COVERAGE=ON \ + -DCMAKE_BUILD_TYPE=Debug .. +``` + +### LSP (language server) support + +LSP looks for compile commands in the root of the source tree; +while Cmake creates them in the root of its build directory. + +``` +$ cd xo-pywebsock +$ ln -s build/compile_commands.json # supply compile commands to LSP +``` + +### display cmake variables + +- `-L` list variables +- `-A` include 'advanced' variables +- `-H` include help text + +``` +$ cd xo-pywebsock/build +$ cmake -LAH +``` diff --git a/cmake/xo-bootstrap-macros.cmake b/cmake/xo-bootstrap-macros.cmake new file mode 100644 index 00000000..16644435 --- /dev/null +++ b/cmake/xo-bootstrap-macros.cmake @@ -0,0 +1,12 @@ +if (("${CMAKE_MODULE_PATH}" STREQUAL "") OR ("${CMAKE_MODULE_PATH}" STREQUAL "prefix")) + # default to typical install location for xo-project-macros + set(CMAKE_MODULE_PATH ${CMAKE_INSTALL_PREFIX}/share/cmake) +endif() + +message("-- CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}") +message("-- CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}") + +# needs to have been installed somewhere on CMAKE_MODULE_PATH, +# (e.g. from xo-cmake with the same value for CMAKE_INSTALL_PREFIX) +# +include(xo_macros/xo-project-macros) diff --git a/src/pywebsock/CMakeLists.txt b/src/pywebsock/CMakeLists.txt index 57c5d75a..1e40a064 100644 --- a/src/pywebsock/CMakeLists.txt +++ b/src/pywebsock/CMakeLists.txt @@ -1,6 +1,6 @@ # xo_pywebsock/src/pywebsock/CMakeLists.txt -set(SELF_LIB pywebsock) +set(SELF_LIB xo_pywebsock) set(SELF_SRCS pywebsock.cpp) xo_pybind11_library(${SELF_LIB} ${PROJECT_NAME}Targets ${SELF_SRCS}) From 707af0552005a8d98124659a90253cd3325c1707 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Fri, 29 Mar 2024 14:33:41 -0400 Subject: [PATCH 6/7] build: suppress bootstrap message in submodule build --- cmake/xo-bootstrap-macros.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake/xo-bootstrap-macros.cmake b/cmake/xo-bootstrap-macros.cmake index 16644435..96592216 100644 --- a/cmake/xo-bootstrap-macros.cmake +++ b/cmake/xo-bootstrap-macros.cmake @@ -3,8 +3,10 @@ if (("${CMAKE_MODULE_PATH}" STREQUAL "") OR ("${CMAKE_MODULE_PATH}" STREQUAL "pr set(CMAKE_MODULE_PATH ${CMAKE_INSTALL_PREFIX}/share/cmake) endif() -message("-- CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}") -message("-- CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}") +if (NOT XO_SUBMODULE_BUILD) + message("-- CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}") + message("-- CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}") +endif() # needs to have been installed somewhere on CMAKE_MODULE_PATH, # (e.g. from xo-cmake with the same value for CMAKE_INSTALL_PREFIX) From 3ce41f42cadf92dfaee4f7152750385a0023e7a4 Mon Sep 17 00:00:00 2001 From: Roland Conybeare Date: Thu, 8 May 2025 23:52:40 -0500 Subject: [PATCH 7/7] compile nit: refactor debris --- src/pywebsock/pywebsock.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pywebsock/pywebsock.cpp b/src/pywebsock/pywebsock.cpp index e92c43ee..bbaa19c1 100644 --- a/src/pywebsock/pywebsock.cpp +++ b/src/pywebsock/pywebsock.cpp @@ -13,7 +13,7 @@ namespace xo { using xo::web::Webserver; using xo::web::Runstate; using xo::json::PrintJsonSingleton; - using xo::ref::rp; + using xo::rp; namespace py = pybind11; namespace web {