Deployment
This page explains how MNE-CPP handles deployment on Windows, Linux, and macOS. Deployment bundles the required Qt runtime libraries with the compiled applications so they can run outside of a development environment.
Build Rules
All MNE-CPP libraries are built to the mne-cpp/lib folder. All applications, test, and examples are built to the mne-cpp/out/Release folder.
Dependency Solving
MNE-CPP depends on Qt and Eigen. Eigen, as a lightweight template library, is included in the MNE-CPP repository by default and does not need further dependency solving. For Qt dependencies we use Qt specific deployment tools (windeployqt, linuxdeployqt, macdeployqt).
Windows
The WinDynamic workflow in release-windows.yml excludes examples and tests. MNE-CPP libraries are copied to both mne-cpp/lib and mne-cpp/out/Release.
Dependency resolution uses windeployqt (maintained by Qt), called from deploy.bat with dynamic as the first argument. It runs against:
- The MNE Scan
.exe(covers all application-level Qt modules) - The Disp3D
.dll(the highest-level library, linking all needed Qt modules)
Afterward, Qt and system libraries reside in mne-cpp/out/Release. The test data folder is deleted, and the output is compressed to a .zip file and uploaded as a release asset.
Linux
The LinuxDynamic workflow in release-linux.yml excludes examples and tests. CMake configures the RPATH to link against libraries in mne-cpp/lib.
Dependency resolution uses linuxdeployqt, called from the deployment script under tools/deployment.
The test data folder is deleted, and the folders out/Release/apps, out/Release/lib, out/Release/plugins, and out/Release/translations are compressed to a .tar.gz file and uploaded as a release asset.
macOS
The MacOSDynamic workflow in release-macos.yml excludes examples and tests. All applications are built as .app bundles.
Dependency resolution uses macdeployqt (maintained by Qt). MNE-CPP libraries are manually copied to each app's Contents/Frameworks folder, and resources and plugin folders are copied to the corresponding .app directories.
Before packaging, standalone plugin folders (mne_scan_plugins, mne_analyze_plugins, mne_rt_server_plugins) and the resources symlink are deleted. The out/Release folder is compressed to a .tar.gz file and uploaded as a release asset.
Static Builds
The information above corresponds to deploying the dynamically built version of MNE-CPP. In case of static deployment the process differs slightly. See the deployment scripts in tools/deployment.
Deployment Scripts
The deployment scripts live in tools/deployment. Platform-specific scripts (deploy.bat for Windows, deploy.sh for Linux/macOS) handle dependency resolution and packaging.
Each script accepts two arguments:
- Linkage type:
dynamic(default) orstatic. - Packaging: Pass
packas the second argument to generate a compressed archive (.zipor.tar.gz) containing all binaries and required libraries.
During development, running the deployment script with just the dynamic argument is useful to resolve Qt dependencies for a particular MNE-CPP application without creating a full package.
Example:
# Resolve Qt dependencies for development (no archive)
./tools/deploy.bat dynamic
# Create a distributable archive
./tools/deploy.bat dynamic pack