chimeraproject
build & install · §

Build & install

libevpl is a C library built with CMake. A minimal build needs only a working compiler; the optional dependencies enable the acceleration backends. This page covers the standard build, the optional pieces, and a smoke test to confirm the install.

§ 01Requirements

libevpl targets modern Linux. Other platforms are best-effort.

  • OS: Linux ≥ 5.10 recommended (io_uring needs a recent kernel).
  • Compiler: GCC ≥ 11 or Clang ≥ 14 — C11 with GNU extensions.
  • Build system: CMake ≥ 3.20.
  • Toolchain: pkg-config, git, GNU make or Ninja.

§ 02Optional dependencies

Each acceleration backend brings its own dependency. Missing libraries simply disable that backend at configure time.

library
enables
status
liburing
io_uring backend for sockets and block.
recommended
librdmacm + libibverbs
RDMA Connection Manager + verbs — RoCE v2 / IB.
optional
xlio
NVIDIA XLIO userspace TCP acceleration.
optional
libvfio-user
VFIO-NVMe direct userspace block I/O.
optional
openssl
TLS termination for stream protocols.
optional
libnuma
NUMA-aware buffer pool allocation.
required

Distro install — Ubuntu / Debian

$ shell
$ sudo apt install -y build-essential cmake git pkg-config \
       liburing-dev libnuma-dev \
       librdmacm-dev libibverbs-dev rdma-core \
       libssl-dev

Distro install — RHEL / Rocky / Fedora

$ shell
$ sudo dnf install -y gcc gcc-c++ cmake git pkgconfig \
       liburing-devel numactl-devel \
       librdmacm-devel libibverbs-devel rdma-core-devel \
       openssl-devel

§ 03Get the source

$ shell
$ git clone https://github.com/chimera-nas/libevpl.git
$ cd libevpl
$ git submodule update --init --recursive

Releases are tagged in the same repository. Until 1.0, we recommend tracking main or pinning to a specific commit you’ve tested against.

§ 04Configure & build

Out-of-tree build, Release configuration:

$ shell
$ cmake -S . -B build -GNinja \
        -DCMAKE_BUILD_TYPE=Release \
        -DEVPL_RDMA=ON \
        -DEVPL_IO_URING=ON
$ cmake --build build -j
[100%] Built target evpl
[100%] Built target echo_stream
[100%] Built target echo_message

If you only need kernel sockets, you can disable every optional backend — the build still produces a useful library.

§ 05Build options

option
effect
default
EVPL_IO_URING
Build io_uring backend; requires liburing.
ON
EVPL_RDMA
Build RDMA CM backend.
ON if libs found
EVPL_XLIO
Build NVIDIA XLIO backend.
OFF
EVPL_VFIO_NVME
Build VFIO-NVMe block backend.
OFF
EVPL_TLS
TLS stream support via OpenSSL.
ON if found
EVPL_BUILD_BENCH
Build the benchmark harnesses under bench/.
ON
EVPL_BUILD_TESTS
Build the test suite.
ON
CMAKE_BUILD_TYPE
Release / Debug / RelWithDebInfo.
Release

§ 06Smoke test

Two echo servers and a self-test exercise the loop, the buffer pool, and the bind layer:

$ shell
$ ./build/test/evpl_unit
[ OK ] evpl.loop.create_destroy
[ OK ] evpl.buffer.pool_roundtrip
[ OK ] evpl.timer.periodic
[ OK ] evpl.doorbell.cross_thread
[ OK ] all tests passed

$ ./build/examples/echo_stream --listen 0.0.0.0:9000 &
$ ./build/examples/echo_stream --connect 127.0.0.1:9000 --rps 200000
echo: rtt p50=14.1µs  p99=27.3µs  rps=199942

Switching the backend doesn’t change the example code — pass --backend io_uring or --backend rdma to either binary, given the dependencies are present.

§ 07Install

$ shell
$ sudo cmake --install build --prefix /usr/local
-- Installing: /usr/local/lib/libevpl.so
-- Installing: /usr/local/include/evpl/evpl.h
-- Installing: /usr/local/lib/pkgconfig/evpl.pc

The install lays down a pkg-config file. Most build systems can find libevpl with no further hints.