Skip to content
Draft
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
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ jobs:
- name: Build zenohcpp conan package
shell: bash
run: |
conan create --version 1.2.1 up-conan-recipes/zenohc-tmp/prebuilt
conan create --version 1.2.1 up-conan-recipes/zenohcpp-tmp/from-source
conan create --version 1.5.0 up-conan-recipes/zenohc-tmp/prebuilt
conan create --version 1.5.0 up-conan-recipes/zenohcpp-tmp/from-source

- name: Build up-transport-zenoh-cpp with tests
shell: bash
Expand Down
50 changes: 47 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,20 @@ find_package(protobuf REQUIRED)
find_package(spdlog REQUIRED)
find_package(up-core-api REQUIRED)
find_package(up-cpp REQUIRED)
find_package(zenohcpp REQUIRED)

option(WITH_ZENOH_PICO "Build based on zenoh-pico backend" OFF)
option(WITH_ZENOH_C "Build based on zenoh-c backend" OFF)

if(WITH_ZENOH_PICO)
find_package(zenohpico REQUIRED)
find_package(zenohcxx REQUIRED)
elseif(WITH_ZENOH_C)
find_package(zenohc REQUIRED)
find_package(zenohcxx REQUIRED)
else()
find_package(zenohcpp REQUIRED)
add_compile_definitions(ZENOHCXX_ZENOHC)
endif()

message("* Adding build types...")
list(APPEND CMAKE_CONFIGURATION_TYPES Release Coverage)
Expand Down Expand Up @@ -51,12 +64,28 @@ target_include_directories(${PROJECT_NAME}
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>
${zenohcpp_INCLUDE_DIR}
${up-cpp_INCLUDE_DIR}
${up-core-api_INCLUDE_DIR}
${protobuf_INCLUDE_DIR}
${spdlog_INCLUDE_DIR})

if(WITH_ZENOH_PICO)
target_include_directories(${PROJECT_NAME}
PUBLIC
${zenohpico_INCLUDE_DIR}
${zenohcxx_zenohpico_INCLUDE_DIR})
elseif(WITH_ZENOH_C)
target_include_directories(${PROJECT_NAME}
PUBLIC
${zenohc_INCLUDE_DIR}
${zenohcxx_zenohc_INCLUDE_DIR})
else()
target_include_directories(${PROJECT_NAME}
PUBLIC
${zenohcpp_INCLUDE_DIR})
endif()


set_property(TARGET ${PROJECT_NAME} PROPERTY POSITION_INDEPENDENT_CODE ON)

target_compile_options(${PROJECT_NAME} PUBLIC
Expand All @@ -71,13 +100,28 @@ target_compile_options(${PROJECT_NAME} PUBLIC

target_link_libraries(${PROJECT_NAME}
PRIVATE
zenohcpp::lib
up-cpp::up-cpp
up-core-api::up-core-api
protobuf::libprotobuf
spdlog::spdlog
)

if(WITH_ZENOH_PICO)
target_link_libraries(${PROJECT_NAME}
PRIVATE
zenohpico::lib
zenohcxx::zenohpico)
elseif(WITH_ZENOH_C)
target_link_libraries(${PROJECT_NAME}
PRIVATE
zenohc::lib
zenohcxx::zenohc)
else()
target_link_libraries(${PROJECT_NAME}
PRIVATE
zenohcpp::lib)
endif()

enable_testing()
add_subdirectory(test)

Expand Down
60 changes: 55 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,35 @@ from [up-cpp][cpp-api-repo].
- Compiler: GCC/G++ 11 or Clang 13
- Conan : 1.59 or latest 2.X

#### Conan packages
#### Basic Conan packages

Using the recipes found in [up-conan-recipes][conan-recipe-repo], build these
Conan packages:

1. [up-core-api][spec-repo] -
`conan create --version 1.6.0-alpha4 --build=missing up-core-api/release`
2. [up-cpp][cpp-api-repo] -
`conan create --version 1.0.1 --build=missing up-cpp/release`
3. [zenoh-c][zenoh-repo] - `conan create --version 1.2.1 zenohc-tmp/prebuilt`
4. [zenoh-c][zenoh-repo] -
`conan create --version 1.2.1 zenohcpp-tmp/from-source`
`conan create --version 1.0.1-dev --build=missing up-cpp/developer -o commitish=af55b7899fb8d2e30de1b11f975750e9d1135bbd -o fork=qnx-ports/up-cpp`

#### Zenoh Conan packages

We support two basic zenoh backend (zenoh-c/zenoh-pico),
also to have backward compatibility support temporary zenoh-c packaging.

Building (Temporary) Zenoh Packages
1. [zenoh-c][zenoh-repo] - `conan create --version 1.5.0 zenohc-tmp/prebuilt`
2. [zenoh-cpp][zenoh-repo] -
`conan create --version 1.5.0 zenohcpp-tmp/from-source`

Building Zenoh Packages - with proper zenoh-c backend
1. [zenoh-c][zenoh-repo] - `conan create --version 1.5.0 zenoh-c/prebuilt`
2. [zenoh-cpp][zenoh-repo] -
`conan create --version 1.5.0 zenoh-cpp -o backend=zenoh-c`

Building Zenoh Packages - with proper zenoh-pico backend
1. [zenoh-pico][zenoh-repo] - `conan create --version 1.5.0 zenoh-pico`
2. [zenoh-cpp][zenoh-repo] -
`conan create --version 1.5.0 zenoh-cpp -o backend=zenoh-pico`

**NOTE:** all `conan` commands in this document use Conan 2.x syntax. Please
adjust accordingly when using Conan 1.x.
Expand Down Expand Up @@ -64,14 +81,46 @@ up-transport-zenoh-cpp, follow the steps in the

```bash
cd up-transport-zenoh-cpp

# Default is (Temporary) Zenoh Packages
conan install . --build=missing
# OR explicite zenoh-c backend
conan install . --build=missing -o backend=zenoh-c
# OR explicite zenoh-pico backend
conan install . --build=missing -o backend=zenoh-pico

cmake --preset conan-release
cd build/Release
cmake --build . -- -j
```

Once the build completes, tests can be run with `ctest`.

**NOTE:** If you want to test with zenoh-pico backend you have to run
zenoh-router. Please look at [up-conan-readme][conan-recipe-docs]

### QNX build with conan
```bash
cd up-conan-recipes
conan create --version=3.21.12 --build=missing protobuf
conan config install tools/qnx-8.0-extension/settings_user.yml
conan create -pr:h=tools/profiles/nto-8.0-x86_64 --version=3.21.12 --build=missing protobuf
conan create -pr:h=tools/profiles/nto-8.0-x86_64 --version=1.6.0-alpha4 up-core-api/release/
conan create -pr:h=tools/profiles/nto-8.0-x86_64 --version=1.14.0 gtest

conan create -pr:h=tools/profiles/nto-8.0-x86_64 --version=1.0.1-dev --build=missing up-cpp/developer -o commitish=af55b7899fb8d2e30de1b11f975750e9d1135bbd -o fork=qnx-ports/up-cpp

conan create -pr:h=tools/profiles/nto-8.0-x86_64 --version=1.5.0 zenoh-pico
conan create -pr:h=tools/profiles/nto-8.0-x86_64 --version=1.5.0 -o backend=zenoh-pico zenoh-cpp

cd ../up-transport-zenoh-cpp
conan install -pr:h=../up-conan-recipes/tools/profiles/nto-8.0-x86_64 --build=missing -o backend=zenoh-pico .
cmake --preset conan-release
cd build/Release
cmake --build . -- -j
```


### With dependencies installed as system libraries

**TODO** Verify steps for pure cmake build without Conan.
Expand Down Expand Up @@ -106,3 +155,4 @@ Give a ⭐️ if this project helped you!
[cpp-api-repo]: https://github.com/eclipse-uprotocol/up-cpp
[zenoh-repo]: https://github.com/eclipse-zenoh/zenoh-cpp
[conan-abi-docs]: https://docs.conan.io/en/1.60/howtos/manage_gcc_abi.html
[conan-recipe-docs]: https://github.com/eclipse-uprotocol/up-conan-recipes/blob/main/README.md
60 changes: 60 additions & 0 deletions conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from conan import ConanFile
from conan.tools.cmake import CMakeToolchain, cmake_layout, CMakeDeps
from conan.errors import ConanInvalidConfiguration

class upZenohTransportRecipe(ConanFile):
name = "up-transport-zenoh-cpp"

# Optional metadata
license = "Apache-2.0"
author = "Contributors to the Eclipse Foundation <[email protected]>"
url = "https://github.com/eclipse-uprotocol/up-transport-zenoh-cpp"
description = "This library provides a Zenoh-based uProtocol transport for C++ uEntities"
topics = ("automotive", "iot", "uprotocol", "messaging")

# Binary configuration
settings = "os", "compiler", "build_type", "arch"
options = {
"backend": ["zenoh-c", "zenoh-pico", "zenoh-tmp"],
}

default_options = {
"backend": "zenoh-tmp",
}

def requirements(self):
if "zenoh-tmp" == self.options.backend:
self.requires("zenohcpp/1.5.0")
elif "zenoh-c" == self.options.backend:
self.requires("zenoh-cpp/1.5.0", options={"backend":"zenoh-c"})
self.requires("zenoh-c/1.5.0")
elif "zenoh-pico" == self.options.backend:
self.requires("zenoh-cpp/1.5.0", options={"backend":"zenoh-pico"})
self.requires("zenoh-pico/1.5.0")
else:
raise ConanInvalidConfiguration(f"Zenoh backend: {self.options.backend} is not supported")
self.requires("up-core-api/[~1.6, include_prerelease]")
self.requires("up-cpp/[^1.0, include_prerelease]")
self.requires("spdlog/1.13.0")
self.requires("protobuf/3.21.12")
self.test_requires("gtest/1.14.0")

def layout(self):
cmake_layout(self)

def generate(self):
deps = CMakeDeps(self)
deps.generate()
tc = CMakeToolchain(self)
if "zenoh-tmp" == self.options.backend:
tc.cache_variables["WITH_ZENOH_PICO"] = False
tc.cache_variables["WITH_ZENOH_C"] = False
elif "zenoh-c" == self.options.backend:
tc.cache_variables["WITH_ZENOH_PICO"] = False
tc.cache_variables["WITH_ZENOH_C"] = True
elif "zenoh-pico" == self.options.backend:
tc.cache_variables["WITH_ZENOH_PICO"] = True
tc.cache_variables["WITH_ZENOH_C"] = False
else:
raise ConanInvalidConfiguration(f"Zenoh backend: {self.options.backend} is not supported")
tc.generate()
17 changes: 0 additions & 17 deletions conanfile.txt

This file was deleted.

10 changes: 9 additions & 1 deletion include/up-transport-zenoh-cpp/ZenohUTransport.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

#include <filesystem>
#include <optional>
#include <sstream>

#define ZENOHCXX_ZENOHC
#include <zenoh.hxx>

#include "ThreadSafeMap.h"
Expand All @@ -42,6 +42,13 @@ namespace uprotocol::transport {
/// * [MUST] Throw an exception if the transport fails to initialize or the
/// configuration is invalid.
struct ZenohUTransport : public UTransport {
#ifdef ZENOHCXX_ZENOHPICO
/// @brief Constructor
///
/// @param default_uri Default Authority and Entity (as a UUri) for
/// clients using this transport instance.
explicit ZenohUTransport(const v1::UUri& default_uri);
#else
/// @brief Constructor
///
/// @param default_uri Default Authority and Entity (as a UUri) for
Expand All @@ -51,6 +58,7 @@ struct ZenohUTransport : public UTransport {
ZenohUTransport(const v1::UUri& default_uri,
const std::filesystem::path& config_file);

#endif
~ZenohUTransport() override = default;

protected:
Expand Down
12 changes: 12 additions & 0 deletions src/ZenohUTransport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,17 @@ std::optional<v1::UMessage> ZenohUTransport::queryToUMessage(
return message;
}

#ifdef ZENOHCXX_ZENOHPICO
ZenohUTransport::ZenohUTransport(const v1::UUri& default_uri)
: UTransport(default_uri),
session_(zenoh::Session::open(
zenoh::Config::create_default())) {
// TODO(unknown) add to setup or remove
spdlog::set_level(spdlog::level::debug);

spdlog::info("ZenohUTransport init");
}
#else
ZenohUTransport::ZenohUTransport(const v1::UUri& default_uri,
const std::filesystem::path& config_file)
: UTransport(default_uri),
Expand All @@ -221,6 +232,7 @@ ZenohUTransport::ZenohUTransport(const v1::UUri& default_uri,

spdlog::info("ZenohUTransport init");
}
#endif

v1::UStatus ZenohUTransport::registerPublishNotificationListener_(
const std::string& zenoh_key, CallableConn listener) {
Expand Down
35 changes: 32 additions & 3 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,45 @@ function(add_coverage_test Name)
up-core-api::up-core-api
up-cpp::up-cpp
up-cpp::up-transport-zenoh-cpp
zenohcpp::lib
spdlog::spdlog
protobuf::protobuf
PRIVATE
GTest::gtest_main
GTest::gmock
pthread
)

if(CMAKE_SYSTEM_NAME MATCHES "QNX")
target_link_libraries(${Name} PRIVATE socket)
else()
target_link_libraries(${Name} PRIVATE pthread)
endif()

if(WITH_ZENOH_PICO)
target_link_libraries(${Name}
PUBLIC
zenohpico::lib
zenohcxx::zenohpico
)
elseif(WITH_ZENOH_C)
target_link_libraries(${Name}
PUBLIC
zenohc::lib
zenohcxx::zenohc
)
else()
target_link_libraries(${Name}
PUBLIC
zenohcpp::lib
)
endif()

target_include_directories(${Name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
gtest_discover_tests(${Name} XML_OUTPUT_DIR results)
if(CMAKE_CROSSCOMPILING)
## Workaround for legacy "gtest" tests setup in case of cross-build
gtest_add_tests(TARGET ${Name} SOURCES ${ARGN})
else()
gtest_discover_tests(${Name} XML_OUTPUT_DIR results)
endif()
endfunction()

# NOTE: This is temporarily just a call to add_coverage_test. When coverage
Expand Down
5 changes: 5 additions & 0 deletions test/coverage/ZenohUTransportTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,17 @@ v1::UUri create_uuri(std::string_view serialized) {

// TODO(sashacmc): config generation
TEST_F(TestZenohUTransport, ConstructDestroy) { // NOLINT
#ifdef ZENOHCXX_ZENOHPICO
auto transport = std::make_shared<transport::ZenohUTransport>(
create_uuri(ENTITY_URI_STR));
#else
std::cout << ZENOH_CONFIG_FILE << std::endl;

zenoh::init_log_from_env_or("error");

auto transport = std::make_shared<transport::ZenohUTransport>(
create_uuri(ENTITY_URI_STR), ZENOH_CONFIG_FILE);
#endif
}

struct ExposeKeyString : public transport::ZenohUTransport {
Expand Down
Loading
Loading