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>
1.4 KiB
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
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)emitsocs_plugin_api_version()andocs_plugin_register().- The package must be built with the same toolchain and
ocs_plugin_apiversion as the host (approach B — the version symbol enforces the latter).