The project includes a Nix flake for reproducible builds with a modular structure:
# Build everything (default)
nix build
# Or explicitly
nix build '.#logos-cpp-sdk'
nix build '.#default'The result will include:
/bin/logos-cpp-generator- Code generator binary/lib/- SDK libraries/include/- Headers (core/ and cpp/)
# Build only the generator binary (outputs to /bin)
nix build '.#logos-cpp-bin'
# Build only the SDK library (outputs to /lib)
nix build '.#logos-cpp-lib'
# Build only the headers (outputs to /include)
nix build '.#logos-cpp-include'
# Legacy alias for generator
nix build '.#cpp-generator'# Enter development shell with all dependencies
nix developNote: In zsh, you need to quote the target (e.g., '.#logos-cpp-sdk') to prevent glob expansion.
If you don't have flakes enabled globally, add experimental flags:
nix build '.#logos-cpp-sdk' --extra-experimental-features 'nix-command flakes'The compiled artifacts can be found at result/
The nix build system is organized into modular files in the /nix directory:
nix/default.nix- Common configuration (dependencies, flags, metadata)nix/bin.nix- Generator binary compilationnix/lib.nix- SDK library compilationnix/include.nix- Header installation
cd cpp
./compile.shcd cpp-generator
./compile.shThe generator binary will be available at build/bin/logos-cpp-generator.
The logos-cpp-generator tool generates C++ wrapper code for Logos plugins.
# Generate wrapper for a single plugin (uses default output directory)
logos-cpp-generator /path/to/plugin.dylib
# Specify custom output directory
logos-cpp-generator /path/to/plugin.dylib --output-dir /custom/output/path
# Generate only the module files (no core manager or umbrella headers)
logos-cpp-generator /path/to/plugin.dylib --module-only
# Combine options
logos-cpp-generator /path/to/plugin.dylib --output-dir /custom/output --module-only# List dependencies from metadata.json
logos-cpp-generator --metadata /path/to/metadata.json
# Generate wrappers for all dependencies
logos-cpp-generator --metadata /path/to/metadata.json --module-dir /path/to/modules
# Generate with custom output directory
logos-cpp-generator --metadata /path/to/metadata.json --module-dir /path/to/modules --output-dir /custom/output
# Generate only module files (no core manager or umbrella headers)
logos-cpp-generator --metadata /path/to/metadata.json --module-dir /path/to/modules --module-only
# Generate only core manager and umbrella files (assumes module files already exist)
logos-cpp-generator --metadata /path/to/metadata.json --general-only
# Generate general files with custom output directory
logos-cpp-generator --metadata /path/to/metadata.json --general-only --output-dir /custom/output--output-dir /path/to/output
- Default: If not specified, generated files are placed in
logos-cpp-sdk/cpp/generated/ - Custom: Specify any directory for the generated files
- The output directory will be created automatically if it doesn't exist
--module-only
- When specified, generates only the requested module's
.hand.cppfiles - Skips generation of
core_manager_api.*and umbrella headers (logos_sdk.*) - Useful when you only need wrapper code for specific modules
--general-only
- When specified with
--metadata, generates only the core manager and umbrella SDK files - Assumes module wrapper files already exist in the output directory
- Generates:
core_manager_api.h,core_manager_api.cpp,logos_sdk.h,logos_sdk.cpp - The umbrella headers will include references to all modules listed in the metadata's
dependenciesarray - For each dependency (e.g.,
"waku_module"), it will:- Include
waku_module_api.hin the header - Include
waku_module_api.cppin the source - Create a
WakuModule waku_module;member in theLogosModulesstruct
- Include
- Does not require
--module-dirsince it doesn't process plugins
By default (without --module-only or --general-only):
<module>_api.hand<module>_api.cpp- Wrapper code for each modulecore_manager_api.handcore_manager_api.cpp- Core manager wrapperlogos_sdk.handlogos_sdk.cpp- Umbrella headers including all modules
With --module-only:
- Only
<module>_api.hand<module>_api.cpp- Wrapper code for the requested module(s)
With --general-only:
- Only
core_manager_api.handcore_manager_api.cpp- Core manager wrapper - Only
logos_sdk.handlogos_sdk.cpp- Umbrella headers that reference existing module files
A common workflow is to generate module wrappers separately, then generate the umbrella SDK:
# Step 1: Generate individual module wrappers
logos-cpp-generator /path/to/plugin1.dylib --module-only --output-dir ./generated
logos-cpp-generator /path/to/plugin2.dylib --module-only --output-dir ./generated
# Step 2: Generate core manager and umbrella SDK (references modules from step 1)
logos-cpp-generator --metadata metadata.json --general-only --output-dir ./generatedThis approach gives you fine-grained control over which modules to include and allows rebuilding just the umbrella headers without regenerating all module wrappers.
- CMake (3.x or later)
- Ninja build system
- pkg-config
- Qt6 (qtbase)
- Qt6 Remote Objects (qtremoteobjects)
- macOS (aarch64-darwin, x86_64-darwin)
- Linux (aarch64-linux, x86_64-linux)