Package: libzenohc
Version: 1.0.0.10-1
Architecture: arm64
Maintainer: zenoh-dev@eclipse.org
Installed-Size: 15739
Filename: 1.0.0.10/libzenohc_1.0.0.10-1_arm64.deb
Size: 3833432
MD5sum: 89b10cc0e85d24bfea382075e251e749
SHA1: 87638e45387c0a0c9ed1083fd5a504725b75fb39
SHA256: 8e7a7c11e8d87d6f111aa123e26ce3cd70e4b6a1be089ac9ee0dbc70d8533880
Section: net
Priority: optional
Homepage: http://zenoh.io
Description: The Zenoh C API
 <img
 src="https://raw.githubusercontent.com/eclipse-zenoh/zenoh/main/zenoh-dragon.png"
 height="150">
 .
 [![CI](https://github.com/eclipse-zenoh/zenoh-c/workflows/CI/badge.svg)](https://github.com/eclipse-zenoh/zenoh-c/actions?query=workflow%3A%22CI%22)
 [![Documentation
 Status](https://readthedocs.org/projects/zenoh-c/badge/?version=latest)](https://zenoh-c.readthedocs.io/en/latest/?badge=latest)
 [![Discussion](https://img.shields.io/badge/discussion-on%20github-blue)](https://github.com/eclipse-zenoh/roadmap/discussions)
 [![Discord](https://img.shields.io/badge/chat-on%20discord-blue)](https://discord.gg/2GJ958VuHs)
 [![License](https://img.shields.io/badge/License-EPL%202.0-blue)](https://choosealicense.com/licenses/epl-2.0/)
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
 .
 # Eclipse Zenoh
 .
 The Eclipse Zenoh: Zero Overhead Pub/sub, Store/Query and Compute.
 .
 Zenoh (pronounce _/zeno/_) unifies data in motion, data at rest and
 computations. It carefully blends traditional pub/sub with geo-distributed
 storages, queries and computations, while retaining a level of time and space
 efficiency that is well beyond any of the mainstream stacks.
 .
 Check the website [zenoh.io](http://zenoh.io) and the
 [roadmap](https://github.com/eclipse-zenoh/roadmap) for more detailed
 information.
 .
 -------------------------------
 .
 # C API
 .
 This repository provides a C binding based on the main [Zenoh implementation
 written in Rust](https://github.com/eclipse-zenoh/zenoh).
 .
 -------------------------------
 .
 ## How to build it
 .
 > :warning: **WARNING** :warning: : Zenoh and its ecosystem are under active
 development. When you build from git, make sure you also build from git any
 other Zenoh repository you plan to use (e.g. binding, plugin, backend, etc.).
 It may happen that some changes in git are not compatible with the most recent
 packaged Zenoh release (e.g. deb, docker, pip). We put particular effort in
 maintaining compatibility between the various git repositories in the Zenoh
 project.
 .
 1. Make sure that [Rust](https://www.rust-lang.org) is available on your
 platform.
    Please check [here](https://www.rust-lang.org/tools/install) to learn how to
 install it.
    If you already have the Rust toolchain installed, make sure it is up-to-date
 with:
 .
    ```bash
    rustup update
    ```
 .
 2. Clone the [source] with `git`:
 .
    ```bash
    git clone https://github.com/eclipse-zenoh/zenoh-c.git
    ```
 .
    [source]: https://github.com/eclipse-zenoh/zenoh-c
 .
 3. Build:
 .
    Good CMake practice is to perform build outside of source directory, leaving
 source tree untouched. The examples below demonstrates this mode of building.
 On the other hand VScode by default creates build directory named 'build'
 inside source tree. In this case build script slightly changes its behavior.
 See more about it in section 'VScode'.
 .
    By default build configuration is set to `Release`, it's not necessary to
 add `-DCMAKE_BUILD_TYPE=Release` option on configuration step. But if your
 platform uses multi-config generator by default (this is the case on Windows),
 you may need to add option `--config Release` on build step. See more in CMake
 [build-configurations] documentation. Option`--config Release` is skipped in
 further examples for brewity. It's actually necessary for [Visual Studio
 generators] only. For [Ninja Multi-Config] the build script is able to select
 `Release` as the default configuration.
 .
    ```bash
    mkdir -p build && cd build
    cmake ../zenoh-c
    cmake --build . --config Release
    ```
 .
    The generator to use is selected with option `-G`. If Ninja is installed on
 your system, adding `-GNinja` to `cmake` command can greatly speed up the build
 time:
 .
    ```bash
    cmake ../zenoh-c -GNinja
    cmake --build .
    ```
 .
    Unstable api and/or shared memory support can be enabled by setting
 repectively `ZENOHC_BUILD_WITH_UNSTABLE_API` and
 `ZENOHC_BUILD_WITH_SHARED_MEMORY` Cmake flags to `true` during configuration
 step.
 .
    ```bash
    cmake -DZENOHC_BUILD_WITH_UNSTABLE_API=true
 -DZENOHC_BUILD_WITH_SHARED_MEMORY=true ../zenoh-c
    cmake --build . --config Release
    ```
 .
    [build-configurations]:
 https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#build-configurations
    [Visual Studio generators]:
 https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#id14
    [Ninja Multi-Config]:
 https://cmake.org/cmake/help/latest/generator/Ninja%20Multi-Config.html
 .
 4. Install:
 .
    To install zenoh-c library into system just build target `install`. You need
 root privileges to do it, as the default install location is `/usr/local`.
 .
    ```bash
    cmake --build . --target install
    ```
 .
    If you want to install zenoh-c libraries locally, you can set the
 installation directory with `CMAKE_INSTALL_PREFIX`
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local
    cmake --build . --target install
    ```
 .
    By default only dynamic library is built and installed. Set
 `BUILD_SHARED_LIBS` variable to false to build and install static library:
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local -DBUILD_SHARED_LIBS=FALSE
    cmake --build . --target install
    ```
 .
    The result of installation is the header files in `include` directory, the
 library files in `lib` directory and cmake package configuration files for
 package `zenohc` in `lib/cmake` directory. The library later can be loaded with
 CMake command `find_package(zenohc)`.
    Add dependency in CMakeLists.txt on target
 .
    - `zenohc::shared` for linking dynamic library
    - `zenohc::static` for linking static library
    - `zenohc::lib` for linking static or dynamic library depending on boolean
 variable `BUILD_SHARED_LIBS`
 .
    For `Debug` configuration suffix `d` is added to names of library files
 (libzenohc**d**.so).
 .
 5. VScode
 .
    When zenoh-c project is opened in VSCode the build directory is set to
 `build` inside source tree (this is default behavior of Microsoft [CMake
 Tools]). The project build script detects this situation. In this case it
 places build files in `target` directory and `Cargo.toml` file (which is
 generated from `Cargo.toml.in`) into the root of source tree, as the rust
 developers used to and as the rust build tools expects by default. This
 behavior also can be explicitly enabled by setting
 `ZENOHC_BUILD_IN_SOURCE_TREE` variable to `TRUE`.
 .
    [CMake Tools]:
 https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools
 .
 ## Building the Examples
 .
 The examples can be built in two ways. One is to select `examples` as a build
 target of zenoh-c project (assuming here that the current directory is
 side-by-side with zenoh-c directory):
 .
 ```bash
 cmake ../zenoh-c
 cmake --build . --target examples
 ```
 .
 You may also use `--target <example_name>` if you wish to only build a specific
 example.
 .
 All build artifacts will be in the `target/release/examples` directory in this
 case.
 .
 The second way is to directly build `examples` as a root project:
 .
 ```bash
 cmake ../zenoh-c/examples
 cmake --build .
 ```
 .
 In this case, the examples executables will be built in the current directory.
 .
 As a root project the `examples` project links `zenoh-c` with CMake's
 [add_subdirectory] command by default. There are also other ways to link
 `zenoh-c` - with [find_package] or [FetchContent]:
 .
 [add_subdirectory]:
 https://cmake.org/cmake/help/latest/command/add_subdirectory.html
 [find_package]: https://cmake.org/cmake/help/latest/command/find_package.html
 [FetchContent]: https://cmake.org/cmake/help/latest/module/FetchContent.html
 .
 Link with `zenoh-c` installed into default location in the system (with
 [find_package]):
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 ```
 .
 Link with `zenoh-c` installed in `~/.local` directory:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 -DCMAKE_INSTALL_PREFIX=~/.local
 ```
 .
 Download specific `zenoh-c` version from git with [FetchContent]:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=GIT_URL -DZENOHC_GIT_TAG=0.11.0-rc
 ```
 .
 See also `configure_include_project` function in [helpers.cmake] for more
 information
 .
 [helpers.cmake]: cmake/helpers.cmake
 .
 ## Running the Examples
 .
 ### Basic Pub/Sub Example
 .
 ```bash
 ./target/release/examples/z_sub
 ```
 .
 ```bash
 ./target/release/examples/z_pub
 ```
 .
 ### Queryable and Query Example
 .
 ```bash
 ./target/release/examples/z_queryable
 ```
 .
 ```bash
 ./target/release/examples/z_get
 ```
 .
 ### Running the Throughput Examples
 .
 ```bash
 ./target/release/examples/z_sub_thr
 ```
 .
 ```bash
 ./target/release/examples/z_pub_thr
 ```
 .
 ## API conventions
 .
 Most of the types exposed by the `zenoh-c` API are types for which destruction
 is necessary. To help you spot these types, we name them with the convention
 that any destructible type must start by `z_owned`.
 .
 For maximum performance, we try to make as few copies as possible. Sometimes,
 this implies moving data that you `z_owned`. Any function that takes a
 non-const pointer to a `z_owned` type will perform its destruction. To make
 this pattern more obvious, we encourage you to use the `z_move` macro instead
 of a simple `&` to create these pointers. Rest assured that all `z_owned` types
 are double-free safe, and that you may check whether any `z_owned_X_t` typed
 value is still valid by using `z_X_check(&val)`, or the `z_check(val)` macro if
 you're using C11.
 .
 We hope this convention will help you streamline your memory-safe usage of
 zenoh, as following it should make looking for leaks trivial: simply search for
 paths where a value of a `z_owned` type hasn't been passed to a function using
 `z_move`.
 .
 Functions that simply need to borrow your data will instead take values of the
 associated `z_X_t` type. You may construct them using `z_X_loan(&val)` (or the
 `z_loan(val)` generic macro with C11).
 .
 Note that some `z_X_t` typed values can be constructed without needing to
 `z_borrow` their owned variants. This allows you to reduce the amount of copies
 realized in your program.
 .
 The examples have been written with C11 in mind, using the conventions we
 encourage you to follow.
 .
 Finally, we strongly advise that you refrain from using structure field that
 starts with `_`:
 .
 - We try to maintain a common API between `zenoh-c` and
 [`zenoh-pico`](https://github.com/eclipse-zenoh/zenoh-pico), such that porting
 code from one to the other is, ideally, trivial. However, some types must have
 distinct representations in either library, meaning that using these
 representations explicitly will get you in trouble when porting.
 - We reserve the right to change the memory layout of any type which has
 `_`-prefixed fields, so trying to use them might cause your code to break on
 updates.
 .
 ## Cross-Compilation
 .
 The following alternative options have been introduced to facilitate
 cross-compilation.
 > :warning: **WARNING** :warning: : Perhaps additional efforts are necessary,
 that will depend of your environment.
 .
 - `-DZENOHC_CARGO_CHANNEL="+nightly"|"+beta"|"+stable"`: refers to a specific
 rust toolchain release
 [[rust-channels](https://rust-lang.github.io/rustup/concepts/channels.html)]
 - `-DZENOHC_CARGO_FLAGS`: several optional flags can be used for compilation.
 [[cargo flags](https://doc.rust-lang.org/cargo/commands/cargo-build.html)]
 - `-DZENOHC_CUSTOM_TARGET`: specifies a crosscompilation target. Currently rust
 support several Tire-1, Tire-2 and Tire-3 targets
 [[targets](https://doc.rust-lang.org/nightly/rustc/platform-support.html)]. But
 keep in mind that zenoh-c only have support for following targets:
 `aarch64-unknown-linux-gnu`, `x86_64-unknown-linux-gnu`,
 `arm-unknown-linux-gnueabi`
 .
 Let's put all together in an example:
 Assuming you want to crosscompile for aarch64-unknown-linux-gnu.
 .
 1. Install required packages
    - `sudo apt install gcc-aarch64-linux-gnu`
 2. *(Only if you're using `nightly`)
    - `rustup component add rust-src --toolchain nightly`
 3. Compile Zenoh-C. Assume that it's in `zenoh-c` directory. Notice that build
 in this sample is performed outside of source directory
 .
    ```bash
    export RUSTFLAGS="-Clinker=aarch64-linux-gnu-gcc -Car=aarch64-linux-gnu-ar"
    mkdir -p build && cd build
    cmake ../zenoh-c  -DZENOHC_CARGO_CHANNEL="+nightly"
 -DZENOHC_CARGO_FLAGS="-Zbuild-std=std,panic_abort"
 -DZENOHC_CUSTOM_TARGET="aarch64-unknown-linux-gnu"
 -DCMAKE_INSTALL_PREFIX=../aarch64/stage
    cmake --build . --target install
    ```
 .
 Additionally you can use `RUSTFLAGS` environment variable for lead the
 compilation.
 .
 If all goes right the building files will be located at:
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 and release files will be located at
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 .
 ## Rust Version
 .
 The Rust version we use is defined in
 [rust-toolchain.toml](rust-toolchain.toml), which is `1.72.0`.
 There might be some memory mapping issue if you use the later version.
 .
 You can also specify the Rust version.
 .
 ```bash
 cmake ../zenoh-c -DZENOHC_CARGO_CHANNEL="+1.72.0"
 ```
 .
 ## Zenoh features support (enabling/disabling protocols, etc)
 .
 It's necessary sometimes to build zenoh-c library with set of features
 different from default. For example: enable TCP and UDP only. This can be done
 by changing `ZENOHC_CARGO_FLAGS` parameter for cmake (notice ";" instead of
 space due to cmake peculiarities)
 .
 Available features can be found in [Cargo.toml](./Cargo.toml)
 ```bash
 cmake ../zenoh-c
 -DZENOHC_CARGO_FLAGS="--no-default-features;--features=transport_tcp,transport_udp"
 ```
 .
 ## Versioning
 .
 Being a CMake project, zenoh-c is limited to the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme [inherent
 to CMake](https://gitlab.kitware.com/cmake/cmake/-/issues/16716). However,
 zenoh-c also incorporates
 a Cargo package which cannot be versionned with the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme (not
 SemVer compatible). Hence zenoh-c uses a one-to-one mapping between CMake
 versions and SemVer versions:
 .
 | CMake version           | SemVer equivalent | Meaning              |
 |-------------------------|-------------------|----------------------|
 | `1.2.3`                 | `1.2.3`           | Release version      |
 | `1.2.3.0`               | `1.2.3-dev`       | Developement version |
 | `1.2.3.x if x >= 1`     | `1.2.3-pre.x`     | Pre-release version  |
Vcs-Browser: https://github.com/eclipse-zenoh/zenoh-c
Vcs-Git: https://github.com/eclipse-zenoh/zenoh-c

Package: libzenohc
Version: 1.0.0.10-1
Architecture: armhf
Maintainer: zenoh-dev@eclipse.org
Installed-Size: 16646
Filename: 1.0.0.10/libzenohc_1.0.0.10-1_armhf.deb
Size: 4147316
MD5sum: e643afaced5d5411019bc65a233201c0
SHA1: 6605375b86992cbf1446fbfd614e10152a80911b
SHA256: 169a2e06ff440220fffbbc6e0931bd106908c577b595e89257c304396819f9b0
Section: net
Priority: optional
Homepage: http://zenoh.io
Description: The Zenoh C API
 <img
 src="https://raw.githubusercontent.com/eclipse-zenoh/zenoh/main/zenoh-dragon.png"
 height="150">
 .
 [![CI](https://github.com/eclipse-zenoh/zenoh-c/workflows/CI/badge.svg)](https://github.com/eclipse-zenoh/zenoh-c/actions?query=workflow%3A%22CI%22)
 [![Documentation
 Status](https://readthedocs.org/projects/zenoh-c/badge/?version=latest)](https://zenoh-c.readthedocs.io/en/latest/?badge=latest)
 [![Discussion](https://img.shields.io/badge/discussion-on%20github-blue)](https://github.com/eclipse-zenoh/roadmap/discussions)
 [![Discord](https://img.shields.io/badge/chat-on%20discord-blue)](https://discord.gg/2GJ958VuHs)
 [![License](https://img.shields.io/badge/License-EPL%202.0-blue)](https://choosealicense.com/licenses/epl-2.0/)
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
 .
 # Eclipse Zenoh
 .
 The Eclipse Zenoh: Zero Overhead Pub/sub, Store/Query and Compute.
 .
 Zenoh (pronounce _/zeno/_) unifies data in motion, data at rest and
 computations. It carefully blends traditional pub/sub with geo-distributed
 storages, queries and computations, while retaining a level of time and space
 efficiency that is well beyond any of the mainstream stacks.
 .
 Check the website [zenoh.io](http://zenoh.io) and the
 [roadmap](https://github.com/eclipse-zenoh/roadmap) for more detailed
 information.
 .
 -------------------------------
 .
 # C API
 .
 This repository provides a C binding based on the main [Zenoh implementation
 written in Rust](https://github.com/eclipse-zenoh/zenoh).
 .
 -------------------------------
 .
 ## How to build it
 .
 > :warning: **WARNING** :warning: : Zenoh and its ecosystem are under active
 development. When you build from git, make sure you also build from git any
 other Zenoh repository you plan to use (e.g. binding, plugin, backend, etc.).
 It may happen that some changes in git are not compatible with the most recent
 packaged Zenoh release (e.g. deb, docker, pip). We put particular effort in
 maintaining compatibility between the various git repositories in the Zenoh
 project.
 .
 1. Make sure that [Rust](https://www.rust-lang.org) is available on your
 platform.
    Please check [here](https://www.rust-lang.org/tools/install) to learn how to
 install it.
    If you already have the Rust toolchain installed, make sure it is up-to-date
 with:
 .
    ```bash
    rustup update
    ```
 .
 2. Clone the [source] with `git`:
 .
    ```bash
    git clone https://github.com/eclipse-zenoh/zenoh-c.git
    ```
 .
    [source]: https://github.com/eclipse-zenoh/zenoh-c
 .
 3. Build:
 .
    Good CMake practice is to perform build outside of source directory, leaving
 source tree untouched. The examples below demonstrates this mode of building.
 On the other hand VScode by default creates build directory named 'build'
 inside source tree. In this case build script slightly changes its behavior.
 See more about it in section 'VScode'.
 .
    By default build configuration is set to `Release`, it's not necessary to
 add `-DCMAKE_BUILD_TYPE=Release` option on configuration step. But if your
 platform uses multi-config generator by default (this is the case on Windows),
 you may need to add option `--config Release` on build step. See more in CMake
 [build-configurations] documentation. Option`--config Release` is skipped in
 further examples for brewity. It's actually necessary for [Visual Studio
 generators] only. For [Ninja Multi-Config] the build script is able to select
 `Release` as the default configuration.
 .
    ```bash
    mkdir -p build && cd build
    cmake ../zenoh-c
    cmake --build . --config Release
    ```
 .
    The generator to use is selected with option `-G`. If Ninja is installed on
 your system, adding `-GNinja` to `cmake` command can greatly speed up the build
 time:
 .
    ```bash
    cmake ../zenoh-c -GNinja
    cmake --build .
    ```
 .
    Unstable api and/or shared memory support can be enabled by setting
 repectively `ZENOHC_BUILD_WITH_UNSTABLE_API` and
 `ZENOHC_BUILD_WITH_SHARED_MEMORY` Cmake flags to `true` during configuration
 step.
 .
    ```bash
    cmake -DZENOHC_BUILD_WITH_UNSTABLE_API=true
 -DZENOHC_BUILD_WITH_SHARED_MEMORY=true ../zenoh-c
    cmake --build . --config Release
    ```
 .
    [build-configurations]:
 https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#build-configurations
    [Visual Studio generators]:
 https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#id14
    [Ninja Multi-Config]:
 https://cmake.org/cmake/help/latest/generator/Ninja%20Multi-Config.html
 .
 4. Install:
 .
    To install zenoh-c library into system just build target `install`. You need
 root privileges to do it, as the default install location is `/usr/local`.
 .
    ```bash
    cmake --build . --target install
    ```
 .
    If you want to install zenoh-c libraries locally, you can set the
 installation directory with `CMAKE_INSTALL_PREFIX`
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local
    cmake --build . --target install
    ```
 .
    By default only dynamic library is built and installed. Set
 `BUILD_SHARED_LIBS` variable to false to build and install static library:
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local -DBUILD_SHARED_LIBS=FALSE
    cmake --build . --target install
    ```
 .
    The result of installation is the header files in `include` directory, the
 library files in `lib` directory and cmake package configuration files for
 package `zenohc` in `lib/cmake` directory. The library later can be loaded with
 CMake command `find_package(zenohc)`.
    Add dependency in CMakeLists.txt on target
 .
    - `zenohc::shared` for linking dynamic library
    - `zenohc::static` for linking static library
    - `zenohc::lib` for linking static or dynamic library depending on boolean
 variable `BUILD_SHARED_LIBS`
 .
    For `Debug` configuration suffix `d` is added to names of library files
 (libzenohc**d**.so).
 .
 5. VScode
 .
    When zenoh-c project is opened in VSCode the build directory is set to
 `build` inside source tree (this is default behavior of Microsoft [CMake
 Tools]). The project build script detects this situation. In this case it
 places build files in `target` directory and `Cargo.toml` file (which is
 generated from `Cargo.toml.in`) into the root of source tree, as the rust
 developers used to and as the rust build tools expects by default. This
 behavior also can be explicitly enabled by setting
 `ZENOHC_BUILD_IN_SOURCE_TREE` variable to `TRUE`.
 .
    [CMake Tools]:
 https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools
 .
 ## Building the Examples
 .
 The examples can be built in two ways. One is to select `examples` as a build
 target of zenoh-c project (assuming here that the current directory is
 side-by-side with zenoh-c directory):
 .
 ```bash
 cmake ../zenoh-c
 cmake --build . --target examples
 ```
 .
 You may also use `--target <example_name>` if you wish to only build a specific
 example.
 .
 All build artifacts will be in the `target/release/examples` directory in this
 case.
 .
 The second way is to directly build `examples` as a root project:
 .
 ```bash
 cmake ../zenoh-c/examples
 cmake --build .
 ```
 .
 In this case, the examples executables will be built in the current directory.
 .
 As a root project the `examples` project links `zenoh-c` with CMake's
 [add_subdirectory] command by default. There are also other ways to link
 `zenoh-c` - with [find_package] or [FetchContent]:
 .
 [add_subdirectory]:
 https://cmake.org/cmake/help/latest/command/add_subdirectory.html
 [find_package]: https://cmake.org/cmake/help/latest/command/find_package.html
 [FetchContent]: https://cmake.org/cmake/help/latest/module/FetchContent.html
 .
 Link with `zenoh-c` installed into default location in the system (with
 [find_package]):
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 ```
 .
 Link with `zenoh-c` installed in `~/.local` directory:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 -DCMAKE_INSTALL_PREFIX=~/.local
 ```
 .
 Download specific `zenoh-c` version from git with [FetchContent]:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=GIT_URL -DZENOHC_GIT_TAG=0.11.0-rc
 ```
 .
 See also `configure_include_project` function in [helpers.cmake] for more
 information
 .
 [helpers.cmake]: cmake/helpers.cmake
 .
 ## Running the Examples
 .
 ### Basic Pub/Sub Example
 .
 ```bash
 ./target/release/examples/z_sub
 ```
 .
 ```bash
 ./target/release/examples/z_pub
 ```
 .
 ### Queryable and Query Example
 .
 ```bash
 ./target/release/examples/z_queryable
 ```
 .
 ```bash
 ./target/release/examples/z_get
 ```
 .
 ### Running the Throughput Examples
 .
 ```bash
 ./target/release/examples/z_sub_thr
 ```
 .
 ```bash
 ./target/release/examples/z_pub_thr
 ```
 .
 ## API conventions
 .
 Most of the types exposed by the `zenoh-c` API are types for which destruction
 is necessary. To help you spot these types, we name them with the convention
 that any destructible type must start by `z_owned`.
 .
 For maximum performance, we try to make as few copies as possible. Sometimes,
 this implies moving data that you `z_owned`. Any function that takes a
 non-const pointer to a `z_owned` type will perform its destruction. To make
 this pattern more obvious, we encourage you to use the `z_move` macro instead
 of a simple `&` to create these pointers. Rest assured that all `z_owned` types
 are double-free safe, and that you may check whether any `z_owned_X_t` typed
 value is still valid by using `z_X_check(&val)`, or the `z_check(val)` macro if
 you're using C11.
 .
 We hope this convention will help you streamline your memory-safe usage of
 zenoh, as following it should make looking for leaks trivial: simply search for
 paths where a value of a `z_owned` type hasn't been passed to a function using
 `z_move`.
 .
 Functions that simply need to borrow your data will instead take values of the
 associated `z_X_t` type. You may construct them using `z_X_loan(&val)` (or the
 `z_loan(val)` generic macro with C11).
 .
 Note that some `z_X_t` typed values can be constructed without needing to
 `z_borrow` their owned variants. This allows you to reduce the amount of copies
 realized in your program.
 .
 The examples have been written with C11 in mind, using the conventions we
 encourage you to follow.
 .
 Finally, we strongly advise that you refrain from using structure field that
 starts with `_`:
 .
 - We try to maintain a common API between `zenoh-c` and
 [`zenoh-pico`](https://github.com/eclipse-zenoh/zenoh-pico), such that porting
 code from one to the other is, ideally, trivial. However, some types must have
 distinct representations in either library, meaning that using these
 representations explicitly will get you in trouble when porting.
 - We reserve the right to change the memory layout of any type which has
 `_`-prefixed fields, so trying to use them might cause your code to break on
 updates.
 .
 ## Cross-Compilation
 .
 The following alternative options have been introduced to facilitate
 cross-compilation.
 > :warning: **WARNING** :warning: : Perhaps additional efforts are necessary,
 that will depend of your environment.
 .
 - `-DZENOHC_CARGO_CHANNEL="+nightly"|"+beta"|"+stable"`: refers to a specific
 rust toolchain release
 [[rust-channels](https://rust-lang.github.io/rustup/concepts/channels.html)]
 - `-DZENOHC_CARGO_FLAGS`: several optional flags can be used for compilation.
 [[cargo flags](https://doc.rust-lang.org/cargo/commands/cargo-build.html)]
 - `-DZENOHC_CUSTOM_TARGET`: specifies a crosscompilation target. Currently rust
 support several Tire-1, Tire-2 and Tire-3 targets
 [[targets](https://doc.rust-lang.org/nightly/rustc/platform-support.html)]. But
 keep in mind that zenoh-c only have support for following targets:
 `aarch64-unknown-linux-gnu`, `x86_64-unknown-linux-gnu`,
 `arm-unknown-linux-gnueabi`
 .
 Let's put all together in an example:
 Assuming you want to crosscompile for aarch64-unknown-linux-gnu.
 .
 1. Install required packages
    - `sudo apt install gcc-aarch64-linux-gnu`
 2. *(Only if you're using `nightly`)
    - `rustup component add rust-src --toolchain nightly`
 3. Compile Zenoh-C. Assume that it's in `zenoh-c` directory. Notice that build
 in this sample is performed outside of source directory
 .
    ```bash
    export RUSTFLAGS="-Clinker=aarch64-linux-gnu-gcc -Car=aarch64-linux-gnu-ar"
    mkdir -p build && cd build
    cmake ../zenoh-c  -DZENOHC_CARGO_CHANNEL="+nightly"
 -DZENOHC_CARGO_FLAGS="-Zbuild-std=std,panic_abort"
 -DZENOHC_CUSTOM_TARGET="aarch64-unknown-linux-gnu"
 -DCMAKE_INSTALL_PREFIX=../aarch64/stage
    cmake --build . --target install
    ```
 .
 Additionally you can use `RUSTFLAGS` environment variable for lead the
 compilation.
 .
 If all goes right the building files will be located at:
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 and release files will be located at
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 .
 ## Rust Version
 .
 The Rust version we use is defined in
 [rust-toolchain.toml](rust-toolchain.toml), which is `1.72.0`.
 There might be some memory mapping issue if you use the later version.
 .
 You can also specify the Rust version.
 .
 ```bash
 cmake ../zenoh-c -DZENOHC_CARGO_CHANNEL="+1.72.0"
 ```
 .
 ## Zenoh features support (enabling/disabling protocols, etc)
 .
 It's necessary sometimes to build zenoh-c library with set of features
 different from default. For example: enable TCP and UDP only. This can be done
 by changing `ZENOHC_CARGO_FLAGS` parameter for cmake (notice ";" instead of
 space due to cmake peculiarities)
 .
 Available features can be found in [Cargo.toml](./Cargo.toml)
 ```bash
 cmake ../zenoh-c
 -DZENOHC_CARGO_FLAGS="--no-default-features;--features=transport_tcp,transport_udp"
 ```
 .
 ## Versioning
 .
 Being a CMake project, zenoh-c is limited to the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme [inherent
 to CMake](https://gitlab.kitware.com/cmake/cmake/-/issues/16716). However,
 zenoh-c also incorporates
 a Cargo package which cannot be versionned with the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme (not
 SemVer compatible). Hence zenoh-c uses a one-to-one mapping between CMake
 versions and SemVer versions:
 .
 | CMake version           | SemVer equivalent | Meaning              |
 |-------------------------|-------------------|----------------------|
 | `1.2.3`                 | `1.2.3`           | Release version      |
 | `1.2.3.0`               | `1.2.3-dev`       | Developement version |
 | `1.2.3.x if x >= 1`     | `1.2.3-pre.x`     | Pre-release version  |
Vcs-Browser: https://github.com/eclipse-zenoh/zenoh-c
Vcs-Git: https://github.com/eclipse-zenoh/zenoh-c

Package: libzenohc
Version: 1.0.0.10-1
Architecture: armel
Maintainer: zenoh-dev@eclipse.org
Installed-Size: 16862
Filename: 1.0.0.10/libzenohc_1.0.0.10-1_armel.deb
Size: 4114668
MD5sum: 427d539eb9895ec670df3684600468c4
SHA1: 0fc0058bb19f6f4896b3c5ebca91b641c6488a11
SHA256: 5ba15109601aa22df2f67e7ad133577c2d4c8274d8a4c39466a85fdd93be8d39
Section: net
Priority: optional
Homepage: http://zenoh.io
Description: The Zenoh C API
 <img
 src="https://raw.githubusercontent.com/eclipse-zenoh/zenoh/main/zenoh-dragon.png"
 height="150">
 .
 [![CI](https://github.com/eclipse-zenoh/zenoh-c/workflows/CI/badge.svg)](https://github.com/eclipse-zenoh/zenoh-c/actions?query=workflow%3A%22CI%22)
 [![Documentation
 Status](https://readthedocs.org/projects/zenoh-c/badge/?version=latest)](https://zenoh-c.readthedocs.io/en/latest/?badge=latest)
 [![Discussion](https://img.shields.io/badge/discussion-on%20github-blue)](https://github.com/eclipse-zenoh/roadmap/discussions)
 [![Discord](https://img.shields.io/badge/chat-on%20discord-blue)](https://discord.gg/2GJ958VuHs)
 [![License](https://img.shields.io/badge/License-EPL%202.0-blue)](https://choosealicense.com/licenses/epl-2.0/)
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
 .
 # Eclipse Zenoh
 .
 The Eclipse Zenoh: Zero Overhead Pub/sub, Store/Query and Compute.
 .
 Zenoh (pronounce _/zeno/_) unifies data in motion, data at rest and
 computations. It carefully blends traditional pub/sub with geo-distributed
 storages, queries and computations, while retaining a level of time and space
 efficiency that is well beyond any of the mainstream stacks.
 .
 Check the website [zenoh.io](http://zenoh.io) and the
 [roadmap](https://github.com/eclipse-zenoh/roadmap) for more detailed
 information.
 .
 -------------------------------
 .
 # C API
 .
 This repository provides a C binding based on the main [Zenoh implementation
 written in Rust](https://github.com/eclipse-zenoh/zenoh).
 .
 -------------------------------
 .
 ## How to build it
 .
 > :warning: **WARNING** :warning: : Zenoh and its ecosystem are under active
 development. When you build from git, make sure you also build from git any
 other Zenoh repository you plan to use (e.g. binding, plugin, backend, etc.).
 It may happen that some changes in git are not compatible with the most recent
 packaged Zenoh release (e.g. deb, docker, pip). We put particular effort in
 maintaining compatibility between the various git repositories in the Zenoh
 project.
 .
 1. Make sure that [Rust](https://www.rust-lang.org) is available on your
 platform.
    Please check [here](https://www.rust-lang.org/tools/install) to learn how to
 install it.
    If you already have the Rust toolchain installed, make sure it is up-to-date
 with:
 .
    ```bash
    rustup update
    ```
 .
 2. Clone the [source] with `git`:
 .
    ```bash
    git clone https://github.com/eclipse-zenoh/zenoh-c.git
    ```
 .
    [source]: https://github.com/eclipse-zenoh/zenoh-c
 .
 3. Build:
 .
    Good CMake practice is to perform build outside of source directory, leaving
 source tree untouched. The examples below demonstrates this mode of building.
 On the other hand VScode by default creates build directory named 'build'
 inside source tree. In this case build script slightly changes its behavior.
 See more about it in section 'VScode'.
 .
    By default build configuration is set to `Release`, it's not necessary to
 add `-DCMAKE_BUILD_TYPE=Release` option on configuration step. But if your
 platform uses multi-config generator by default (this is the case on Windows),
 you may need to add option `--config Release` on build step. See more in CMake
 [build-configurations] documentation. Option`--config Release` is skipped in
 further examples for brewity. It's actually necessary for [Visual Studio
 generators] only. For [Ninja Multi-Config] the build script is able to select
 `Release` as the default configuration.
 .
    ```bash
    mkdir -p build && cd build
    cmake ../zenoh-c
    cmake --build . --config Release
    ```
 .
    The generator to use is selected with option `-G`. If Ninja is installed on
 your system, adding `-GNinja` to `cmake` command can greatly speed up the build
 time:
 .
    ```bash
    cmake ../zenoh-c -GNinja
    cmake --build .
    ```
 .
    Unstable api and/or shared memory support can be enabled by setting
 repectively `ZENOHC_BUILD_WITH_UNSTABLE_API` and
 `ZENOHC_BUILD_WITH_SHARED_MEMORY` Cmake flags to `true` during configuration
 step.
 .
    ```bash
    cmake -DZENOHC_BUILD_WITH_UNSTABLE_API=true
 -DZENOHC_BUILD_WITH_SHARED_MEMORY=true ../zenoh-c
    cmake --build . --config Release
    ```
 .
    [build-configurations]:
 https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#build-configurations
    [Visual Studio generators]:
 https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#id14
    [Ninja Multi-Config]:
 https://cmake.org/cmake/help/latest/generator/Ninja%20Multi-Config.html
 .
 4. Install:
 .
    To install zenoh-c library into system just build target `install`. You need
 root privileges to do it, as the default install location is `/usr/local`.
 .
    ```bash
    cmake --build . --target install
    ```
 .
    If you want to install zenoh-c libraries locally, you can set the
 installation directory with `CMAKE_INSTALL_PREFIX`
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local
    cmake --build . --target install
    ```
 .
    By default only dynamic library is built and installed. Set
 `BUILD_SHARED_LIBS` variable to false to build and install static library:
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local -DBUILD_SHARED_LIBS=FALSE
    cmake --build . --target install
    ```
 .
    The result of installation is the header files in `include` directory, the
 library files in `lib` directory and cmake package configuration files for
 package `zenohc` in `lib/cmake` directory. The library later can be loaded with
 CMake command `find_package(zenohc)`.
    Add dependency in CMakeLists.txt on target
 .
    - `zenohc::shared` for linking dynamic library
    - `zenohc::static` for linking static library
    - `zenohc::lib` for linking static or dynamic library depending on boolean
 variable `BUILD_SHARED_LIBS`
 .
    For `Debug` configuration suffix `d` is added to names of library files
 (libzenohc**d**.so).
 .
 5. VScode
 .
    When zenoh-c project is opened in VSCode the build directory is set to
 `build` inside source tree (this is default behavior of Microsoft [CMake
 Tools]). The project build script detects this situation. In this case it
 places build files in `target` directory and `Cargo.toml` file (which is
 generated from `Cargo.toml.in`) into the root of source tree, as the rust
 developers used to and as the rust build tools expects by default. This
 behavior also can be explicitly enabled by setting
 `ZENOHC_BUILD_IN_SOURCE_TREE` variable to `TRUE`.
 .
    [CMake Tools]:
 https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools
 .
 ## Building the Examples
 .
 The examples can be built in two ways. One is to select `examples` as a build
 target of zenoh-c project (assuming here that the current directory is
 side-by-side with zenoh-c directory):
 .
 ```bash
 cmake ../zenoh-c
 cmake --build . --target examples
 ```
 .
 You may also use `--target <example_name>` if you wish to only build a specific
 example.
 .
 All build artifacts will be in the `target/release/examples` directory in this
 case.
 .
 The second way is to directly build `examples` as a root project:
 .
 ```bash
 cmake ../zenoh-c/examples
 cmake --build .
 ```
 .
 In this case, the examples executables will be built in the current directory.
 .
 As a root project the `examples` project links `zenoh-c` with CMake's
 [add_subdirectory] command by default. There are also other ways to link
 `zenoh-c` - with [find_package] or [FetchContent]:
 .
 [add_subdirectory]:
 https://cmake.org/cmake/help/latest/command/add_subdirectory.html
 [find_package]: https://cmake.org/cmake/help/latest/command/find_package.html
 [FetchContent]: https://cmake.org/cmake/help/latest/module/FetchContent.html
 .
 Link with `zenoh-c` installed into default location in the system (with
 [find_package]):
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 ```
 .
 Link with `zenoh-c` installed in `~/.local` directory:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 -DCMAKE_INSTALL_PREFIX=~/.local
 ```
 .
 Download specific `zenoh-c` version from git with [FetchContent]:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=GIT_URL -DZENOHC_GIT_TAG=0.11.0-rc
 ```
 .
 See also `configure_include_project` function in [helpers.cmake] for more
 information
 .
 [helpers.cmake]: cmake/helpers.cmake
 .
 ## Running the Examples
 .
 ### Basic Pub/Sub Example
 .
 ```bash
 ./target/release/examples/z_sub
 ```
 .
 ```bash
 ./target/release/examples/z_pub
 ```
 .
 ### Queryable and Query Example
 .
 ```bash
 ./target/release/examples/z_queryable
 ```
 .
 ```bash
 ./target/release/examples/z_get
 ```
 .
 ### Running the Throughput Examples
 .
 ```bash
 ./target/release/examples/z_sub_thr
 ```
 .
 ```bash
 ./target/release/examples/z_pub_thr
 ```
 .
 ## API conventions
 .
 Most of the types exposed by the `zenoh-c` API are types for which destruction
 is necessary. To help you spot these types, we name them with the convention
 that any destructible type must start by `z_owned`.
 .
 For maximum performance, we try to make as few copies as possible. Sometimes,
 this implies moving data that you `z_owned`. Any function that takes a
 non-const pointer to a `z_owned` type will perform its destruction. To make
 this pattern more obvious, we encourage you to use the `z_move` macro instead
 of a simple `&` to create these pointers. Rest assured that all `z_owned` types
 are double-free safe, and that you may check whether any `z_owned_X_t` typed
 value is still valid by using `z_X_check(&val)`, or the `z_check(val)` macro if
 you're using C11.
 .
 We hope this convention will help you streamline your memory-safe usage of
 zenoh, as following it should make looking for leaks trivial: simply search for
 paths where a value of a `z_owned` type hasn't been passed to a function using
 `z_move`.
 .
 Functions that simply need to borrow your data will instead take values of the
 associated `z_X_t` type. You may construct them using `z_X_loan(&val)` (or the
 `z_loan(val)` generic macro with C11).
 .
 Note that some `z_X_t` typed values can be constructed without needing to
 `z_borrow` their owned variants. This allows you to reduce the amount of copies
 realized in your program.
 .
 The examples have been written with C11 in mind, using the conventions we
 encourage you to follow.
 .
 Finally, we strongly advise that you refrain from using structure field that
 starts with `_`:
 .
 - We try to maintain a common API between `zenoh-c` and
 [`zenoh-pico`](https://github.com/eclipse-zenoh/zenoh-pico), such that porting
 code from one to the other is, ideally, trivial. However, some types must have
 distinct representations in either library, meaning that using these
 representations explicitly will get you in trouble when porting.
 - We reserve the right to change the memory layout of any type which has
 `_`-prefixed fields, so trying to use them might cause your code to break on
 updates.
 .
 ## Cross-Compilation
 .
 The following alternative options have been introduced to facilitate
 cross-compilation.
 > :warning: **WARNING** :warning: : Perhaps additional efforts are necessary,
 that will depend of your environment.
 .
 - `-DZENOHC_CARGO_CHANNEL="+nightly"|"+beta"|"+stable"`: refers to a specific
 rust toolchain release
 [[rust-channels](https://rust-lang.github.io/rustup/concepts/channels.html)]
 - `-DZENOHC_CARGO_FLAGS`: several optional flags can be used for compilation.
 [[cargo flags](https://doc.rust-lang.org/cargo/commands/cargo-build.html)]
 - `-DZENOHC_CUSTOM_TARGET`: specifies a crosscompilation target. Currently rust
 support several Tire-1, Tire-2 and Tire-3 targets
 [[targets](https://doc.rust-lang.org/nightly/rustc/platform-support.html)]. But
 keep in mind that zenoh-c only have support for following targets:
 `aarch64-unknown-linux-gnu`, `x86_64-unknown-linux-gnu`,
 `arm-unknown-linux-gnueabi`
 .
 Let's put all together in an example:
 Assuming you want to crosscompile for aarch64-unknown-linux-gnu.
 .
 1. Install required packages
    - `sudo apt install gcc-aarch64-linux-gnu`
 2. *(Only if you're using `nightly`)
    - `rustup component add rust-src --toolchain nightly`
 3. Compile Zenoh-C. Assume that it's in `zenoh-c` directory. Notice that build
 in this sample is performed outside of source directory
 .
    ```bash
    export RUSTFLAGS="-Clinker=aarch64-linux-gnu-gcc -Car=aarch64-linux-gnu-ar"
    mkdir -p build && cd build
    cmake ../zenoh-c  -DZENOHC_CARGO_CHANNEL="+nightly"
 -DZENOHC_CARGO_FLAGS="-Zbuild-std=std,panic_abort"
 -DZENOHC_CUSTOM_TARGET="aarch64-unknown-linux-gnu"
 -DCMAKE_INSTALL_PREFIX=../aarch64/stage
    cmake --build . --target install
    ```
 .
 Additionally you can use `RUSTFLAGS` environment variable for lead the
 compilation.
 .
 If all goes right the building files will be located at:
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 and release files will be located at
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 .
 ## Rust Version
 .
 The Rust version we use is defined in
 [rust-toolchain.toml](rust-toolchain.toml), which is `1.72.0`.
 There might be some memory mapping issue if you use the later version.
 .
 You can also specify the Rust version.
 .
 ```bash
 cmake ../zenoh-c -DZENOHC_CARGO_CHANNEL="+1.72.0"
 ```
 .
 ## Zenoh features support (enabling/disabling protocols, etc)
 .
 It's necessary sometimes to build zenoh-c library with set of features
 different from default. For example: enable TCP and UDP only. This can be done
 by changing `ZENOHC_CARGO_FLAGS` parameter for cmake (notice ";" instead of
 space due to cmake peculiarities)
 .
 Available features can be found in [Cargo.toml](./Cargo.toml)
 ```bash
 cmake ../zenoh-c
 -DZENOHC_CARGO_FLAGS="--no-default-features;--features=transport_tcp,transport_udp"
 ```
 .
 ## Versioning
 .
 Being a CMake project, zenoh-c is limited to the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme [inherent
 to CMake](https://gitlab.kitware.com/cmake/cmake/-/issues/16716). However,
 zenoh-c also incorporates
 a Cargo package which cannot be versionned with the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme (not
 SemVer compatible). Hence zenoh-c uses a one-to-one mapping between CMake
 versions and SemVer versions:
 .
 | CMake version           | SemVer equivalent | Meaning              |
 |-------------------------|-------------------|----------------------|
 | `1.2.3`                 | `1.2.3`           | Release version      |
 | `1.2.3.0`               | `1.2.3-dev`       | Developement version |
 | `1.2.3.x if x >= 1`     | `1.2.3-pre.x`     | Pre-release version  |
Vcs-Browser: https://github.com/eclipse-zenoh/zenoh-c
Vcs-Git: https://github.com/eclipse-zenoh/zenoh-c

Package: libzenohc
Version: 1.0.0.10-1
Architecture: amd64
Maintainer: zenoh-dev@eclipse.org
Installed-Size: 17292
Depends: libc6 (>= 2.29)
Filename: 1.0.0.10/libzenohc_1.0.0.10-1_amd64.deb
Size: 4252368
MD5sum: 9ab053786eafdf61196377a661bfae3f
SHA1: 4e87b184b510061126a8a75dfd893e7ae5cd85f3
SHA256: 63676648574cbd6de6f2abeb7abc89b04ea1b5832ea280989a6add49388cdeae
Section: net
Priority: optional
Homepage: http://zenoh.io
Description: The Zenoh C API
 <img
 src="https://raw.githubusercontent.com/eclipse-zenoh/zenoh/main/zenoh-dragon.png"
 height="150">
 .
 [![CI](https://github.com/eclipse-zenoh/zenoh-c/workflows/CI/badge.svg)](https://github.com/eclipse-zenoh/zenoh-c/actions?query=workflow%3A%22CI%22)
 [![Documentation
 Status](https://readthedocs.org/projects/zenoh-c/badge/?version=latest)](https://zenoh-c.readthedocs.io/en/latest/?badge=latest)
 [![Discussion](https://img.shields.io/badge/discussion-on%20github-blue)](https://github.com/eclipse-zenoh/roadmap/discussions)
 [![Discord](https://img.shields.io/badge/chat-on%20discord-blue)](https://discord.gg/2GJ958VuHs)
 [![License](https://img.shields.io/badge/License-EPL%202.0-blue)](https://choosealicense.com/licenses/epl-2.0/)
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
 .
 # Eclipse Zenoh
 .
 The Eclipse Zenoh: Zero Overhead Pub/sub, Store/Query and Compute.
 .
 Zenoh (pronounce _/zeno/_) unifies data in motion, data at rest and
 computations. It carefully blends traditional pub/sub with geo-distributed
 storages, queries and computations, while retaining a level of time and space
 efficiency that is well beyond any of the mainstream stacks.
 .
 Check the website [zenoh.io](http://zenoh.io) and the
 [roadmap](https://github.com/eclipse-zenoh/roadmap) for more detailed
 information.
 .
 -------------------------------
 .
 # C API
 .
 This repository provides a C binding based on the main [Zenoh implementation
 written in Rust](https://github.com/eclipse-zenoh/zenoh).
 .
 -------------------------------
 .
 ## How to build it
 .
 > :warning: **WARNING** :warning: : Zenoh and its ecosystem are under active
 development. When you build from git, make sure you also build from git any
 other Zenoh repository you plan to use (e.g. binding, plugin, backend, etc.).
 It may happen that some changes in git are not compatible with the most recent
 packaged Zenoh release (e.g. deb, docker, pip). We put particular effort in
 maintaining compatibility between the various git repositories in the Zenoh
 project.
 .
 1. Make sure that [Rust](https://www.rust-lang.org) is available on your
 platform.
    Please check [here](https://www.rust-lang.org/tools/install) to learn how to
 install it.
    If you already have the Rust toolchain installed, make sure it is up-to-date
 with:
 .
    ```bash
    rustup update
    ```
 .
 2. Clone the [source] with `git`:
 .
    ```bash
    git clone https://github.com/eclipse-zenoh/zenoh-c.git
    ```
 .
    [source]: https://github.com/eclipse-zenoh/zenoh-c
 .
 3. Build:
 .
    Good CMake practice is to perform build outside of source directory, leaving
 source tree untouched. The examples below demonstrates this mode of building.
 On the other hand VScode by default creates build directory named 'build'
 inside source tree. In this case build script slightly changes its behavior.
 See more about it in section 'VScode'.
 .
    By default build configuration is set to `Release`, it's not necessary to
 add `-DCMAKE_BUILD_TYPE=Release` option on configuration step. But if your
 platform uses multi-config generator by default (this is the case on Windows),
 you may need to add option `--config Release` on build step. See more in CMake
 [build-configurations] documentation. Option`--config Release` is skipped in
 further examples for brewity. It's actually necessary for [Visual Studio
 generators] only. For [Ninja Multi-Config] the build script is able to select
 `Release` as the default configuration.
 .
    ```bash
    mkdir -p build && cd build
    cmake ../zenoh-c
    cmake --build . --config Release
    ```
 .
    The generator to use is selected with option `-G`. If Ninja is installed on
 your system, adding `-GNinja` to `cmake` command can greatly speed up the build
 time:
 .
    ```bash
    cmake ../zenoh-c -GNinja
    cmake --build .
    ```
 .
    Unstable api and/or shared memory support can be enabled by setting
 repectively `ZENOHC_BUILD_WITH_UNSTABLE_API` and
 `ZENOHC_BUILD_WITH_SHARED_MEMORY` Cmake flags to `true` during configuration
 step.
 .
    ```bash
    cmake -DZENOHC_BUILD_WITH_UNSTABLE_API=true
 -DZENOHC_BUILD_WITH_SHARED_MEMORY=true ../zenoh-c
    cmake --build . --config Release
    ```
 .
    [build-configurations]:
 https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#build-configurations
    [Visual Studio generators]:
 https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#id14
    [Ninja Multi-Config]:
 https://cmake.org/cmake/help/latest/generator/Ninja%20Multi-Config.html
 .
 4. Install:
 .
    To install zenoh-c library into system just build target `install`. You need
 root privileges to do it, as the default install location is `/usr/local`.
 .
    ```bash
    cmake --build . --target install
    ```
 .
    If you want to install zenoh-c libraries locally, you can set the
 installation directory with `CMAKE_INSTALL_PREFIX`
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local
    cmake --build . --target install
    ```
 .
    By default only dynamic library is built and installed. Set
 `BUILD_SHARED_LIBS` variable to false to build and install static library:
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local -DBUILD_SHARED_LIBS=FALSE
    cmake --build . --target install
    ```
 .
    The result of installation is the header files in `include` directory, the
 library files in `lib` directory and cmake package configuration files for
 package `zenohc` in `lib/cmake` directory. The library later can be loaded with
 CMake command `find_package(zenohc)`.
    Add dependency in CMakeLists.txt on target
 .
    - `zenohc::shared` for linking dynamic library
    - `zenohc::static` for linking static library
    - `zenohc::lib` for linking static or dynamic library depending on boolean
 variable `BUILD_SHARED_LIBS`
 .
    For `Debug` configuration suffix `d` is added to names of library files
 (libzenohc**d**.so).
 .
 5. VScode
 .
    When zenoh-c project is opened in VSCode the build directory is set to
 `build` inside source tree (this is default behavior of Microsoft [CMake
 Tools]). The project build script detects this situation. In this case it
 places build files in `target` directory and `Cargo.toml` file (which is
 generated from `Cargo.toml.in`) into the root of source tree, as the rust
 developers used to and as the rust build tools expects by default. This
 behavior also can be explicitly enabled by setting
 `ZENOHC_BUILD_IN_SOURCE_TREE` variable to `TRUE`.
 .
    [CMake Tools]:
 https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools
 .
 ## Building the Examples
 .
 The examples can be built in two ways. One is to select `examples` as a build
 target of zenoh-c project (assuming here that the current directory is
 side-by-side with zenoh-c directory):
 .
 ```bash
 cmake ../zenoh-c
 cmake --build . --target examples
 ```
 .
 You may also use `--target <example_name>` if you wish to only build a specific
 example.
 .
 All build artifacts will be in the `target/release/examples` directory in this
 case.
 .
 The second way is to directly build `examples` as a root project:
 .
 ```bash
 cmake ../zenoh-c/examples
 cmake --build .
 ```
 .
 In this case, the examples executables will be built in the current directory.
 .
 As a root project the `examples` project links `zenoh-c` with CMake's
 [add_subdirectory] command by default. There are also other ways to link
 `zenoh-c` - with [find_package] or [FetchContent]:
 .
 [add_subdirectory]:
 https://cmake.org/cmake/help/latest/command/add_subdirectory.html
 [find_package]: https://cmake.org/cmake/help/latest/command/find_package.html
 [FetchContent]: https://cmake.org/cmake/help/latest/module/FetchContent.html
 .
 Link with `zenoh-c` installed into default location in the system (with
 [find_package]):
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 ```
 .
 Link with `zenoh-c` installed in `~/.local` directory:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 -DCMAKE_INSTALL_PREFIX=~/.local
 ```
 .
 Download specific `zenoh-c` version from git with [FetchContent]:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=GIT_URL -DZENOHC_GIT_TAG=0.11.0-rc
 ```
 .
 See also `configure_include_project` function in [helpers.cmake] for more
 information
 .
 [helpers.cmake]: cmake/helpers.cmake
 .
 ## Running the Examples
 .
 ### Basic Pub/Sub Example
 .
 ```bash
 ./target/release/examples/z_sub
 ```
 .
 ```bash
 ./target/release/examples/z_pub
 ```
 .
 ### Queryable and Query Example
 .
 ```bash
 ./target/release/examples/z_queryable
 ```
 .
 ```bash
 ./target/release/examples/z_get
 ```
 .
 ### Running the Throughput Examples
 .
 ```bash
 ./target/release/examples/z_sub_thr
 ```
 .
 ```bash
 ./target/release/examples/z_pub_thr
 ```
 .
 ## API conventions
 .
 Most of the types exposed by the `zenoh-c` API are types for which destruction
 is necessary. To help you spot these types, we name them with the convention
 that any destructible type must start by `z_owned`.
 .
 For maximum performance, we try to make as few copies as possible. Sometimes,
 this implies moving data that you `z_owned`. Any function that takes a
 non-const pointer to a `z_owned` type will perform its destruction. To make
 this pattern more obvious, we encourage you to use the `z_move` macro instead
 of a simple `&` to create these pointers. Rest assured that all `z_owned` types
 are double-free safe, and that you may check whether any `z_owned_X_t` typed
 value is still valid by using `z_X_check(&val)`, or the `z_check(val)` macro if
 you're using C11.
 .
 We hope this convention will help you streamline your memory-safe usage of
 zenoh, as following it should make looking for leaks trivial: simply search for
 paths where a value of a `z_owned` type hasn't been passed to a function using
 `z_move`.
 .
 Functions that simply need to borrow your data will instead take values of the
 associated `z_X_t` type. You may construct them using `z_X_loan(&val)` (or the
 `z_loan(val)` generic macro with C11).
 .
 Note that some `z_X_t` typed values can be constructed without needing to
 `z_borrow` their owned variants. This allows you to reduce the amount of copies
 realized in your program.
 .
 The examples have been written with C11 in mind, using the conventions we
 encourage you to follow.
 .
 Finally, we strongly advise that you refrain from using structure field that
 starts with `_`:
 .
 - We try to maintain a common API between `zenoh-c` and
 [`zenoh-pico`](https://github.com/eclipse-zenoh/zenoh-pico), such that porting
 code from one to the other is, ideally, trivial. However, some types must have
 distinct representations in either library, meaning that using these
 representations explicitly will get you in trouble when porting.
 - We reserve the right to change the memory layout of any type which has
 `_`-prefixed fields, so trying to use them might cause your code to break on
 updates.
 .
 ## Cross-Compilation
 .
 The following alternative options have been introduced to facilitate
 cross-compilation.
 > :warning: **WARNING** :warning: : Perhaps additional efforts are necessary,
 that will depend of your environment.
 .
 - `-DZENOHC_CARGO_CHANNEL="+nightly"|"+beta"|"+stable"`: refers to a specific
 rust toolchain release
 [[rust-channels](https://rust-lang.github.io/rustup/concepts/channels.html)]
 - `-DZENOHC_CARGO_FLAGS`: several optional flags can be used for compilation.
 [[cargo flags](https://doc.rust-lang.org/cargo/commands/cargo-build.html)]
 - `-DZENOHC_CUSTOM_TARGET`: specifies a crosscompilation target. Currently rust
 support several Tire-1, Tire-2 and Tire-3 targets
 [[targets](https://doc.rust-lang.org/nightly/rustc/platform-support.html)]. But
 keep in mind that zenoh-c only have support for following targets:
 `aarch64-unknown-linux-gnu`, `x86_64-unknown-linux-gnu`,
 `arm-unknown-linux-gnueabi`
 .
 Let's put all together in an example:
 Assuming you want to crosscompile for aarch64-unknown-linux-gnu.
 .
 1. Install required packages
    - `sudo apt install gcc-aarch64-linux-gnu`
 2. *(Only if you're using `nightly`)
    - `rustup component add rust-src --toolchain nightly`
 3. Compile Zenoh-C. Assume that it's in `zenoh-c` directory. Notice that build
 in this sample is performed outside of source directory
 .
    ```bash
    export RUSTFLAGS="-Clinker=aarch64-linux-gnu-gcc -Car=aarch64-linux-gnu-ar"
    mkdir -p build && cd build
    cmake ../zenoh-c  -DZENOHC_CARGO_CHANNEL="+nightly"
 -DZENOHC_CARGO_FLAGS="-Zbuild-std=std,panic_abort"
 -DZENOHC_CUSTOM_TARGET="aarch64-unknown-linux-gnu"
 -DCMAKE_INSTALL_PREFIX=../aarch64/stage
    cmake --build . --target install
    ```
 .
 Additionally you can use `RUSTFLAGS` environment variable for lead the
 compilation.
 .
 If all goes right the building files will be located at:
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 and release files will be located at
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 .
 ## Rust Version
 .
 The Rust version we use is defined in
 [rust-toolchain.toml](rust-toolchain.toml), which is `1.72.0`.
 There might be some memory mapping issue if you use the later version.
 .
 You can also specify the Rust version.
 .
 ```bash
 cmake ../zenoh-c -DZENOHC_CARGO_CHANNEL="+1.72.0"
 ```
 .
 ## Zenoh features support (enabling/disabling protocols, etc)
 .
 It's necessary sometimes to build zenoh-c library with set of features
 different from default. For example: enable TCP and UDP only. This can be done
 by changing `ZENOHC_CARGO_FLAGS` parameter for cmake (notice ";" instead of
 space due to cmake peculiarities)
 .
 Available features can be found in [Cargo.toml](./Cargo.toml)
 ```bash
 cmake ../zenoh-c
 -DZENOHC_CARGO_FLAGS="--no-default-features;--features=transport_tcp,transport_udp"
 ```
 .
 ## Versioning
 .
 Being a CMake project, zenoh-c is limited to the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme [inherent
 to CMake](https://gitlab.kitware.com/cmake/cmake/-/issues/16716). However,
 zenoh-c also incorporates
 a Cargo package which cannot be versionned with the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme (not
 SemVer compatible). Hence zenoh-c uses a one-to-one mapping between CMake
 versions and SemVer versions:
 .
 | CMake version           | SemVer equivalent | Meaning              |
 |-------------------------|-------------------|----------------------|
 | `1.2.3`                 | `1.2.3`           | Release version      |
 | `1.2.3.0`               | `1.2.3-dev`       | Developement version |
 | `1.2.3.x if x >= 1`     | `1.2.3-pre.x`     | Pre-release version  |
Vcs-Browser: https://github.com/eclipse-zenoh/zenoh-c
Vcs-Git: https://github.com/eclipse-zenoh/zenoh-c

Package: libzenohc-dev
Version: 1.0.0.10-1
Architecture: arm64
Maintainer: zenoh-dev@eclipse.org
Installed-Size: 333
Depends: libzenohc (=1.0.0.10)
Filename: 1.0.0.10/libzenohc-dev_1.0.0.10-1_arm64.deb
Size: 45736
MD5sum: 998d4643ed6b886580641559b0a9dcea
SHA1: 06cd67ae413ea97e1f6d674446b997d0f48f1ad0
SHA256: 1d05202fb6fb8b9334af469b5f50093fa1b8a1abb23c4e7d92118d7d2bd38c76
Section: net
Priority: optional
Homepage: http://zenoh.io
Description: The Zenoh C API
 <img
 src="https://raw.githubusercontent.com/eclipse-zenoh/zenoh/main/zenoh-dragon.png"
 height="150">
 .
 [![CI](https://github.com/eclipse-zenoh/zenoh-c/workflows/CI/badge.svg)](https://github.com/eclipse-zenoh/zenoh-c/actions?query=workflow%3A%22CI%22)
 [![Documentation
 Status](https://readthedocs.org/projects/zenoh-c/badge/?version=latest)](https://zenoh-c.readthedocs.io/en/latest/?badge=latest)
 [![Discussion](https://img.shields.io/badge/discussion-on%20github-blue)](https://github.com/eclipse-zenoh/roadmap/discussions)
 [![Discord](https://img.shields.io/badge/chat-on%20discord-blue)](https://discord.gg/2GJ958VuHs)
 [![License](https://img.shields.io/badge/License-EPL%202.0-blue)](https://choosealicense.com/licenses/epl-2.0/)
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
 .
 # Eclipse Zenoh
 .
 The Eclipse Zenoh: Zero Overhead Pub/sub, Store/Query and Compute.
 .
 Zenoh (pronounce _/zeno/_) unifies data in motion, data at rest and
 computations. It carefully blends traditional pub/sub with geo-distributed
 storages, queries and computations, while retaining a level of time and space
 efficiency that is well beyond any of the mainstream stacks.
 .
 Check the website [zenoh.io](http://zenoh.io) and the
 [roadmap](https://github.com/eclipse-zenoh/roadmap) for more detailed
 information.
 .
 -------------------------------
 .
 # C API
 .
 This repository provides a C binding based on the main [Zenoh implementation
 written in Rust](https://github.com/eclipse-zenoh/zenoh).
 .
 -------------------------------
 .
 ## How to build it
 .
 > :warning: **WARNING** :warning: : Zenoh and its ecosystem are under active
 development. When you build from git, make sure you also build from git any
 other Zenoh repository you plan to use (e.g. binding, plugin, backend, etc.).
 It may happen that some changes in git are not compatible with the most recent
 packaged Zenoh release (e.g. deb, docker, pip). We put particular effort in
 maintaining compatibility between the various git repositories in the Zenoh
 project.
 .
 1. Make sure that [Rust](https://www.rust-lang.org) is available on your
 platform.
    Please check [here](https://www.rust-lang.org/tools/install) to learn how to
 install it.
    If you already have the Rust toolchain installed, make sure it is up-to-date
 with:
 .
    ```bash
    rustup update
    ```
 .
 2. Clone the [source] with `git`:
 .
    ```bash
    git clone https://github.com/eclipse-zenoh/zenoh-c.git
    ```
 .
    [source]: https://github.com/eclipse-zenoh/zenoh-c
 .
 3. Build:
 .
    Good CMake practice is to perform build outside of source directory, leaving
 source tree untouched. The examples below demonstrates this mode of building.
 On the other hand VScode by default creates build directory named 'build'
 inside source tree. In this case build script slightly changes its behavior.
 See more about it in section 'VScode'.
 .
    By default build configuration is set to `Release`, it's not necessary to
 add `-DCMAKE_BUILD_TYPE=Release` option on configuration step. But if your
 platform uses multi-config generator by default (this is the case on Windows),
 you may need to add option `--config Release` on build step. See more in CMake
 [build-configurations] documentation. Option`--config Release` is skipped in
 further examples for brewity. It's actually necessary for [Visual Studio
 generators] only. For [Ninja Multi-Config] the build script is able to select
 `Release` as the default configuration.
 .
    ```bash
    mkdir -p build && cd build
    cmake ../zenoh-c
    cmake --build . --config Release
    ```
 .
    The generator to use is selected with option `-G`. If Ninja is installed on
 your system, adding `-GNinja` to `cmake` command can greatly speed up the build
 time:
 .
    ```bash
    cmake ../zenoh-c -GNinja
    cmake --build .
    ```
 .
    Unstable api and/or shared memory support can be enabled by setting
 repectively `ZENOHC_BUILD_WITH_UNSTABLE_API` and
 `ZENOHC_BUILD_WITH_SHARED_MEMORY` Cmake flags to `true` during configuration
 step.
 .
    ```bash
    cmake -DZENOHC_BUILD_WITH_UNSTABLE_API=true
 -DZENOHC_BUILD_WITH_SHARED_MEMORY=true ../zenoh-c
    cmake --build . --config Release
    ```
 .
    [build-configurations]:
 https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#build-configurations
    [Visual Studio generators]:
 https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#id14
    [Ninja Multi-Config]:
 https://cmake.org/cmake/help/latest/generator/Ninja%20Multi-Config.html
 .
 4. Install:
 .
    To install zenoh-c library into system just build target `install`. You need
 root privileges to do it, as the default install location is `/usr/local`.
 .
    ```bash
    cmake --build . --target install
    ```
 .
    If you want to install zenoh-c libraries locally, you can set the
 installation directory with `CMAKE_INSTALL_PREFIX`
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local
    cmake --build . --target install
    ```
 .
    By default only dynamic library is built and installed. Set
 `BUILD_SHARED_LIBS` variable to false to build and install static library:
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local -DBUILD_SHARED_LIBS=FALSE
    cmake --build . --target install
    ```
 .
    The result of installation is the header files in `include` directory, the
 library files in `lib` directory and cmake package configuration files for
 package `zenohc` in `lib/cmake` directory. The library later can be loaded with
 CMake command `find_package(zenohc)`.
    Add dependency in CMakeLists.txt on target
 .
    - `zenohc::shared` for linking dynamic library
    - `zenohc::static` for linking static library
    - `zenohc::lib` for linking static or dynamic library depending on boolean
 variable `BUILD_SHARED_LIBS`
 .
    For `Debug` configuration suffix `d` is added to names of library files
 (libzenohc**d**.so).
 .
 5. VScode
 .
    When zenoh-c project is opened in VSCode the build directory is set to
 `build` inside source tree (this is default behavior of Microsoft [CMake
 Tools]). The project build script detects this situation. In this case it
 places build files in `target` directory and `Cargo.toml` file (which is
 generated from `Cargo.toml.in`) into the root of source tree, as the rust
 developers used to and as the rust build tools expects by default. This
 behavior also can be explicitly enabled by setting
 `ZENOHC_BUILD_IN_SOURCE_TREE` variable to `TRUE`.
 .
    [CMake Tools]:
 https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools
 .
 ## Building the Examples
 .
 The examples can be built in two ways. One is to select `examples` as a build
 target of zenoh-c project (assuming here that the current directory is
 side-by-side with zenoh-c directory):
 .
 ```bash
 cmake ../zenoh-c
 cmake --build . --target examples
 ```
 .
 You may also use `--target <example_name>` if you wish to only build a specific
 example.
 .
 All build artifacts will be in the `target/release/examples` directory in this
 case.
 .
 The second way is to directly build `examples` as a root project:
 .
 ```bash
 cmake ../zenoh-c/examples
 cmake --build .
 ```
 .
 In this case, the examples executables will be built in the current directory.
 .
 As a root project the `examples` project links `zenoh-c` with CMake's
 [add_subdirectory] command by default. There are also other ways to link
 `zenoh-c` - with [find_package] or [FetchContent]:
 .
 [add_subdirectory]:
 https://cmake.org/cmake/help/latest/command/add_subdirectory.html
 [find_package]: https://cmake.org/cmake/help/latest/command/find_package.html
 [FetchContent]: https://cmake.org/cmake/help/latest/module/FetchContent.html
 .
 Link with `zenoh-c` installed into default location in the system (with
 [find_package]):
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 ```
 .
 Link with `zenoh-c` installed in `~/.local` directory:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 -DCMAKE_INSTALL_PREFIX=~/.local
 ```
 .
 Download specific `zenoh-c` version from git with [FetchContent]:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=GIT_URL -DZENOHC_GIT_TAG=0.11.0-rc
 ```
 .
 See also `configure_include_project` function in [helpers.cmake] for more
 information
 .
 [helpers.cmake]: cmake/helpers.cmake
 .
 ## Running the Examples
 .
 ### Basic Pub/Sub Example
 .
 ```bash
 ./target/release/examples/z_sub
 ```
 .
 ```bash
 ./target/release/examples/z_pub
 ```
 .
 ### Queryable and Query Example
 .
 ```bash
 ./target/release/examples/z_queryable
 ```
 .
 ```bash
 ./target/release/examples/z_get
 ```
 .
 ### Running the Throughput Examples
 .
 ```bash
 ./target/release/examples/z_sub_thr
 ```
 .
 ```bash
 ./target/release/examples/z_pub_thr
 ```
 .
 ## API conventions
 .
 Most of the types exposed by the `zenoh-c` API are types for which destruction
 is necessary. To help you spot these types, we name them with the convention
 that any destructible type must start by `z_owned`.
 .
 For maximum performance, we try to make as few copies as possible. Sometimes,
 this implies moving data that you `z_owned`. Any function that takes a
 non-const pointer to a `z_owned` type will perform its destruction. To make
 this pattern more obvious, we encourage you to use the `z_move` macro instead
 of a simple `&` to create these pointers. Rest assured that all `z_owned` types
 are double-free safe, and that you may check whether any `z_owned_X_t` typed
 value is still valid by using `z_X_check(&val)`, or the `z_check(val)` macro if
 you're using C11.
 .
 We hope this convention will help you streamline your memory-safe usage of
 zenoh, as following it should make looking for leaks trivial: simply search for
 paths where a value of a `z_owned` type hasn't been passed to a function using
 `z_move`.
 .
 Functions that simply need to borrow your data will instead take values of the
 associated `z_X_t` type. You may construct them using `z_X_loan(&val)` (or the
 `z_loan(val)` generic macro with C11).
 .
 Note that some `z_X_t` typed values can be constructed without needing to
 `z_borrow` their owned variants. This allows you to reduce the amount of copies
 realized in your program.
 .
 The examples have been written with C11 in mind, using the conventions we
 encourage you to follow.
 .
 Finally, we strongly advise that you refrain from using structure field that
 starts with `_`:
 .
 - We try to maintain a common API between `zenoh-c` and
 [`zenoh-pico`](https://github.com/eclipse-zenoh/zenoh-pico), such that porting
 code from one to the other is, ideally, trivial. However, some types must have
 distinct representations in either library, meaning that using these
 representations explicitly will get you in trouble when porting.
 - We reserve the right to change the memory layout of any type which has
 `_`-prefixed fields, so trying to use them might cause your code to break on
 updates.
 .
 ## Cross-Compilation
 .
 The following alternative options have been introduced to facilitate
 cross-compilation.
 > :warning: **WARNING** :warning: : Perhaps additional efforts are necessary,
 that will depend of your environment.
 .
 - `-DZENOHC_CARGO_CHANNEL="+nightly"|"+beta"|"+stable"`: refers to a specific
 rust toolchain release
 [[rust-channels](https://rust-lang.github.io/rustup/concepts/channels.html)]
 - `-DZENOHC_CARGO_FLAGS`: several optional flags can be used for compilation.
 [[cargo flags](https://doc.rust-lang.org/cargo/commands/cargo-build.html)]
 - `-DZENOHC_CUSTOM_TARGET`: specifies a crosscompilation target. Currently rust
 support several Tire-1, Tire-2 and Tire-3 targets
 [[targets](https://doc.rust-lang.org/nightly/rustc/platform-support.html)]. But
 keep in mind that zenoh-c only have support for following targets:
 `aarch64-unknown-linux-gnu`, `x86_64-unknown-linux-gnu`,
 `arm-unknown-linux-gnueabi`
 .
 Let's put all together in an example:
 Assuming you want to crosscompile for aarch64-unknown-linux-gnu.
 .
 1. Install required packages
    - `sudo apt install gcc-aarch64-linux-gnu`
 2. *(Only if you're using `nightly`)
    - `rustup component add rust-src --toolchain nightly`
 3. Compile Zenoh-C. Assume that it's in `zenoh-c` directory. Notice that build
 in this sample is performed outside of source directory
 .
    ```bash
    export RUSTFLAGS="-Clinker=aarch64-linux-gnu-gcc -Car=aarch64-linux-gnu-ar"
    mkdir -p build && cd build
    cmake ../zenoh-c  -DZENOHC_CARGO_CHANNEL="+nightly"
 -DZENOHC_CARGO_FLAGS="-Zbuild-std=std,panic_abort"
 -DZENOHC_CUSTOM_TARGET="aarch64-unknown-linux-gnu"
 -DCMAKE_INSTALL_PREFIX=../aarch64/stage
    cmake --build . --target install
    ```
 .
 Additionally you can use `RUSTFLAGS` environment variable for lead the
 compilation.
 .
 If all goes right the building files will be located at:
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 and release files will be located at
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 .
 ## Rust Version
 .
 The Rust version we use is defined in
 [rust-toolchain.toml](rust-toolchain.toml), which is `1.72.0`.
 There might be some memory mapping issue if you use the later version.
 .
 You can also specify the Rust version.
 .
 ```bash
 cmake ../zenoh-c -DZENOHC_CARGO_CHANNEL="+1.72.0"
 ```
 .
 ## Zenoh features support (enabling/disabling protocols, etc)
 .
 It's necessary sometimes to build zenoh-c library with set of features
 different from default. For example: enable TCP and UDP only. This can be done
 by changing `ZENOHC_CARGO_FLAGS` parameter for cmake (notice ";" instead of
 space due to cmake peculiarities)
 .
 Available features can be found in [Cargo.toml](./Cargo.toml)
 ```bash
 cmake ../zenoh-c
 -DZENOHC_CARGO_FLAGS="--no-default-features;--features=transport_tcp,transport_udp"
 ```
 .
 ## Versioning
 .
 Being a CMake project, zenoh-c is limited to the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme [inherent
 to CMake](https://gitlab.kitware.com/cmake/cmake/-/issues/16716). However,
 zenoh-c also incorporates
 a Cargo package which cannot be versionned with the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme (not
 SemVer compatible). Hence zenoh-c uses a one-to-one mapping between CMake
 versions and SemVer versions:
 .
 | CMake version           | SemVer equivalent | Meaning              |
 |-------------------------|-------------------|----------------------|
 | `1.2.3`                 | `1.2.3`           | Release version      |
 | `1.2.3.0`               | `1.2.3-dev`       | Developement version |
 | `1.2.3.x if x >= 1`     | `1.2.3-pre.x`     | Pre-release version  |
Vcs-Browser: https://github.com/eclipse-zenoh/zenoh-c
Vcs-Git: https://github.com/eclipse-zenoh/zenoh-c

Package: libzenohc-dev
Version: 1.0.0.10-1
Architecture: armhf
Maintainer: zenoh-dev@eclipse.org
Installed-Size: 333
Depends: libzenohc (=1.0.0.10)
Filename: 1.0.0.10/libzenohc-dev_1.0.0.10-1_armhf.deb
Size: 45760
MD5sum: f8bed7fa3c9524666a9e8ffe1070459b
SHA1: 9ceb905186c44a91191446a95336d88b6e5232b8
SHA256: 933917d54e9cc831c39d5f57d5c671b98d9d6fafb2a3659b51ff5b51c1f13dbb
Section: net
Priority: optional
Homepage: http://zenoh.io
Description: The Zenoh C API
 <img
 src="https://raw.githubusercontent.com/eclipse-zenoh/zenoh/main/zenoh-dragon.png"
 height="150">
 .
 [![CI](https://github.com/eclipse-zenoh/zenoh-c/workflows/CI/badge.svg)](https://github.com/eclipse-zenoh/zenoh-c/actions?query=workflow%3A%22CI%22)
 [![Documentation
 Status](https://readthedocs.org/projects/zenoh-c/badge/?version=latest)](https://zenoh-c.readthedocs.io/en/latest/?badge=latest)
 [![Discussion](https://img.shields.io/badge/discussion-on%20github-blue)](https://github.com/eclipse-zenoh/roadmap/discussions)
 [![Discord](https://img.shields.io/badge/chat-on%20discord-blue)](https://discord.gg/2GJ958VuHs)
 [![License](https://img.shields.io/badge/License-EPL%202.0-blue)](https://choosealicense.com/licenses/epl-2.0/)
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
 .
 # Eclipse Zenoh
 .
 The Eclipse Zenoh: Zero Overhead Pub/sub, Store/Query and Compute.
 .
 Zenoh (pronounce _/zeno/_) unifies data in motion, data at rest and
 computations. It carefully blends traditional pub/sub with geo-distributed
 storages, queries and computations, while retaining a level of time and space
 efficiency that is well beyond any of the mainstream stacks.
 .
 Check the website [zenoh.io](http://zenoh.io) and the
 [roadmap](https://github.com/eclipse-zenoh/roadmap) for more detailed
 information.
 .
 -------------------------------
 .
 # C API
 .
 This repository provides a C binding based on the main [Zenoh implementation
 written in Rust](https://github.com/eclipse-zenoh/zenoh).
 .
 -------------------------------
 .
 ## How to build it
 .
 > :warning: **WARNING** :warning: : Zenoh and its ecosystem are under active
 development. When you build from git, make sure you also build from git any
 other Zenoh repository you plan to use (e.g. binding, plugin, backend, etc.).
 It may happen that some changes in git are not compatible with the most recent
 packaged Zenoh release (e.g. deb, docker, pip). We put particular effort in
 maintaining compatibility between the various git repositories in the Zenoh
 project.
 .
 1. Make sure that [Rust](https://www.rust-lang.org) is available on your
 platform.
    Please check [here](https://www.rust-lang.org/tools/install) to learn how to
 install it.
    If you already have the Rust toolchain installed, make sure it is up-to-date
 with:
 .
    ```bash
    rustup update
    ```
 .
 2. Clone the [source] with `git`:
 .
    ```bash
    git clone https://github.com/eclipse-zenoh/zenoh-c.git
    ```
 .
    [source]: https://github.com/eclipse-zenoh/zenoh-c
 .
 3. Build:
 .
    Good CMake practice is to perform build outside of source directory, leaving
 source tree untouched. The examples below demonstrates this mode of building.
 On the other hand VScode by default creates build directory named 'build'
 inside source tree. In this case build script slightly changes its behavior.
 See more about it in section 'VScode'.
 .
    By default build configuration is set to `Release`, it's not necessary to
 add `-DCMAKE_BUILD_TYPE=Release` option on configuration step. But if your
 platform uses multi-config generator by default (this is the case on Windows),
 you may need to add option `--config Release` on build step. See more in CMake
 [build-configurations] documentation. Option`--config Release` is skipped in
 further examples for brewity. It's actually necessary for [Visual Studio
 generators] only. For [Ninja Multi-Config] the build script is able to select
 `Release` as the default configuration.
 .
    ```bash
    mkdir -p build && cd build
    cmake ../zenoh-c
    cmake --build . --config Release
    ```
 .
    The generator to use is selected with option `-G`. If Ninja is installed on
 your system, adding `-GNinja` to `cmake` command can greatly speed up the build
 time:
 .
    ```bash
    cmake ../zenoh-c -GNinja
    cmake --build .
    ```
 .
    Unstable api and/or shared memory support can be enabled by setting
 repectively `ZENOHC_BUILD_WITH_UNSTABLE_API` and
 `ZENOHC_BUILD_WITH_SHARED_MEMORY` Cmake flags to `true` during configuration
 step.
 .
    ```bash
    cmake -DZENOHC_BUILD_WITH_UNSTABLE_API=true
 -DZENOHC_BUILD_WITH_SHARED_MEMORY=true ../zenoh-c
    cmake --build . --config Release
    ```
 .
    [build-configurations]:
 https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#build-configurations
    [Visual Studio generators]:
 https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#id14
    [Ninja Multi-Config]:
 https://cmake.org/cmake/help/latest/generator/Ninja%20Multi-Config.html
 .
 4. Install:
 .
    To install zenoh-c library into system just build target `install`. You need
 root privileges to do it, as the default install location is `/usr/local`.
 .
    ```bash
    cmake --build . --target install
    ```
 .
    If you want to install zenoh-c libraries locally, you can set the
 installation directory with `CMAKE_INSTALL_PREFIX`
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local
    cmake --build . --target install
    ```
 .
    By default only dynamic library is built and installed. Set
 `BUILD_SHARED_LIBS` variable to false to build and install static library:
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local -DBUILD_SHARED_LIBS=FALSE
    cmake --build . --target install
    ```
 .
    The result of installation is the header files in `include` directory, the
 library files in `lib` directory and cmake package configuration files for
 package `zenohc` in `lib/cmake` directory. The library later can be loaded with
 CMake command `find_package(zenohc)`.
    Add dependency in CMakeLists.txt on target
 .
    - `zenohc::shared` for linking dynamic library
    - `zenohc::static` for linking static library
    - `zenohc::lib` for linking static or dynamic library depending on boolean
 variable `BUILD_SHARED_LIBS`
 .
    For `Debug` configuration suffix `d` is added to names of library files
 (libzenohc**d**.so).
 .
 5. VScode
 .
    When zenoh-c project is opened in VSCode the build directory is set to
 `build` inside source tree (this is default behavior of Microsoft [CMake
 Tools]). The project build script detects this situation. In this case it
 places build files in `target` directory and `Cargo.toml` file (which is
 generated from `Cargo.toml.in`) into the root of source tree, as the rust
 developers used to and as the rust build tools expects by default. This
 behavior also can be explicitly enabled by setting
 `ZENOHC_BUILD_IN_SOURCE_TREE` variable to `TRUE`.
 .
    [CMake Tools]:
 https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools
 .
 ## Building the Examples
 .
 The examples can be built in two ways. One is to select `examples` as a build
 target of zenoh-c project (assuming here that the current directory is
 side-by-side with zenoh-c directory):
 .
 ```bash
 cmake ../zenoh-c
 cmake --build . --target examples
 ```
 .
 You may also use `--target <example_name>` if you wish to only build a specific
 example.
 .
 All build artifacts will be in the `target/release/examples` directory in this
 case.
 .
 The second way is to directly build `examples` as a root project:
 .
 ```bash
 cmake ../zenoh-c/examples
 cmake --build .
 ```
 .
 In this case, the examples executables will be built in the current directory.
 .
 As a root project the `examples` project links `zenoh-c` with CMake's
 [add_subdirectory] command by default. There are also other ways to link
 `zenoh-c` - with [find_package] or [FetchContent]:
 .
 [add_subdirectory]:
 https://cmake.org/cmake/help/latest/command/add_subdirectory.html
 [find_package]: https://cmake.org/cmake/help/latest/command/find_package.html
 [FetchContent]: https://cmake.org/cmake/help/latest/module/FetchContent.html
 .
 Link with `zenoh-c` installed into default location in the system (with
 [find_package]):
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 ```
 .
 Link with `zenoh-c` installed in `~/.local` directory:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 -DCMAKE_INSTALL_PREFIX=~/.local
 ```
 .
 Download specific `zenoh-c` version from git with [FetchContent]:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=GIT_URL -DZENOHC_GIT_TAG=0.11.0-rc
 ```
 .
 See also `configure_include_project` function in [helpers.cmake] for more
 information
 .
 [helpers.cmake]: cmake/helpers.cmake
 .
 ## Running the Examples
 .
 ### Basic Pub/Sub Example
 .
 ```bash
 ./target/release/examples/z_sub
 ```
 .
 ```bash
 ./target/release/examples/z_pub
 ```
 .
 ### Queryable and Query Example
 .
 ```bash
 ./target/release/examples/z_queryable
 ```
 .
 ```bash
 ./target/release/examples/z_get
 ```
 .
 ### Running the Throughput Examples
 .
 ```bash
 ./target/release/examples/z_sub_thr
 ```
 .
 ```bash
 ./target/release/examples/z_pub_thr
 ```
 .
 ## API conventions
 .
 Most of the types exposed by the `zenoh-c` API are types for which destruction
 is necessary. To help you spot these types, we name them with the convention
 that any destructible type must start by `z_owned`.
 .
 For maximum performance, we try to make as few copies as possible. Sometimes,
 this implies moving data that you `z_owned`. Any function that takes a
 non-const pointer to a `z_owned` type will perform its destruction. To make
 this pattern more obvious, we encourage you to use the `z_move` macro instead
 of a simple `&` to create these pointers. Rest assured that all `z_owned` types
 are double-free safe, and that you may check whether any `z_owned_X_t` typed
 value is still valid by using `z_X_check(&val)`, or the `z_check(val)` macro if
 you're using C11.
 .
 We hope this convention will help you streamline your memory-safe usage of
 zenoh, as following it should make looking for leaks trivial: simply search for
 paths where a value of a `z_owned` type hasn't been passed to a function using
 `z_move`.
 .
 Functions that simply need to borrow your data will instead take values of the
 associated `z_X_t` type. You may construct them using `z_X_loan(&val)` (or the
 `z_loan(val)` generic macro with C11).
 .
 Note that some `z_X_t` typed values can be constructed without needing to
 `z_borrow` their owned variants. This allows you to reduce the amount of copies
 realized in your program.
 .
 The examples have been written with C11 in mind, using the conventions we
 encourage you to follow.
 .
 Finally, we strongly advise that you refrain from using structure field that
 starts with `_`:
 .
 - We try to maintain a common API between `zenoh-c` and
 [`zenoh-pico`](https://github.com/eclipse-zenoh/zenoh-pico), such that porting
 code from one to the other is, ideally, trivial. However, some types must have
 distinct representations in either library, meaning that using these
 representations explicitly will get you in trouble when porting.
 - We reserve the right to change the memory layout of any type which has
 `_`-prefixed fields, so trying to use them might cause your code to break on
 updates.
 .
 ## Cross-Compilation
 .
 The following alternative options have been introduced to facilitate
 cross-compilation.
 > :warning: **WARNING** :warning: : Perhaps additional efforts are necessary,
 that will depend of your environment.
 .
 - `-DZENOHC_CARGO_CHANNEL="+nightly"|"+beta"|"+stable"`: refers to a specific
 rust toolchain release
 [[rust-channels](https://rust-lang.github.io/rustup/concepts/channels.html)]
 - `-DZENOHC_CARGO_FLAGS`: several optional flags can be used for compilation.
 [[cargo flags](https://doc.rust-lang.org/cargo/commands/cargo-build.html)]
 - `-DZENOHC_CUSTOM_TARGET`: specifies a crosscompilation target. Currently rust
 support several Tire-1, Tire-2 and Tire-3 targets
 [[targets](https://doc.rust-lang.org/nightly/rustc/platform-support.html)]. But
 keep in mind that zenoh-c only have support for following targets:
 `aarch64-unknown-linux-gnu`, `x86_64-unknown-linux-gnu`,
 `arm-unknown-linux-gnueabi`
 .
 Let's put all together in an example:
 Assuming you want to crosscompile for aarch64-unknown-linux-gnu.
 .
 1. Install required packages
    - `sudo apt install gcc-aarch64-linux-gnu`
 2. *(Only if you're using `nightly`)
    - `rustup component add rust-src --toolchain nightly`
 3. Compile Zenoh-C. Assume that it's in `zenoh-c` directory. Notice that build
 in this sample is performed outside of source directory
 .
    ```bash
    export RUSTFLAGS="-Clinker=aarch64-linux-gnu-gcc -Car=aarch64-linux-gnu-ar"
    mkdir -p build && cd build
    cmake ../zenoh-c  -DZENOHC_CARGO_CHANNEL="+nightly"
 -DZENOHC_CARGO_FLAGS="-Zbuild-std=std,panic_abort"
 -DZENOHC_CUSTOM_TARGET="aarch64-unknown-linux-gnu"
 -DCMAKE_INSTALL_PREFIX=../aarch64/stage
    cmake --build . --target install
    ```
 .
 Additionally you can use `RUSTFLAGS` environment variable for lead the
 compilation.
 .
 If all goes right the building files will be located at:
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 and release files will be located at
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 .
 ## Rust Version
 .
 The Rust version we use is defined in
 [rust-toolchain.toml](rust-toolchain.toml), which is `1.72.0`.
 There might be some memory mapping issue if you use the later version.
 .
 You can also specify the Rust version.
 .
 ```bash
 cmake ../zenoh-c -DZENOHC_CARGO_CHANNEL="+1.72.0"
 ```
 .
 ## Zenoh features support (enabling/disabling protocols, etc)
 .
 It's necessary sometimes to build zenoh-c library with set of features
 different from default. For example: enable TCP and UDP only. This can be done
 by changing `ZENOHC_CARGO_FLAGS` parameter for cmake (notice ";" instead of
 space due to cmake peculiarities)
 .
 Available features can be found in [Cargo.toml](./Cargo.toml)
 ```bash
 cmake ../zenoh-c
 -DZENOHC_CARGO_FLAGS="--no-default-features;--features=transport_tcp,transport_udp"
 ```
 .
 ## Versioning
 .
 Being a CMake project, zenoh-c is limited to the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme [inherent
 to CMake](https://gitlab.kitware.com/cmake/cmake/-/issues/16716). However,
 zenoh-c also incorporates
 a Cargo package which cannot be versionned with the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme (not
 SemVer compatible). Hence zenoh-c uses a one-to-one mapping between CMake
 versions and SemVer versions:
 .
 | CMake version           | SemVer equivalent | Meaning              |
 |-------------------------|-------------------|----------------------|
 | `1.2.3`                 | `1.2.3`           | Release version      |
 | `1.2.3.0`               | `1.2.3-dev`       | Developement version |
 | `1.2.3.x if x >= 1`     | `1.2.3-pre.x`     | Pre-release version  |
Vcs-Browser: https://github.com/eclipse-zenoh/zenoh-c
Vcs-Git: https://github.com/eclipse-zenoh/zenoh-c

Package: libzenohc-dev
Version: 1.0.0.10-1
Architecture: amd64
Maintainer: zenoh-dev@eclipse.org
Installed-Size: 333
Depends: libzenohc (=1.0.0.10)
Filename: 1.0.0.10/libzenohc-dev_1.0.0.10-1_amd64.deb
Size: 45736
MD5sum: 6981e60262969cde4b63eeec8b70b4e7
SHA1: 0555d1ae66bb0016c27e72eb6e6d2b07e81ba98c
SHA256: c8c741555ddc2caba9acf4f04367d82e72ee44c47a49fd141701db66c08878b8
Section: net
Priority: optional
Homepage: http://zenoh.io
Description: The Zenoh C API
 <img
 src="https://raw.githubusercontent.com/eclipse-zenoh/zenoh/main/zenoh-dragon.png"
 height="150">
 .
 [![CI](https://github.com/eclipse-zenoh/zenoh-c/workflows/CI/badge.svg)](https://github.com/eclipse-zenoh/zenoh-c/actions?query=workflow%3A%22CI%22)
 [![Documentation
 Status](https://readthedocs.org/projects/zenoh-c/badge/?version=latest)](https://zenoh-c.readthedocs.io/en/latest/?badge=latest)
 [![Discussion](https://img.shields.io/badge/discussion-on%20github-blue)](https://github.com/eclipse-zenoh/roadmap/discussions)
 [![Discord](https://img.shields.io/badge/chat-on%20discord-blue)](https://discord.gg/2GJ958VuHs)
 [![License](https://img.shields.io/badge/License-EPL%202.0-blue)](https://choosealicense.com/licenses/epl-2.0/)
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
 .
 # Eclipse Zenoh
 .
 The Eclipse Zenoh: Zero Overhead Pub/sub, Store/Query and Compute.
 .
 Zenoh (pronounce _/zeno/_) unifies data in motion, data at rest and
 computations. It carefully blends traditional pub/sub with geo-distributed
 storages, queries and computations, while retaining a level of time and space
 efficiency that is well beyond any of the mainstream stacks.
 .
 Check the website [zenoh.io](http://zenoh.io) and the
 [roadmap](https://github.com/eclipse-zenoh/roadmap) for more detailed
 information.
 .
 -------------------------------
 .
 # C API
 .
 This repository provides a C binding based on the main [Zenoh implementation
 written in Rust](https://github.com/eclipse-zenoh/zenoh).
 .
 -------------------------------
 .
 ## How to build it
 .
 > :warning: **WARNING** :warning: : Zenoh and its ecosystem are under active
 development. When you build from git, make sure you also build from git any
 other Zenoh repository you plan to use (e.g. binding, plugin, backend, etc.).
 It may happen that some changes in git are not compatible with the most recent
 packaged Zenoh release (e.g. deb, docker, pip). We put particular effort in
 maintaining compatibility between the various git repositories in the Zenoh
 project.
 .
 1. Make sure that [Rust](https://www.rust-lang.org) is available on your
 platform.
    Please check [here](https://www.rust-lang.org/tools/install) to learn how to
 install it.
    If you already have the Rust toolchain installed, make sure it is up-to-date
 with:
 .
    ```bash
    rustup update
    ```
 .
 2. Clone the [source] with `git`:
 .
    ```bash
    git clone https://github.com/eclipse-zenoh/zenoh-c.git
    ```
 .
    [source]: https://github.com/eclipse-zenoh/zenoh-c
 .
 3. Build:
 .
    Good CMake practice is to perform build outside of source directory, leaving
 source tree untouched. The examples below demonstrates this mode of building.
 On the other hand VScode by default creates build directory named 'build'
 inside source tree. In this case build script slightly changes its behavior.
 See more about it in section 'VScode'.
 .
    By default build configuration is set to `Release`, it's not necessary to
 add `-DCMAKE_BUILD_TYPE=Release` option on configuration step. But if your
 platform uses multi-config generator by default (this is the case on Windows),
 you may need to add option `--config Release` on build step. See more in CMake
 [build-configurations] documentation. Option`--config Release` is skipped in
 further examples for brewity. It's actually necessary for [Visual Studio
 generators] only. For [Ninja Multi-Config] the build script is able to select
 `Release` as the default configuration.
 .
    ```bash
    mkdir -p build && cd build
    cmake ../zenoh-c
    cmake --build . --config Release
    ```
 .
    The generator to use is selected with option `-G`. If Ninja is installed on
 your system, adding `-GNinja` to `cmake` command can greatly speed up the build
 time:
 .
    ```bash
    cmake ../zenoh-c -GNinja
    cmake --build .
    ```
 .
    Unstable api and/or shared memory support can be enabled by setting
 repectively `ZENOHC_BUILD_WITH_UNSTABLE_API` and
 `ZENOHC_BUILD_WITH_SHARED_MEMORY` Cmake flags to `true` during configuration
 step.
 .
    ```bash
    cmake -DZENOHC_BUILD_WITH_UNSTABLE_API=true
 -DZENOHC_BUILD_WITH_SHARED_MEMORY=true ../zenoh-c
    cmake --build . --config Release
    ```
 .
    [build-configurations]:
 https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#build-configurations
    [Visual Studio generators]:
 https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#id14
    [Ninja Multi-Config]:
 https://cmake.org/cmake/help/latest/generator/Ninja%20Multi-Config.html
 .
 4. Install:
 .
    To install zenoh-c library into system just build target `install`. You need
 root privileges to do it, as the default install location is `/usr/local`.
 .
    ```bash
    cmake --build . --target install
    ```
 .
    If you want to install zenoh-c libraries locally, you can set the
 installation directory with `CMAKE_INSTALL_PREFIX`
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local
    cmake --build . --target install
    ```
 .
    By default only dynamic library is built and installed. Set
 `BUILD_SHARED_LIBS` variable to false to build and install static library:
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local -DBUILD_SHARED_LIBS=FALSE
    cmake --build . --target install
    ```
 .
    The result of installation is the header files in `include` directory, the
 library files in `lib` directory and cmake package configuration files for
 package `zenohc` in `lib/cmake` directory. The library later can be loaded with
 CMake command `find_package(zenohc)`.
    Add dependency in CMakeLists.txt on target
 .
    - `zenohc::shared` for linking dynamic library
    - `zenohc::static` for linking static library
    - `zenohc::lib` for linking static or dynamic library depending on boolean
 variable `BUILD_SHARED_LIBS`
 .
    For `Debug` configuration suffix `d` is added to names of library files
 (libzenohc**d**.so).
 .
 5. VScode
 .
    When zenoh-c project is opened in VSCode the build directory is set to
 `build` inside source tree (this is default behavior of Microsoft [CMake
 Tools]). The project build script detects this situation. In this case it
 places build files in `target` directory and `Cargo.toml` file (which is
 generated from `Cargo.toml.in`) into the root of source tree, as the rust
 developers used to and as the rust build tools expects by default. This
 behavior also can be explicitly enabled by setting
 `ZENOHC_BUILD_IN_SOURCE_TREE` variable to `TRUE`.
 .
    [CMake Tools]:
 https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools
 .
 ## Building the Examples
 .
 The examples can be built in two ways. One is to select `examples` as a build
 target of zenoh-c project (assuming here that the current directory is
 side-by-side with zenoh-c directory):
 .
 ```bash
 cmake ../zenoh-c
 cmake --build . --target examples
 ```
 .
 You may also use `--target <example_name>` if you wish to only build a specific
 example.
 .
 All build artifacts will be in the `target/release/examples` directory in this
 case.
 .
 The second way is to directly build `examples` as a root project:
 .
 ```bash
 cmake ../zenoh-c/examples
 cmake --build .
 ```
 .
 In this case, the examples executables will be built in the current directory.
 .
 As a root project the `examples` project links `zenoh-c` with CMake's
 [add_subdirectory] command by default. There are also other ways to link
 `zenoh-c` - with [find_package] or [FetchContent]:
 .
 [add_subdirectory]:
 https://cmake.org/cmake/help/latest/command/add_subdirectory.html
 [find_package]: https://cmake.org/cmake/help/latest/command/find_package.html
 [FetchContent]: https://cmake.org/cmake/help/latest/module/FetchContent.html
 .
 Link with `zenoh-c` installed into default location in the system (with
 [find_package]):
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 ```
 .
 Link with `zenoh-c` installed in `~/.local` directory:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 -DCMAKE_INSTALL_PREFIX=~/.local
 ```
 .
 Download specific `zenoh-c` version from git with [FetchContent]:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=GIT_URL -DZENOHC_GIT_TAG=0.11.0-rc
 ```
 .
 See also `configure_include_project` function in [helpers.cmake] for more
 information
 .
 [helpers.cmake]: cmake/helpers.cmake
 .
 ## Running the Examples
 .
 ### Basic Pub/Sub Example
 .
 ```bash
 ./target/release/examples/z_sub
 ```
 .
 ```bash
 ./target/release/examples/z_pub
 ```
 .
 ### Queryable and Query Example
 .
 ```bash
 ./target/release/examples/z_queryable
 ```
 .
 ```bash
 ./target/release/examples/z_get
 ```
 .
 ### Running the Throughput Examples
 .
 ```bash
 ./target/release/examples/z_sub_thr
 ```
 .
 ```bash
 ./target/release/examples/z_pub_thr
 ```
 .
 ## API conventions
 .
 Most of the types exposed by the `zenoh-c` API are types for which destruction
 is necessary. To help you spot these types, we name them with the convention
 that any destructible type must start by `z_owned`.
 .
 For maximum performance, we try to make as few copies as possible. Sometimes,
 this implies moving data that you `z_owned`. Any function that takes a
 non-const pointer to a `z_owned` type will perform its destruction. To make
 this pattern more obvious, we encourage you to use the `z_move` macro instead
 of a simple `&` to create these pointers. Rest assured that all `z_owned` types
 are double-free safe, and that you may check whether any `z_owned_X_t` typed
 value is still valid by using `z_X_check(&val)`, or the `z_check(val)` macro if
 you're using C11.
 .
 We hope this convention will help you streamline your memory-safe usage of
 zenoh, as following it should make looking for leaks trivial: simply search for
 paths where a value of a `z_owned` type hasn't been passed to a function using
 `z_move`.
 .
 Functions that simply need to borrow your data will instead take values of the
 associated `z_X_t` type. You may construct them using `z_X_loan(&val)` (or the
 `z_loan(val)` generic macro with C11).
 .
 Note that some `z_X_t` typed values can be constructed without needing to
 `z_borrow` their owned variants. This allows you to reduce the amount of copies
 realized in your program.
 .
 The examples have been written with C11 in mind, using the conventions we
 encourage you to follow.
 .
 Finally, we strongly advise that you refrain from using structure field that
 starts with `_`:
 .
 - We try to maintain a common API between `zenoh-c` and
 [`zenoh-pico`](https://github.com/eclipse-zenoh/zenoh-pico), such that porting
 code from one to the other is, ideally, trivial. However, some types must have
 distinct representations in either library, meaning that using these
 representations explicitly will get you in trouble when porting.
 - We reserve the right to change the memory layout of any type which has
 `_`-prefixed fields, so trying to use them might cause your code to break on
 updates.
 .
 ## Cross-Compilation
 .
 The following alternative options have been introduced to facilitate
 cross-compilation.
 > :warning: **WARNING** :warning: : Perhaps additional efforts are necessary,
 that will depend of your environment.
 .
 - `-DZENOHC_CARGO_CHANNEL="+nightly"|"+beta"|"+stable"`: refers to a specific
 rust toolchain release
 [[rust-channels](https://rust-lang.github.io/rustup/concepts/channels.html)]
 - `-DZENOHC_CARGO_FLAGS`: several optional flags can be used for compilation.
 [[cargo flags](https://doc.rust-lang.org/cargo/commands/cargo-build.html)]
 - `-DZENOHC_CUSTOM_TARGET`: specifies a crosscompilation target. Currently rust
 support several Tire-1, Tire-2 and Tire-3 targets
 [[targets](https://doc.rust-lang.org/nightly/rustc/platform-support.html)]. But
 keep in mind that zenoh-c only have support for following targets:
 `aarch64-unknown-linux-gnu`, `x86_64-unknown-linux-gnu`,
 `arm-unknown-linux-gnueabi`
 .
 Let's put all together in an example:
 Assuming you want to crosscompile for aarch64-unknown-linux-gnu.
 .
 1. Install required packages
    - `sudo apt install gcc-aarch64-linux-gnu`
 2. *(Only if you're using `nightly`)
    - `rustup component add rust-src --toolchain nightly`
 3. Compile Zenoh-C. Assume that it's in `zenoh-c` directory. Notice that build
 in this sample is performed outside of source directory
 .
    ```bash
    export RUSTFLAGS="-Clinker=aarch64-linux-gnu-gcc -Car=aarch64-linux-gnu-ar"
    mkdir -p build && cd build
    cmake ../zenoh-c  -DZENOHC_CARGO_CHANNEL="+nightly"
 -DZENOHC_CARGO_FLAGS="-Zbuild-std=std,panic_abort"
 -DZENOHC_CUSTOM_TARGET="aarch64-unknown-linux-gnu"
 -DCMAKE_INSTALL_PREFIX=../aarch64/stage
    cmake --build . --target install
    ```
 .
 Additionally you can use `RUSTFLAGS` environment variable for lead the
 compilation.
 .
 If all goes right the building files will be located at:
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 and release files will be located at
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 .
 ## Rust Version
 .
 The Rust version we use is defined in
 [rust-toolchain.toml](rust-toolchain.toml), which is `1.72.0`.
 There might be some memory mapping issue if you use the later version.
 .
 You can also specify the Rust version.
 .
 ```bash
 cmake ../zenoh-c -DZENOHC_CARGO_CHANNEL="+1.72.0"
 ```
 .
 ## Zenoh features support (enabling/disabling protocols, etc)
 .
 It's necessary sometimes to build zenoh-c library with set of features
 different from default. For example: enable TCP and UDP only. This can be done
 by changing `ZENOHC_CARGO_FLAGS` parameter for cmake (notice ";" instead of
 space due to cmake peculiarities)
 .
 Available features can be found in [Cargo.toml](./Cargo.toml)
 ```bash
 cmake ../zenoh-c
 -DZENOHC_CARGO_FLAGS="--no-default-features;--features=transport_tcp,transport_udp"
 ```
 .
 ## Versioning
 .
 Being a CMake project, zenoh-c is limited to the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme [inherent
 to CMake](https://gitlab.kitware.com/cmake/cmake/-/issues/16716). However,
 zenoh-c also incorporates
 a Cargo package which cannot be versionned with the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme (not
 SemVer compatible). Hence zenoh-c uses a one-to-one mapping between CMake
 versions and SemVer versions:
 .
 | CMake version           | SemVer equivalent | Meaning              |
 |-------------------------|-------------------|----------------------|
 | `1.2.3`                 | `1.2.3`           | Release version      |
 | `1.2.3.0`               | `1.2.3-dev`       | Developement version |
 | `1.2.3.x if x >= 1`     | `1.2.3-pre.x`     | Pre-release version  |
Vcs-Browser: https://github.com/eclipse-zenoh/zenoh-c
Vcs-Git: https://github.com/eclipse-zenoh/zenoh-c

Package: libzenohc-dev
Version: 1.0.0.10-1
Architecture: armel
Maintainer: zenoh-dev@eclipse.org
Installed-Size: 333
Depends: libzenohc (=1.0.0.10)
Filename: 1.0.0.10/libzenohc-dev_1.0.0.10-1_armel.deb
Size: 45760
MD5sum: 93867cfb0f508f0cb73b211b161381a7
SHA1: 5f163452faba5942250714374e457c6462bccd45
SHA256: f6b66a172d8348777e20caf337ce436dade10fdcd6e91afa654b24d080d3387e
Section: net
Priority: optional
Homepage: http://zenoh.io
Description: The Zenoh C API
 <img
 src="https://raw.githubusercontent.com/eclipse-zenoh/zenoh/main/zenoh-dragon.png"
 height="150">
 .
 [![CI](https://github.com/eclipse-zenoh/zenoh-c/workflows/CI/badge.svg)](https://github.com/eclipse-zenoh/zenoh-c/actions?query=workflow%3A%22CI%22)
 [![Documentation
 Status](https://readthedocs.org/projects/zenoh-c/badge/?version=latest)](https://zenoh-c.readthedocs.io/en/latest/?badge=latest)
 [![Discussion](https://img.shields.io/badge/discussion-on%20github-blue)](https://github.com/eclipse-zenoh/roadmap/discussions)
 [![Discord](https://img.shields.io/badge/chat-on%20discord-blue)](https://discord.gg/2GJ958VuHs)
 [![License](https://img.shields.io/badge/License-EPL%202.0-blue)](https://choosealicense.com/licenses/epl-2.0/)
 [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
 .
 # Eclipse Zenoh
 .
 The Eclipse Zenoh: Zero Overhead Pub/sub, Store/Query and Compute.
 .
 Zenoh (pronounce _/zeno/_) unifies data in motion, data at rest and
 computations. It carefully blends traditional pub/sub with geo-distributed
 storages, queries and computations, while retaining a level of time and space
 efficiency that is well beyond any of the mainstream stacks.
 .
 Check the website [zenoh.io](http://zenoh.io) and the
 [roadmap](https://github.com/eclipse-zenoh/roadmap) for more detailed
 information.
 .
 -------------------------------
 .
 # C API
 .
 This repository provides a C binding based on the main [Zenoh implementation
 written in Rust](https://github.com/eclipse-zenoh/zenoh).
 .
 -------------------------------
 .
 ## How to build it
 .
 > :warning: **WARNING** :warning: : Zenoh and its ecosystem are under active
 development. When you build from git, make sure you also build from git any
 other Zenoh repository you plan to use (e.g. binding, plugin, backend, etc.).
 It may happen that some changes in git are not compatible with the most recent
 packaged Zenoh release (e.g. deb, docker, pip). We put particular effort in
 maintaining compatibility between the various git repositories in the Zenoh
 project.
 .
 1. Make sure that [Rust](https://www.rust-lang.org) is available on your
 platform.
    Please check [here](https://www.rust-lang.org/tools/install) to learn how to
 install it.
    If you already have the Rust toolchain installed, make sure it is up-to-date
 with:
 .
    ```bash
    rustup update
    ```
 .
 2. Clone the [source] with `git`:
 .
    ```bash
    git clone https://github.com/eclipse-zenoh/zenoh-c.git
    ```
 .
    [source]: https://github.com/eclipse-zenoh/zenoh-c
 .
 3. Build:
 .
    Good CMake practice is to perform build outside of source directory, leaving
 source tree untouched. The examples below demonstrates this mode of building.
 On the other hand VScode by default creates build directory named 'build'
 inside source tree. In this case build script slightly changes its behavior.
 See more about it in section 'VScode'.
 .
    By default build configuration is set to `Release`, it's not necessary to
 add `-DCMAKE_BUILD_TYPE=Release` option on configuration step. But if your
 platform uses multi-config generator by default (this is the case on Windows),
 you may need to add option `--config Release` on build step. See more in CMake
 [build-configurations] documentation. Option`--config Release` is skipped in
 further examples for brewity. It's actually necessary for [Visual Studio
 generators] only. For [Ninja Multi-Config] the build script is able to select
 `Release` as the default configuration.
 .
    ```bash
    mkdir -p build && cd build
    cmake ../zenoh-c
    cmake --build . --config Release
    ```
 .
    The generator to use is selected with option `-G`. If Ninja is installed on
 your system, adding `-GNinja` to `cmake` command can greatly speed up the build
 time:
 .
    ```bash
    cmake ../zenoh-c -GNinja
    cmake --build .
    ```
 .
    Unstable api and/or shared memory support can be enabled by setting
 repectively `ZENOHC_BUILD_WITH_UNSTABLE_API` and
 `ZENOHC_BUILD_WITH_SHARED_MEMORY` Cmake flags to `true` during configuration
 step.
 .
    ```bash
    cmake -DZENOHC_BUILD_WITH_UNSTABLE_API=true
 -DZENOHC_BUILD_WITH_SHARED_MEMORY=true ../zenoh-c
    cmake --build . --config Release
    ```
 .
    [build-configurations]:
 https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#build-configurations
    [Visual Studio generators]:
 https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#id14
    [Ninja Multi-Config]:
 https://cmake.org/cmake/help/latest/generator/Ninja%20Multi-Config.html
 .
 4. Install:
 .
    To install zenoh-c library into system just build target `install`. You need
 root privileges to do it, as the default install location is `/usr/local`.
 .
    ```bash
    cmake --build . --target install
    ```
 .
    If you want to install zenoh-c libraries locally, you can set the
 installation directory with `CMAKE_INSTALL_PREFIX`
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local
    cmake --build . --target install
    ```
 .
    By default only dynamic library is built and installed. Set
 `BUILD_SHARED_LIBS` variable to false to build and install static library:
 .
    ```bash
    cmake ../zenoh-c -DCMAKE_INSTALL_PREFIX=~/.local -DBUILD_SHARED_LIBS=FALSE
    cmake --build . --target install
    ```
 .
    The result of installation is the header files in `include` directory, the
 library files in `lib` directory and cmake package configuration files for
 package `zenohc` in `lib/cmake` directory. The library later can be loaded with
 CMake command `find_package(zenohc)`.
    Add dependency in CMakeLists.txt on target
 .
    - `zenohc::shared` for linking dynamic library
    - `zenohc::static` for linking static library
    - `zenohc::lib` for linking static or dynamic library depending on boolean
 variable `BUILD_SHARED_LIBS`
 .
    For `Debug` configuration suffix `d` is added to names of library files
 (libzenohc**d**.so).
 .
 5. VScode
 .
    When zenoh-c project is opened in VSCode the build directory is set to
 `build` inside source tree (this is default behavior of Microsoft [CMake
 Tools]). The project build script detects this situation. In this case it
 places build files in `target` directory and `Cargo.toml` file (which is
 generated from `Cargo.toml.in`) into the root of source tree, as the rust
 developers used to and as the rust build tools expects by default. This
 behavior also can be explicitly enabled by setting
 `ZENOHC_BUILD_IN_SOURCE_TREE` variable to `TRUE`.
 .
    [CMake Tools]:
 https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools
 .
 ## Building the Examples
 .
 The examples can be built in two ways. One is to select `examples` as a build
 target of zenoh-c project (assuming here that the current directory is
 side-by-side with zenoh-c directory):
 .
 ```bash
 cmake ../zenoh-c
 cmake --build . --target examples
 ```
 .
 You may also use `--target <example_name>` if you wish to only build a specific
 example.
 .
 All build artifacts will be in the `target/release/examples` directory in this
 case.
 .
 The second way is to directly build `examples` as a root project:
 .
 ```bash
 cmake ../zenoh-c/examples
 cmake --build .
 ```
 .
 In this case, the examples executables will be built in the current directory.
 .
 As a root project the `examples` project links `zenoh-c` with CMake's
 [add_subdirectory] command by default. There are also other ways to link
 `zenoh-c` - with [find_package] or [FetchContent]:
 .
 [add_subdirectory]:
 https://cmake.org/cmake/help/latest/command/add_subdirectory.html
 [find_package]: https://cmake.org/cmake/help/latest/command/find_package.html
 [FetchContent]: https://cmake.org/cmake/help/latest/module/FetchContent.html
 .
 Link with `zenoh-c` installed into default location in the system (with
 [find_package]):
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 ```
 .
 Link with `zenoh-c` installed in `~/.local` directory:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=PACKAGE
 -DCMAKE_INSTALL_PREFIX=~/.local
 ```
 .
 Download specific `zenoh-c` version from git with [FetchContent]:
 .
 ```bash
 cmake ../zenoh-c/examples -DZENOHC_SOURCE=GIT_URL -DZENOHC_GIT_TAG=0.11.0-rc
 ```
 .
 See also `configure_include_project` function in [helpers.cmake] for more
 information
 .
 [helpers.cmake]: cmake/helpers.cmake
 .
 ## Running the Examples
 .
 ### Basic Pub/Sub Example
 .
 ```bash
 ./target/release/examples/z_sub
 ```
 .
 ```bash
 ./target/release/examples/z_pub
 ```
 .
 ### Queryable and Query Example
 .
 ```bash
 ./target/release/examples/z_queryable
 ```
 .
 ```bash
 ./target/release/examples/z_get
 ```
 .
 ### Running the Throughput Examples
 .
 ```bash
 ./target/release/examples/z_sub_thr
 ```
 .
 ```bash
 ./target/release/examples/z_pub_thr
 ```
 .
 ## API conventions
 .
 Most of the types exposed by the `zenoh-c` API are types for which destruction
 is necessary. To help you spot these types, we name them with the convention
 that any destructible type must start by `z_owned`.
 .
 For maximum performance, we try to make as few copies as possible. Sometimes,
 this implies moving data that you `z_owned`. Any function that takes a
 non-const pointer to a `z_owned` type will perform its destruction. To make
 this pattern more obvious, we encourage you to use the `z_move` macro instead
 of a simple `&` to create these pointers. Rest assured that all `z_owned` types
 are double-free safe, and that you may check whether any `z_owned_X_t` typed
 value is still valid by using `z_X_check(&val)`, or the `z_check(val)` macro if
 you're using C11.
 .
 We hope this convention will help you streamline your memory-safe usage of
 zenoh, as following it should make looking for leaks trivial: simply search for
 paths where a value of a `z_owned` type hasn't been passed to a function using
 `z_move`.
 .
 Functions that simply need to borrow your data will instead take values of the
 associated `z_X_t` type. You may construct them using `z_X_loan(&val)` (or the
 `z_loan(val)` generic macro with C11).
 .
 Note that some `z_X_t` typed values can be constructed without needing to
 `z_borrow` their owned variants. This allows you to reduce the amount of copies
 realized in your program.
 .
 The examples have been written with C11 in mind, using the conventions we
 encourage you to follow.
 .
 Finally, we strongly advise that you refrain from using structure field that
 starts with `_`:
 .
 - We try to maintain a common API between `zenoh-c` and
 [`zenoh-pico`](https://github.com/eclipse-zenoh/zenoh-pico), such that porting
 code from one to the other is, ideally, trivial. However, some types must have
 distinct representations in either library, meaning that using these
 representations explicitly will get you in trouble when porting.
 - We reserve the right to change the memory layout of any type which has
 `_`-prefixed fields, so trying to use them might cause your code to break on
 updates.
 .
 ## Cross-Compilation
 .
 The following alternative options have been introduced to facilitate
 cross-compilation.
 > :warning: **WARNING** :warning: : Perhaps additional efforts are necessary,
 that will depend of your environment.
 .
 - `-DZENOHC_CARGO_CHANNEL="+nightly"|"+beta"|"+stable"`: refers to a specific
 rust toolchain release
 [[rust-channels](https://rust-lang.github.io/rustup/concepts/channels.html)]
 - `-DZENOHC_CARGO_FLAGS`: several optional flags can be used for compilation.
 [[cargo flags](https://doc.rust-lang.org/cargo/commands/cargo-build.html)]
 - `-DZENOHC_CUSTOM_TARGET`: specifies a crosscompilation target. Currently rust
 support several Tire-1, Tire-2 and Tire-3 targets
 [[targets](https://doc.rust-lang.org/nightly/rustc/platform-support.html)]. But
 keep in mind that zenoh-c only have support for following targets:
 `aarch64-unknown-linux-gnu`, `x86_64-unknown-linux-gnu`,
 `arm-unknown-linux-gnueabi`
 .
 Let's put all together in an example:
 Assuming you want to crosscompile for aarch64-unknown-linux-gnu.
 .
 1. Install required packages
    - `sudo apt install gcc-aarch64-linux-gnu`
 2. *(Only if you're using `nightly`)
    - `rustup component add rust-src --toolchain nightly`
 3. Compile Zenoh-C. Assume that it's in `zenoh-c` directory. Notice that build
 in this sample is performed outside of source directory
 .
    ```bash
    export RUSTFLAGS="-Clinker=aarch64-linux-gnu-gcc -Car=aarch64-linux-gnu-ar"
    mkdir -p build && cd build
    cmake ../zenoh-c  -DZENOHC_CARGO_CHANNEL="+nightly"
 -DZENOHC_CARGO_FLAGS="-Zbuild-std=std,panic_abort"
 -DZENOHC_CUSTOM_TARGET="aarch64-unknown-linux-gnu"
 -DCMAKE_INSTALL_PREFIX=../aarch64/stage
    cmake --build . --target install
    ```
 .
 Additionally you can use `RUSTFLAGS` environment variable for lead the
 compilation.
 .
 If all goes right the building files will be located at:
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 and release files will be located at
 `/path/to/zenoh-c/target/aarch64-unknown-linux-gnu/release`
 .
 ## Rust Version
 .
 The Rust version we use is defined in
 [rust-toolchain.toml](rust-toolchain.toml), which is `1.72.0`.
 There might be some memory mapping issue if you use the later version.
 .
 You can also specify the Rust version.
 .
 ```bash
 cmake ../zenoh-c -DZENOHC_CARGO_CHANNEL="+1.72.0"
 ```
 .
 ## Zenoh features support (enabling/disabling protocols, etc)
 .
 It's necessary sometimes to build zenoh-c library with set of features
 different from default. For example: enable TCP and UDP only. This can be done
 by changing `ZENOHC_CARGO_FLAGS` parameter for cmake (notice ";" instead of
 space due to cmake peculiarities)
 .
 Available features can be found in [Cargo.toml](./Cargo.toml)
 ```bash
 cmake ../zenoh-c
 -DZENOHC_CARGO_FLAGS="--no-default-features;--features=transport_tcp,transport_udp"
 ```
 .
 ## Versioning
 .
 Being a CMake project, zenoh-c is limited to the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme [inherent
 to CMake](https://gitlab.kitware.com/cmake/cmake/-/issues/16716). However,
 zenoh-c also incorporates
 a Cargo package which cannot be versionned with the `MAJOR.MINOR.PATCH.TWEAK`
 version scheme (not
 SemVer compatible). Hence zenoh-c uses a one-to-one mapping between CMake
 versions and SemVer versions:
 .
 | CMake version           | SemVer equivalent | Meaning              |
 |-------------------------|-------------------|----------------------|
 | `1.2.3`                 | `1.2.3`           | Release version      |
 | `1.2.3.0`               | `1.2.3-dev`       | Developement version |
 | `1.2.3.x if x >= 1`     | `1.2.3-pre.x`     | Pre-release version  |
Vcs-Browser: https://github.com/eclipse-zenoh/zenoh-c
Vcs-Git: https://github.com/eclipse-zenoh/zenoh-c

