forked from 1b-agent/opencadstudio-upstream
feat(plugin): load external cdylib plugins at runtime (phase 2)
Move BuiltinPlugin into ocs_plugin_api (host feature) so out-of-tree crates can implement it, and add export_plugin! to emit the two C symbols a cdylib exposes: ocs_plugin_api_version (checked first, so an ABI-incompatible build never runs) and ocs_plugin_register -> boxed BuiltinPlugin. The host loads every compatible package from the plugins folder at startup via libloading (desktop only), keeps the library resident for the session, and merges its ribbon tab + command dispatch into the same paths as built-ins (honouring enable/disable). The Plugin Manager shows external packages with a Loaded / incompatible status. Approach B: the plugin hands back a boxed trait object, assuming a matching toolchain + ocs_plugin_api version (the version symbol enforces the latter). crates/ocs_example_plugin is the reference cdylib. Part of the #100 extensibility epic (phase 2). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
1 parent
f6219a9609
commit
29c71be101
14 files changed
+402
-36
No files matched your search
@@ -0,0 +1,37 @@
|
||||
# ocs_example_plugin
|
||||
|
||||
Reference **dynamically-loaded** add-on for Open CAD Studio. It depends only on
|
||||
`ocs_plugin_api` (with the `host` feature) — never on the `OpenCADStudio`
|
||||
binary — so it shows the full surface an out-of-tree plugin targets: a
|
||||
`PluginManifest`, a `CadModule` ribbon tab, a `BuiltinPlugin` entry point, and
|
||||
the `export_plugin!` C-ABI export.
|
||||
|
||||
## Build & install
|
||||
|
||||
```sh
|
||||
cargo build -p ocs_example_plugin # → target/debug/libocs_example_plugin.so
|
||||
```
|
||||
|
||||
Copy the library and `plugin.toml` into a folder named after the plugin id under
|
||||
the user plugins directory:
|
||||
|
||||
```
|
||||
<config>/OpenCADStudio/plugins/opencad.example/
|
||||
plugin.toml
|
||||
libocs_example_plugin.so # .dll on Windows, .dylib on macOS
|
||||
```
|
||||
|
||||
`<config>` is `%APPDATA%` (Windows), `~/Library/Application Support` (macOS), or
|
||||
`$XDG_CONFIG_HOME` / `~/.config` (Linux).
|
||||
|
||||
Restart Open CAD Studio. The host loads the cdylib at startup (after checking
|
||||
`ocs_plugin_api_version`), adds the **Example** ribbon tab, and routes `EX_`
|
||||
commands to it. `PLUGINS` lists it under *External* as **Loaded**; run `EX_HELLO`
|
||||
to see it respond.
|
||||
|
||||
## Contract
|
||||
|
||||
- `ocs_plugin_api::export_plugin!(MyPlugin)` emits `ocs_plugin_api_version()` and
|
||||
`ocs_plugin_register()`.
|
||||
- The package must be built with the **same toolchain and `ocs_plugin_api`
|
||||
version** as the host (approach B — the version symbol enforces the latter).
|
||||
Reference in new issue
Block a user