Skip to content

Standalone build, tests, docs, installers and CI of the OpenMS GUI layer - #1

Merged
timosachsenberg merged 17 commits into
developfrom
claude/jolly-babbage-s52h8n
Nov 9, 2026
Merged

timosachsenberg merged 17 commits into
developfrom
claude/jolly-babbage-s52h8n

Conversation

@timosachsenberg

@timosachsenberg timosachsenberg commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

Description

This repository becomes the home of the OpenMS GUI layer, moved out of OpenMS by OpenMS/OpenMS#10844 (merged). It contains the OpenMS_GUI library, TOPPView, TOPPAS, INIFileEditor, and the Qt-based TOPP tools ExecutePipeline and ImageCreator. Everything here is built against an installed OpenMS of the same version.

develop holds the GUI code exactly as it is in 501f790. It was imported with its full history (3,620 commits, extracted with git filter-repo), and issue references were rewritten to OpenMS/OpenMS#N. This PR adds everything needed to build, test, document, package and release the GUI layer on its own.

Build

  • Finds the core with find_package(OpenMS <version> EXACT CONFIG COMPONENTS CLI) and needs Qt 6. Boost is no longer needed.
  • Builds trimmed copies of the OpenMS build macros. Commit 3d94fe6 imports them verbatim, so the following commits show the changes as diffs.
  • Uses the same install layout as OpenMS, so the layer can be installed into the OpenMS prefix.
  • Ships its own CMake package OpenMSGUI (target OpenMS::OpenMS_GUI):
    • It requires exactly the OpenMS version it was built against.
    • OpenMS's find_package(OpenMS ...) loads or delegates to it.
  • Writes its own tool registry, share/OpenMS/TOOLS/OpenMS-GUI.tsv, which sits next to the core's OpenMS.tsv.
  • Refuses an OpenMS that was built with its own GUI, i.e. whose registry already lists the GUI TOPP tools. That combination would make every tool fail at startup. The layer's own OpenMS-GUI.tsv is not counted, so reconfiguring against a prefix the GUI was installed into still works.
  • Compiles the default Qt stylesheet of the GUI applications into OpenMS_GUI as a Qt resource. The core's share/OpenMS no longer has GUISTYLE, so the applications don't depend on where the layer is installed or run from.

Tests

  • Class tests of the GUI library, including the QtTest GUI tests and QApplicationTOPP_test (run offscreen).
  • Tests of the GUI TOPP tools (registry, -write_ini/-write_ctd, ImageCreator). They take FuzzyDiff and the TOPP tools from OPENMS_TOPP_BIN_DIR.
  • TOPPAS pipeline tests on the example workflows of the installed OpenMS.
  • An installed-consumer test that builds an external project against the installed layer.

Docs

  • Doxygen pages: the tool pages, the TOPPAS tutorial, and class docs with parameter tables produced by the new GUI documenters.
  • The GUI code examples.
  • The Help menus open the installed html-gui; without it they fall back to the archive.

Installers (GUI only, on top of the OpenMS installation of the same version)

  • Linux: openms-gui deb and rpm that depend on openms (= <version>), plus desktop integration.
  • macOS: a pkg (de.openms.gui) that installs into /Applications/OpenMS-<version> and checks that OpenMS is installed there. A failed fix-up or signing step stops the build.
  • Windows: an NSIS add-on. It finds the matching OpenMS install in the registry, installs into it, and has its own uninstaller uninstall-gui.exe, which the core uninstaller calls.
  • No package ships anything that OpenMS already ships.

CI

  • test.yml (this PR), nightly.yml (against OpenMS develop) and release.yml (packages, signing and notarization with the same secret names as OpenMS, a smoke test on top of the OpenMS installer, and deploy of the installers and docs to the archive).
  • The openms-core action builds the core from source and caches it per commit, or takes the published SDK and installer.
  • Move the Qt GUI to OpenMS-TOPP-GUI OpenMS#10844 is merged. CI builds the core from OpenMS develop (OPENMS_CORE_DEFAULT_REF in test.yml). Once a nightly SDK without the GUI exists, the default mode can switch to sdk, which takes minutes instead of hours.

Tested

  • Locally on Linux:
    • Full build passes and all 35 tests pass.
    • TOPPView, TOPPAS and INIFileEditor start offscreen against a core without GUISTYLE.
    • The docs build.
    • The deb installs against a dummy openms package.
    • A layered install into the core prefix runs without environment variables, and reconfiguring against that prefix works.
    • The NSIS add-on compiles, and installs and uninstalls under wine against a dummy core.
  • CI so far:
    • Linux (g++, clang, ARM) and macOS: build, GUI tests, TOPP tool tests and TOPPAS pipelines pass.
    • Windows: build and all tests pass, including the TOPPAS pipelines.
  • Downstream: openms-gui: build from OpenMS-TOPP-GUI homebrew-openms#6 builds the openms-gui formula from this repository; it passes on macOS and Linux.

Not run yet: the release workflow (signing, notarization, installers on real Windows and macOS).

Needs an admin

  • Give this repo access to the secrets: APPLE_DEVELOPER_ID_*, KEYCHAIN_PASSWORD, APPLE_APP_SPECIFIC_NOTARIZATION_PASSWORD and ARCHIVE_RRSYNC_*.
  • Allow uploads from this repo to the archive.
  • Optionally make develop the default branch of this repo.

Checklist

  • Make sure that you are listed in the AUTHORS file
  • I have commented my code, particularly in hard-to-understand areas
  • New and existing unit tests pass locally with my changes
  • If this needs a change in OpenMS (OpenMS/OpenMS), the PR there is linked

https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp

Verbatim copies of the files from OpenMS/OpenMS develop (501f790) that the
standalone GUI build, its tests, docs, packaging and CI are adapted from.
They stay in OpenMS as well, so they are copied without history. The
following commits trim and adapt them; keeping this import separate makes
those changes reviewable as diffs against the originals.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
Top-level CMakeLists.txt, cmake/find_openms.cmake and trimmed copies of the
OpenMS build macros: the GUI library, the GUI applications and the GUI TOPP
tools are built against the installed OpenMS core and CLI layers of the same
version (find_package(OpenMS EXACT COMPONENTS CLI)), with Boost and Qt 6.

- installs into the same layout as the core (bin, lib, share/OpenMS, ...),
  so the GUI layer can be installed into the core's prefix
- own CMake package OpenMSGUI (OpenMSGUIConfig.cmake, target OpenMS::OpenMS_GUI)
- tool registry of the GUI layer, share/OpenMS/TOOLS/OpenMS-GUI.tsv
- refuses an OpenMS that was built with its own GUI (imported OpenMS_GUI, or
  the GUI TOPP tools in its tool registry)
- full version string taken from the core (OpenMS_VERSION_FULLSTRING or
  OPENMS_CORE_VERSION_FULLSTRING), so packages target the core's folder

Tests, documentation and packaging are adapted in the following commits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
Intermediate checkpoint of the test setup (vendored test framework, class
tests, GUI TOPP tool tests, TOPPAS pipeline tests, installed-consumer test)
and the GUI documentation. Completed and verified in the following commits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
- doxygen documentation of the GUI layer (tool pages, TOPPAS tutorial, class
  documentation with parameter tables from the new GUI documenters)
- GUI code examples (Tutorials_build) with data of this repository
- the Help menus open the installed html-gui documentation, else the archive
- README, AGENTS.md, CLAUDE.md, CHANGELOG, licence files for Qt
- Boost is no longer needed (std::views::reverse instead of boost::adaptors)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
- deb/rpm 'openms-gui' depending on the openms package of the same version
- macOS pkg (de.openms.gui) into /Applications/OpenMS-<version>, checks for
  the OpenMS installation there; bundles share the core's lib/
- Windows NSIS add-on: finds the OpenMS installation of the same version in
  the registry, installs into it with its own uninstaller (uninstall-gui.exe),
  start menu entries and file associations
- runtime dependency set without anything OpenMS ships; Qt plugins and
  qt.conf; Qt licences; Linux desktop integration (desktop files, icons)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
- action openms-core: an OpenMS core per job, built from source (OpenMS
  develop/tag, cached per commit) or from the published SDK + installer
- test.yml (PRs), nightly.yml (against OpenMS develop), release.yml
  (packages, signing/notarization with the secrets of OpenMS, smoke test on
  top of the OpenMS installer, deploy of installers and docs to the archive)
- presets, dependency scripts, version bump script
- top level: enable_testing(), no dmg, packages without QtWebEngine

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
- Windows packages: the Qt DLLs are taken from the build's bin/ (where the
  build copies them), so all of them are packaged, not only those the
  plugins pull in
- silent NSIS installs of the OpenMS core and the GUI add-on need
  /allusers (NsisMultiUser quits in silent mode without a mode)
- macOS smoke test: the app bundles are in the OpenMS folder, not in bin/
- README: build before 'dist', install into the OpenMS prefix,
  OPENMS_EXAMPLES_DIR and OPENMS_CORE_VERSION_FULLSTRING

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
The vcpkg checkout of the core is deeper in this repository's workspace than in
the OpenMS repository, so the deepest object paths of aws-sdk-cpp exceeded
MAX_PATH and cl.exe failed with C1083 ('Cannot open compiler generated file').

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
- macOS: a failing fix_dependencies.rb or codesign stops the install (it was
  ignored); --timestamp only with a real identity
- OpenMSGUIConfig: the GUI layer needs exactly the OpenMS version it was built
  against, also when OpenMS was found before it (delegation from OpenMSConfig)
- no build-tree export of the package (it was not usable there)
- packaging overrides NO_WEBENGINE_WIDGETS without writing it into the cache
- FuzzyDiff comparison tests get the data path and Windows PATH, but no GUI
  tool registry; the registry choice is documented as made at configure time
- GUIToolDocumenter keeps the -write_ini output for its error message and
  removes the temporary INI on every path
- the Help menu finds installed docs through File::findDoc
- find_openms.cmake sets OpenMS_IGNORE_GUI_LAYER: OpenMS loads an installed
  GUI layer of its prefix, which this build provides itself

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
The OpenMS package requires OpenMP of its consumers (OpenMP::OpenMP_CXX is a
PUBLIC dependency of OpenMS::OpenMS), and clang finds it only with LLVM's
libomp. The OpenMS repository installs it for its clang job as well.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
An OpenMS built with Homebrew's keg-only libomp (the macOS presets) requires
OpenMP of every consumer, which finds it only through OpenMP_ROOT. The macOS CI
job failed at the consumer's configure.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
… merged

ExecutePipeline finds the TOPP tools of the core through PATH only with
OpenMS/OpenMS#10844; on Windows, where the core has no compiled-in install
path to fall back to, the pipeline tests failed against OpenMS develop. The
pull request is tested against that branch now (one switch,
OPENMS_CORE_DEFAULT_REF, to set back to develop after the merge); the
nightly keeps testing OpenMS develop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
OpenMS develop changed two GUI files after the split base (501f790); they are
deleted there by OpenMS/OpenMS#10844 and their changes land here:
- EnhancedTabBar: build the exception message with std::to_string (std::string
  + int relied on a global operator+ that unity batches can hide)
- Annotation1DPeakItem/Annotation1DTextItem are left out of unity batches
  (file-local dummy objects of the same name)
- add_library_macros: ENABLE_UNITYBUILD uses CMake's UNITY_BUILD in batches of
  OPENMS_UNITY_BUILD_BATCH_SIZE files, as in OpenMS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp

Copy link
Copy Markdown
Contributor Author

The red Nightly / Test against OpenMS develop / build-and-test (windows-2025, cl.exe) check is expected until OpenMS/OpenMS#10844 is merged. Nothing needs fixing in this PR.

  • Why it ran here: the scheduled nightly runs on the repository's default branch, and that is still this PR's branch.
  • What fails: the nightly builds the core from OpenMS develop. On Windows the 7 TOPPAS pipeline tests then fail with File not found (the file 'FileInfo' could not be found).
  • Why: ExecutePipeline finds the core's TOPP tools through PATH only with the lookup added in Move the Qt GUI to OpenMS-TOPP-GUI OpenMS#10844, and develop doesn't have that yet. On Linux and macOS the core falls back to its compiled-in install path, so those jobs pass.
  • What is green: this PR's own CI (Build and Test) builds the core from the companion branch and passes on all five platforms.

Once OpenMS/OpenMS#10844 is merged, the nightly goes green without any change here. At that point OPENMS_CORE_DEFAULT_REF in test.yml goes back to develop.


Generated by Claude Code

@timosachsenberg
timosachsenberg marked this pull request as ready for review November 9, 2026 06:37
Port of the GUI part of OpenMS/OpenMS#10856: the file-local dummy objects of
Annotation1DPeakItem.cpp and Annotation1DTextItem.cpp get distinct names, so
the two files can share a unity-build batch and no longer need
SKIP_UNITY_BUILD_INCLUSION.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
OpenMS/OpenMS#10844 is merged (OpenMS d99cf103), so develop has the GUI
removed and the PATH lookup of TOPP tools that the pipeline tests need on
Windows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
Pull requests take the newest cached core of OpenMS develop, which was still
built before OpenMS/OpenMS#10844 and lacks the PATH lookup of TOPP tools; the
Windows pipeline tests failed with it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp

Copy link
Copy Markdown
Contributor Author

build-and-test (ubuntu-24.04-arm, g++) failed before anything of this PR was built. While building the OpenMS core's dependencies, vcpkg timed out three times downloading https://github.com/google/snappy/archive/1.2.2.tar.gz. That is a network failure on GitHub's archive download, not caused by this PR. The other jobs of the run are still building their cores; once the run finishes, I'll re-run the failed job once.


Generated by Claude Code

Comment thread src/CMakeLists.txt Resolved
Comment thread cmake/find_openms.cmake Resolved
…ix with the GUI layer

Review findings of poshul on #1:

- QApplicationTOPP read GUISTYLE/qtStyleSheet.qss through File::find(), which searches
  the shared data of the OpenMS core. The core no longer ships GUISTYLE, so TOPPView,
  TOPPAS and INIFileEditor aborted with Exception::FileNotFound whenever the GUI layer was
  not installed into the core's prefix (e.g. when run from the build tree). The style
  sheet is now a Qt resource of libOpenMS_GUI (source/VISUAL/STYLE/style.qrc) and is no
  longer installed. New class test QApplicationTOPP_test (fails without the fix).
- cmake/find_openms.cmake refused a core whose TOOLS directory registers the GUI TOPP
  tools, and counted this layer's own OpenMS-GUI.tsv among them: reconfiguring against a
  prefix the GUI layer had been installed into failed. That file is no longer checked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
@timosachsenberg
timosachsenberg merged commit 82d4851 into develop Nov 9, 2026
6 checks passed
timosachsenberg pushed a commit to OpenMS/homebrew-openms that referenced this pull request Nov 9, 2026
OpenMS/OpenMS-TOPP-GUI#1 is merged; this is the tip of develop that bump-nightly.py pins
by default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0149aXma24dXL4j67seUsJyp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants