General
The general contract is that a plugin is made up of five kinds of files:
-
The metadata.xml file [mandatory].
-
The dynamic library(.so/.dll/.dylib) [mandatory].
-
Optional helper binaries.
-
Data files
-
Translations
The tarball is the output from make install where these files are located in the [System Install Dir](Terminology#system-install-path). In other words, the plugin should work as expected if the tarball is extracted on the system.
The plugin installer works by translating these typically read-only paths to the rw [User Install path](Terminology#user-install-path). For example, on linux:
/usr/share/opencpn => ~/.local/share/opencpn /usr/bin => ~/.local/bin /usr/lib/opencpn => ~/.local/lib/opencpn
The corresponding substitutions are made on other platforms. For this to work the tarball needs to have a specific layout like in examples below. The example plugins contains:
-
A mandatory dynamic library oesenc (with platform dependent mutations.)
-
A helper binary oeserverd
-
Data files: SymbolPatch5.xml and license.txt
-
Translations
Here is just a few file(s) of each kind mentioned; there are more of them in the actual plugin.
Example macos layout
oesenc_pi-1.2.0-2 ├── metadata.xml └── OpenCPN.app └── Contents ├── PlugIns │ ├── liboesenc_pi.dylib │ └── oeserverd ├── Resources │ ├── ar_SA.lproj │ │ └── opencpn-oesenc_pi.mo │ └── bg_BG.lproj │ └── opencpn-oesenc_pi.mo │ └── SharedSupport └── plugins └── oesenc_pi └── data ├── license.txt └── SymbolPatch5.xml
Example flatpak layout
oesenc_pi-flatpak-1.2.0/ ├── metadata.xml ├── bin │ ├── oeserver │ └── oeserverd.prog ├── lib │ └── opencpn │ └── liboesenc_pi.so ├── manifest.json └── share ├── locale │ ├── ar_SA │ │ └── LC_MESSAGES │ │ └── opencpn-oesenc_pi.mo │ └── ca_ES │ └── LC_MESSAGES │ └── opencpn-oesenc_pi.mo └── opencpn └── plugins └── oesenc_pi └── data ├── license.txt └── SymbolPatch5.xml
Example Ubuntu layout
oesenc_pi-1.2.0-2_ubuntu-16.04 │ ├── metadata.xml ├── bin │ └── oeserverd ├── lib │ └── opencpn │ ├── liboesenc_pi.so │ └── libsgllnx64-2.29.02.so └── share ├── locale │ ├── ar_SA │ │ └── LC_MESSAGES │ │ └── opencpn-oesenc_pi.mo │ └── bg_BG │ └── LC_MESSAGES │ └── opencpn-oesenc_pi.mo └── opencpn └── plugins └── oesenc_pi └── data ├── license.txt └── SymbolPatch5.xml
The example shows the directories bin, lib and share in the top
directory. Having them as /usr/\{bin, lib, share}
or
/usr/local/\{bin, lib, share}
is also ok.
Example windows layout
oesenc_pi-1.2.0-2_msvc-10.0.14393 ├── metadata.xml ├── plugins │ ├── oesenc_pi │ │ ├── data │ │ │ ├── license.txt │ │ │ └── SymbolPatch5.xml │ │ ├── msvcp140.dll │ │ ├── oeserverd.exe │ │ └── vcruntime140.dll │ └── oesenc_pi.dll └── share └── locale ├── ar_SA │ └── LC_MESSAGES │ └── opencpn-oesenc_pi.mo └── bg_BG └── LC_MESSAGES └── opencpn-oesenc_pi.mo
Tarball names
The filename need to be unique and are formed like
<plugin name>-<version>[-release]_<target os>-<target os version>[-arch].tar.gz
for example oesenc_pi-1.2.0-3_ubuntu-18.04-armhf.tar.gz
. The release
and arch parts are optional and can be omitted.