Files
logos-module-builder/docs/quick-reference.md

306 lines
7.0 KiB
Markdown
Raw Permalink Normal View History

2026-01-23 08:50:17 -05:00
# Quick Reference
Cheat sheet for common logos-module-builder tasks.
## Create a New Module
```bash
# 1. Create directory
mkdir logos-my-module && cd logos-my-module
# 2. Create metadata.json
2026-01-23 08:50:17 -05:00
cat > metadata.json << 'EOF'
{
"name": "my_module",
"display_name": "My Module",
2026-01-23 08:50:17 -05:00
"version": "1.0.0",
"type": "core",
"interface": "universal",
2026-01-23 08:50:17 -05:00
"category": "general",
"description": "My module",
2026-01-23 08:50:17 -05:00
"main": "my_module_plugin",
"dependencies": [],
"nix": {
"packages": { "build": [], "runtime": [] },
"external_libraries": [],
"cmake": { "find_packages": [], "extra_sources": [] }
}
2026-01-23 08:50:17 -05:00
}
EOF
# 3. Create flake.nix
cat > flake.nix << 'EOF'
{
2026-03-26 11:27:34 +01:00
inputs = {
logos-module-builder.url = "github:logos-co/logos-module-builder";
};
outputs = inputs@{ logos-module-builder, ... }:
logos-module-builder.lib.mkLogosModule {
src = ./.;
configFile = ./metadata.json;
flakeInputs = inputs;
};
}
EOF
# 4. Create CMakeLists.txt
2026-01-23 08:50:17 -05:00
cat > CMakeLists.txt << 'EOF'
cmake_minimum_required(VERSION 3.14)
project(MyModulePlugin LANGUAGES CXX)
include($ENV{LOGOS_MODULE_BUILDER_ROOT}/cmake/LogosModule.cmake)
logos_module(NAME my_module SOURCES src/my_module_impl.h src/my_module_impl.cpp)
2026-01-23 08:50:17 -05:00
EOF
# 5. Create source files in src/ directory (universal model: impl class only)
mkdir -p src
# (see templates for source file content)
2026-01-23 08:50:17 -05:00
# 6. Track files and build
git init && git add -A
2026-01-23 08:50:17 -05:00
nix build
```
## metadata.json Quick Reference
2026-01-23 08:50:17 -05:00
```json
{
"name": "module_name",
"version": "1.0.0",
"type": "core",
"interface": "universal",
"category": "general",
"description": "A Logos module",
"main": "module_name_plugin",
"dependencies": ["waku_module", "other_module"],
2026-01-23 08:50:17 -05:00
"nix": {
"packages": {
"build": ["protobuf", "abseil-cpp"],
"runtime": ["zstd"]
},
"external_libraries": [
{ "name": "mylib", "vendor_path": "lib" }
],
"cmake": {
"find_packages": ["Protobuf", "Threads"],
"extra_sources": ["src/helper.cpp"],
"extra_include_dirs": ["include"],
"extra_link_libraries": ["pthread"]
}
}
}
2026-01-23 08:50:17 -05:00
```
## CMakeLists.txt Quick Reference
```cmake
cmake_minimum_required(VERSION 3.14)
project(MyModulePlugin LANGUAGES CXX)
include($ENV{LOGOS_MODULE_BUILDER_ROOT}/cmake/LogosModule.cmake)
logos_module(
NAME my_module
SOURCES
src/my_module_impl.h
src/my_module_impl.cpp
2026-01-23 08:50:17 -05:00
src/helper.cpp
EXTERNAL_LIBS
mylib
FIND_PACKAGES
Protobuf
LINK_LIBRARIES
pthread
)
```
> `PROTO_FILES` used to be accepted here and is not parsed any more — compile
> `.proto` files yourself and add the results via `nix.cmake.extra_sources`.
2026-01-23 08:50:17 -05:00
## flake.nix Quick Reference
### Basic Module
```nix
{
2026-03-26 11:27:34 +01:00
inputs = {
logos-module-builder.url = "github:logos-co/logos-module-builder";
};
outputs = inputs@{ logos-module-builder, ... }:
2026-01-23 08:50:17 -05:00
logos-module-builder.lib.mkLogosModule {
src = ./.;
configFile = ./metadata.json;
flakeInputs = inputs;
2026-01-23 08:50:17 -05:00
};
}
```
### With Module Dependencies
```nix
{
inputs = {
logos-module-builder.url = "github:logos-co/logos-module-builder";
waku_module.url = "github:logos-co/logos-waku-module"; # input name must match dependency name
2026-01-23 08:50:17 -05:00
};
outputs = inputs@{ logos-module-builder, ... }:
2026-01-23 08:50:17 -05:00
logos-module-builder.lib.mkLogosModule {
src = ./.;
configFile = ./metadata.json;
flakeInputs = inputs; # waku_module resolved automatically from dependencies[]
2026-01-23 08:50:17 -05:00
};
}
```
### With External Library (flake input, built from source)
2026-01-23 08:50:17 -05:00
```nix
{
inputs = {
logos-module-builder.url = "github:logos-co/logos-module-builder";
mylib = { url = "github:org/mylib"; flake = false; };
};
outputs = inputs@{ logos-module-builder, ... }:
2026-01-23 08:50:17 -05:00
logos-module-builder.lib.mkLogosModule {
src = ./.;
configFile = ./metadata.json;
flakeInputs = inputs;
2026-01-23 08:50:17 -05:00
externalLibInputs = {
mylib = inputs.mylib;
2026-01-23 08:50:17 -05:00
};
};
}
```
### ui_qml Module (QML view + optional C++ backend)
```nix
{
inputs = {
logos-module-builder.url = "github:logos-co/logos-module-builder";
# Add backend module dependencies as inputs if needed
};
outputs = inputs@{ logos-module-builder, ... }:
logos-module-builder.lib.mkLogosQmlModule {
src = ./.;
configFile = ./metadata.json;
flakeInputs = inputs;
};
}
```
## Source File Templates (universal model)
2026-01-23 08:50:17 -05:00
You write only the impl class. Everything else is generated from
`src/my_module_impl.h` into `generated_code/`: `my_module.lidl` (the contract),
`my_module_cdylib_glue.{h,cpp}` (the Qt plugin, `Q_PLUGIN_METADATA` + `onInit`)
and `my_module_module_impl.cpp` / `my_module_types.h` (the Qt-free C ABI).
The old `*_interface.h` / `*_plugin.{h,cpp}` names are no longer emitted.
Module code is Qt-free — use `std::string`.
### Impl Header (`src/my_module_impl.h`)
2026-01-23 08:50:17 -05:00
```cpp
#pragma once
2026-01-23 08:50:17 -05:00
#include <string>
#include "logos_module_context.h"
2026-01-23 08:50:17 -05:00
class MyModuleImpl : public LogosModuleContext
2026-01-23 08:50:17 -05:00
{
public:
/// Returns a processed string. Public methods are the module API.
std::string myMethod(const std::string& input);
logos_events:
/// Typed event; subscribers use `modules().my_module.onProcessed(...)`.
void processed(const std::string& result);
2026-01-23 08:50:17 -05:00
};
```
### Impl Implementation (`src/my_module_impl.cpp`)
2026-01-23 08:50:17 -05:00
```cpp
#include "my_module_impl.h"
2026-01-23 08:50:17 -05:00
std::string MyModuleImpl::myMethod(const std::string& input) {
std::string result = "Result: " + input;
processed(result); // generated event body fans out to subscribers
return result;
}
```
2026-01-23 08:50:17 -05:00
`LogosModuleContext` gives you `modules().<dep>.method(...)` for typed calls into
dependencies, typed event subscriptions, and an `onContextReady()` hook (override
it to arm subscriptions once the module is wired).
2026-01-23 08:50:17 -05:00
### UI C++ backend (universal `ui_qml`)
2026-01-23 08:50:17 -05:00
For a C++ UI module (`"type": "ui_qml"` + `"interface": "universal"`) you write a
`.rep` view contract plus a `*Backend` class deriving the generated
`<RepClass>SimpleSource` and `LogosUiPluginContext`. Point `codegen.rep` at the
`.rep` and use `REP_FILE` in `CMakeLists.txt`:
```cpp
// src/my_ui.rep — the QtRO view contract
class MyUi {
SLOT(int add(int a, int b))
PROP(QString status="Ready" READONLY)
}
```
```cpp
// src/my_ui_backend.h
#pragma once
#include "rep_my_ui_source.h"
#include "logos_ui_plugin_context.h"
class MyUiBackend : public MyUiSimpleSource, public LogosUiPluginContext {
2026-01-23 08:50:17 -05:00
public:
int add(int a, int b) override; // feed PROPs via setStatus(...)
2026-01-23 08:50:17 -05:00
};
```
```cmake
logos_module(
NAME my_ui
REP_FILE src/my_ui.rep
SOURCES
src/my_ui_backend.h
src/my_ui_backend.cpp
INCLUDE_DIRS
src
)
2026-01-23 08:50:17 -05:00
```
## Common Commands
```bash
# Build module (combined lib + include)
2026-01-23 08:50:17 -05:00
nix build
# Build just the library
nix build .#lib
# Build just the generated headers
nix build .#include
# Build .lgx packages
2026-03-26 11:27:34 +01:00
nix build .#lgx
nix build .#lgx-portable
# Run UI module in logos-standalone-app
nix run .
2026-01-23 08:50:17 -05:00
# Enter dev shell
nix develop
# Build specific output (alternative syntax)
2026-01-23 08:50:17 -05:00
nix build .#my_module-lib
nix build .#my_module-include
# Check flake
nix flake check
# Update flake inputs
nix flake update
```