This document covers local builds, optional picoquic transport dependencies, Windows requirements, release builds, and CI build behavior.
This is the default path for local development. It works on Linux, macOS, and Windows:
cmake -S . -B build -DOPENMOQ_RUN_PICOQUIC_SMOKE_TESTS=OFF
cmake --build build
ctest --test-dir build --output-on-failureUsing presets with the same build/ output directory:
cmake --preset default
cmake --build --preset default
ctest --preset defaultOn Windows with the Visual Studio generator, the binary lands in build\Release\ or build\Debug\ depending on the config passed to --build.
The build also produces the reusable publisher API static library:
- Linux/macOS single-config builds:
build/libopenmoq_publisher.a - Visual Studio multi-config builds:
build\<config>\openmoq_publisher.lib
The CMake target remains openmoq_publisher_lib, so projects that include this repository with add_subdirectory(...) should link that target. Projects that consume the raw archive directly should add include/ to their include path and link the same transport dependencies used by the build, especially picoquic, picotls, OpenSSL, and platform socket libraries when picoquic transport support is enabled.
The default build also compiles the MSFTS Publisher API example:
cmake --build build --target openmoq-publisher-msfts-example
./build/examples/msfts-publisher/openmoq-publisher-msfts-example --helpIts CMake target links only openmoq_publisher_lib; it does not consume moq5
or picoquic APIs directly.
By default, CMake owns dependency checkouts under <build>/_deps and follows:
private-octopus/picoquicmaster- canonical
h2o/picotlsmaster, including its recorded submodules openmoq/moq5mainwhenOPENMOQ_USE_LIBMOQ_PUBLISHER=ON
The first configure downloads the current branch heads. Later configures use a successful-check timestamp in that build directory and contact upstream again after 24 hours. If a required initial download or scheduled refresh cannot reach upstream, configure fails instead of silently accepting a stale branch. Configure output records each resolved source directory, tracking branch, and commit. Run the configure command before an incremental build when you want the daily dependency check; CI and release builds always configure first.
Set OPENMOQ_DEPENDENCY_REFRESH_INTERVAL_HOURS to change the interval. Setting
it to 0 checks on every configure.
Explicit source overrides remain available for offline development or testing a local dependency change. CMake never fetches, checks out, or otherwise modifies an override directory.
Clone picoquic and canonical picotls to any convenient location and initialize the picotls submodules:
git clone https://github.com/private-octopus/picoquic.git /path/to/picoquic
git clone --recurse-submodules https://github.com/h2o/picotls.git /path/to/picotlsThen point CMake at them:
cmake -S . -B build \
-DOPENMOQ_PICOQUIC_SOURCE_DIR=/path/to/picoquic \
-DOPENMOQ_PICOTLS_SOURCE_DIR=/path/to/picotls \
-DOPENMOQ_RUN_PICOQUIC_SMOKE_TESTS=OFF
cmake --build build
ctest --test-dir build --output-on-failurepicotls requires both pkg-config and OpenSSL headers and libraries. On Windows, install both and tell CMake where OpenSSL is:
# One-time: install pkg-config shim and OpenSSL (skip if already present)
choco install pkgconfiglite openssl
cmake -S . -B build `
-DOPENSSL_ROOT_DIR="C:\Program Files\OpenSSL-Win64" `
-DOPENMOQ_RUN_PICOQUIC_SMOKE_TESTS=OFF
cmake --build build --config Release
ctest --test-dir build -C Release --output-on-failureGitHub Actions workflows set OPENSSL_ROOT_DIR automatically from the runner's pre-installed OpenSSL, so no manual step is needed there.
-DOPENMOQ_ENABLE_PICOQUIC=ON|OFF-DOPENMOQ_DEPENDENCY_REFRESH_INTERVAL_HOURS=24-DOPENMOQ_PICOQUIC_SOURCE_DIR=/path/to/picoquic(explicit local override)-DOPENMOQ_PICOTLS_SOURCE_DIR=/path/to/picotls(explicit local override)-DOPENMOQ_LIBMOQ_SOURCE_DIR=/path/to/moq5(explicit local override)-DOPENMOQ_OPENSSL_ROOT_DIR=/path/to/openssl-DOPENSSL_ROOT_DIR=/path/to/openssl-DOPENMOQ_RUN_PICOQUIC_SMOKE_TESTS=ON|OFF-DOPENMOQ_USE_LIBMOQ_PUBLISHER=ON|OFF(defaultOFF)
moqxr is migrating its publish path from the legacy MoqtSession/moxygen-style transport onto the libmoq service tier. While the migration is being reviewed, the backend is selectable:
-DOPENMOQ_USE_LIBMOQ_PUBLISHER=ON— the productionPublisherroutes batch, live stdin, live SRT, andLiveObjectSourcepublishing through a managed checkout ofopenmoq/moq5main.- local libmoq override — setting
OPENMOQ_LIBMOQ_SOURCE_DIRbuilds and validates that source tree even when the legacy backend remains selected. - Caller-supplied catalog exception — a
LiveObjectSourceusingLiveCatalogMode::kSourceObjectis routed throughMoqtSessionin either configuration. This preserves catalog formats such as MSFTS"m2ts"that libmoq's current RAW/CMAF media sender cannot author. - default (
OFF) — publishing stays on the legacy MoqtSession path.
Configure-time output reports both, e.g.:
-- OpenMOQ: libmoq available .......... ON
-- OpenMOQ: publish backend .......... legacy MoqtSession (set -DOPENMOQ_USE_LIBMOQ_PUBLISHER=ON for libmoq)
This gate is temporary — it will be removed once the libmoq publish path is
accepted as the default. An injected TransportFactory always forces the legacy
path regardless of this option.
For a local checkout override:
cmake -S . -B build-libmoq \
-DOPENMOQ_LIBMOQ_SOURCE_DIR=/path/to/moq5 \
-DOPENMOQ_USE_LIBMOQ_PUBLISHER=ON
cmake --build build-libmoq
ctest --test-dir build-libmoq --output-on-failureGitHub Actions publishes release archives for Linux, macOS, and Windows:
- pushing a
v*tag builds release artifacts and attaches them to the matching GitHub Release - running the
Release Buildsworkflow manually uploads the same archives as workflow artifacts - manual runs can also publish a GitHub Release when you provide a
release_tagsuch asv0.1.0 - CI and release use the managed dependency flow, so each clean job resolves
picoquic
masterand canonical picotlsmasterduring configure - Linux and macOS archives are
.tar.gzand containopenmoq-publisher,libopenmoq_publisher.a,include/,docs/,README.md, andLICENSE - Windows archives are
.zipand containopenmoq-publisher.exe,openmoq_publisher.lib,include/,docs/,README.md, andLICENSE
GitHub Actions builds and tests the project on:
- the default legacy backend on
ubuntu-latest,macos-latest, andwindows-latest - the opt-in libmoq backend on
ubuntu-latest, including theopenmoq-publisher-libmoq-translation-teststarget
Every lane runs CMake configure, the full default build, a static-library
existence check, and CTest. The libmoq lane also resolves openmoq/moq5 main
during configure.