apiStyle for `interface: "universal"` core modules becomes "lp" (was "std"):
they now build as header-first cdylibs — Qt-free impl + the common
module-impl C ABI export seam + uniform Qt glue, with outbound
modules().<dep> calls hitting logos-protocol's lp_* C ABI directly. An
unchanged universal module recompiles Qt-free in its impl/wrapper TUs and
still loads via the same Qt plugin (load + call ABI preserved).
UI universal backends (type: ui_qml) derive a Qt SimpleSource and cannot be
Qt-free, so they stay on the std surface. Everything else (legacy) stays qt.
Pairs with logos-module-builder modulePreConfigure.universalCodegen, which
now derives the LIDL from the impl header and runs the cdylib backend.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
For interface: cdylib modules, drive the umbrella + dependency-wrapper
codegen with --api-style lp so modules().<dep>... calls the logos-protocol
C ABI directly (logos::LpClient) instead of LogosAPIClient — the module
keeps Qt out of its own translation units. universal stays std, others qt.
* Link modules against logos-qt-sdk + logos-protocol (Qt split)
The SDK stack split: logos-cpp-sdk is now the Qt-free header-only base
(detected via logos_module_context.h and linked as
logos-cpp-sdk::logos_headers), the Qt developer layer (LogosAPI,
provider glue, legacy PluginInterface) lives in logos-qt-sdk, and the
transports + lp_* C ABI live in logos-protocol.
logos_module() now resolves LOGOS_QT_SDK_ROOT / LOGOS_PROTOCOL_ROOT
(env / CMake var / sibling checkout), links
logos-qt-sdk::logos_qt_sdk (which chains logos-protocol and its
OpenSSL/Boost/nlohmann link interface), and adds the new include roots.
Source-layout builds compile qt-sdk's sources into the plugin and take
logos-protocol installed or as a subproject.
* cmake: compile the generated universal-UI glue into the plugin
type=ui_qml + interface=universal backends get their plugin class
(Q_PLUGIN_METADATA + initLogos wiring) generated into generated_code/ by
logos-qt-generator — this copy of LogosModule.cmake only picked up
logos_sdk.cpp, so the built dylib had no Qt plugin metadata at all
('Failed to extract plugin meta data'). Scoped append (not a broad glob)
so the provider-dispatch handling below can't double-compile.
* feat: pass concrete dependencies to the generator as --dep (LIDL)
buildPlugin accepts a `staticDeps` list (resolved by mkLogosModule from each
dep's published `lidl` output) and emits one escaped
`--dep=<name>=<lidl>[=<impl_class>]` flag per entry to logos-cpp-generator —
generating the name-baked modules().<dep> wrapper WITHOUT building the dep's
plugin. default.nix forwards the new arg.
The header-copy `moduleDepIncludes` is now the TRANSITIONAL fallback: it skips
any dep present in staticDeps (those come via --dep) and copies headers only
for deps that don't publish a LIDL output yet (which still builds them).
Banner-commented for removal once every module exposes packages.<sys>.lidl.
Requires logos-cpp-sdk#77 (the --dep generator flag); driven by
logos-module-builder.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* address review: use builtins.map for staticDepNames
Consistent with the nearby builtins.elem (map is a global builtin, so this is
a no-op functionally — clears the review note).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
buildPlugin accepts an interfaceDeps list and emits one
--interface <name>=<path>[=<impl_class>] flag per entry to
logos-cpp-generator during preConfigure; default.nix forwards the new arg.
The resolved paths come from mkLogosModule (local files from src, cross-repo
files from a flake input), so the generator never touches flake inputs.
Generated <name>_api.{h,cpp} flow through the existing generated_code glob —
no CMake change needed.
Requires logos-cpp-sdk#74; driven by logos-module-builder#108.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>