Repository navigation
Install the license files of the libraries into share/licenses; fix the macOS Arrow build - #187
Conversation
Software that is built against the contrib and redistributes its libraries, such as the pyOpenMS wheels, has to ship their license texts, and so far kept its own copies of them. Building a library now also installs its license and notice files, as its source archive has them, to share/licenses/<library>/ in the build directory. SOURCE.txt next to them names that archive and where it is published, which the MPL-2.0 of Eigen and the EPL-1.0 of COIN-OR ask for. The release tarballs and the manylinux image keep share/, so they carry the files. Arrow builds and links some dependencies itself: Snappy, zstd, Thrift, xsimd, RapidJSON, mimalloc, and the AWS SDK where S3 is on. Their license files are taken from the top of their source trees in Arrow's build directory and installed to share/licenses/arrow/bundled/<dependency>/, with Arrow's thirdparty/versions.txt. Library_Licences.txt and licensetexts/ are removed. They listed libraries the contrib no longer builds and pointed to web pages instead of shipping texts; the installed files supersede them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (12)
💤 Files with no reviewable changes (8)
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthroughContrib build blocks now install license and notice files for selected libraries. A shared macro records source archive metadata. Arrow builds also collect bundled dependency licenses. The README describes the installed license directories and their distribution. ChangesLicense distribution
Priority: ➖ Normal Change: Feature Merge Risk: ⚪ Minimal · up to No concrete issue has been established that should block merging. Arrow’s bundled-license collection and pyOpenMS wheel packaging remain unverified. Architecture SummaryArchitecture risk: 🔵 Low · up to The change affects 6 systems. Changed systems: Architecture concerns Review detailsSystems and components
Before / after behavior
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. I’m a rabbit; I hop by the build, Comment |
Newer Xcode versions report their libtool as "Apple Inc. version cctools_ld-<version>". Arrow 23.0.0 only accepts "cctools-<version>" and stops the configuration with "libtool found appears not to be Apple's libtool: /usr/bin/libtool", so the macOS build of the contrib fails at Arrow; the last green macOS run was on 2026-07-03, and master fails this way since (e.g. the run of 2026-07-27). Patch the check to the regex of apache/arrow#49370, which accepts both forms and still rejects GNU libtool. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7
…/licenses OpenMS/contrib#187 (d077390) makes the contrib install the license and notice files of every library it builds into share/licenses/<library>/. Each folder has a SOURCE.txt that names the source archive of its library, and arrow/bundled/ holds the files of the libraries Arrow builds itself. openms_install_contrib_licenses() now installs these folders for the libraries the build found inside OPENMS_CONTRIB_LIBS, and the copies kept in cmake/third_party_licenses/contrib are removed. COIN-OR's folder is now named coin-or. GLPK and HDF5 are covered when a build takes them from the contrib. With an older contrib, configuring warns and installing stops, so builds keep working and packages and wheels do not ship without the texts. Boost's license text moves to cmake/third_party_licenses/homebrew, for the macOS wheel: its Homebrew keg has no license file. The contrib submodule moves to d077390. The commits since e127dea also add curl's debug library on Windows and remove kissfft, which OpenMS no longer uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7
…ProteoWizard and SpectraST (#10292) * [BUILD] Ship the license texts of the bundled third-party code in the installers The 3.6.0 release-readiness check F8 found share/OpenMS/LICENSES holding only the OpenMS license, while the packages bundle many third-party libraries whose licenses require their text to accompany the binaries: the 53 vcpkg libraries next to libOpenMS in the DEB (linked into it on Windows, whose triplets are static), and in the macOS package Qt with the Homebrew libraries it needs (glib, ICU, freetype, harfbuzz, ...). openms_install_third_party_licenses() (cmake/third_party_licenses.cmake), called from package_general.cmake, installs into share/OpenMS/LICENSES, in the component share that every installation type includes: - vcpkg/<port>.txt: the copyright file vcpkg installs for every port of the target triplet. - Qt/: on Windows and macOS, which bundle Qt (the DEB depends on the distribution's), the LGPL-3.0 and GPL-3.0 texts and a README with the Qt version and where to get its source code. - homebrew/<formula>/: on macOS, the license files Homebrew keeps in the kegs of Qt's formulae and of every formula they depend on. The formulae are found from the kegs that hold Qt's CMake packages. The top-level CMakeLists.txt includes the file in every configuration, so CI parses it. The Thermo RawFileReader license on the vcpkg path is part of #10259, and the licenses of the tools in THIRDPARTY belong in OpenMS/THIRDPARTY. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] Stop configuring the macOS package if its Homebrew licenses cannot be collected If brew was missing or 'brew deps' failed, configuring only warned, and the macOS package would have gone out without the license files of Homebrew libraries it bundles. Both now stop the configuration (CodeRabbit on #10292). brew is also looked for in Homebrew's default prefixes, for a PATH without it (e.g. that of an IDE). Formulae without a top-level license file, such as Qt's own, whose licenses are in Qt/, are still only reported. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] Collect the Homebrew licenses with the brew of Qt's own installation A Mac can have two Homebrew installations, /opt/homebrew and /usr/local, and a brew answers for its own installation only. So the brew on the PATH could list the dependencies and kegs of the other installation, and their license files would go into the package (CodeRabbit on #10292). The installation's prefix now comes from Qt's kegs (<prefix>/Cellar/<formula>/<version>), and its bin/brew is used. Configuring fails if that brew does not exist, or if Qt's CMake packages come from more than one installation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] Ship the licenses of vendored code and the Thermo RawFileReader license libOpenMS compiles in third-party code that OpenMS carries in its source tree: Percolator (Apache-2.0, whose NOTICE file must accompany it and also holds the LIBLINEAR license), the libraries in src/openms/extern, libkdtree++ (Artistic-2.0, in KDTree.h) and MSNumpress (BSD-3-Clause, in MSNumpress.cpp). No installation shipped their licenses. openms_install_vendored_licenses() installs them under share/OpenMS/LICENSES/vendored in every configuration, so the Python wheels get them too. Libraries taken from vcpkg instead (USE_EXTERNAL_*) are left out; their licenses come from the vcpkg section. The openms-thermo-bridge vcpkg port combined the Thermo RawFileReader license, a Word document, with its own license in vcpkg_install_copyright(). That reads each file as text, so the document was cut off at its first NUL byte and the installers had no Thermo license. The port now installs the document as a file of its own, and a build that uses the port installs it as share/OpenMS/LICENSES/ThermoRawFileReader-License.doc, like the source build of the bridge already does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] Leave the Thermo RawFileReader license to #10259 #10259 makes the same change to the openms-thermo-bridge port and to the Thermo block of cmake_findExternalLibs.cmake. This restores both, and the CHANGELOG entry, to their state before the previous commit, so that the two pull requests do not conflict. The licenses of the vendored code stay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] Drop ProteoWizard from the Windows installer THIRDPARTY/pwiz-bin carries msconvert together with the libraries of several instrument vendors (Agilent, Bruker, SCIEX, Shimadzu, Thermo, Waters), each under its own license terms, of which the installer shipped only Agilent's and Thermo's. OpenMS itself never calls msconvert. package_general.cmake no longer stages pwiz-bin, and the NSIS template loses its Proteowizard section. The Windows installation page drops the two known issues about the .NET Framework 3.5 that ProteoWizard needed and points to ProteoWizard's website. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [GUI,DOC] Show Thermo's RawFileReader notice in the About dialog Section 3.2 of the RawFileReader license asks software that distributes it to display "RawFileReader reading tool. Copyright (c) 2016 by Thermo Fisher Scientific, Inc. All rights reserved." in its About box. Builds with WITH_THERMO_RAW ship RawFileReader, so the About dialog of TOPPView and TOPPAS (QApplicationTOPP::showAboutDialog) shows it there. The vendor-formats page and the ThermoRawFile class documentation carry the notice as well. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [CI] Ship the licenses of the libraries the wheel repair tools bundle auditwheel (Linux) and delocate (macOS) copy every shared library libOpenMS needs and the target system lacks into the pyOpenMS wheels: on 2026-09-28, OpenSSL, libxml2, liblzma and libgomp on Linux, and 122 Homebrew libraries on macOS. None of their licenses was in the wheel. tools/ci/collect_wheel_licenses.py walks the dependencies of the installed libraries as the loader resolves them, maps each library to the RPM package or Homebrew keg it comes from, and copies that package's license files to share/OpenMS/LICENSES/{system,homebrew}/<package>/, with an INDEX.txt, before the wheel is built; pyOpenMS copies share/OpenMS into the wheel. A bundled library without a package or a license file fails the step. The contrib libraries are skipped on Linux; the OpenMS build installs their licenses. Eigen, which is header-only on macOS, is named explicitly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [CI] Collect the licenses of libgomp and of Homebrew's boost The wheel jobs failed in collect_wheel_licenses.py on two libraries: - libgomp on Linux: the RPM package has no license files. gcc's spec file puts them into libgcc. A package without license files now takes those of an installed package built from the same source package. - boost on macOS: Homebrew copies only files named exactly LICENSE, COPYING and the like into a keg, so boost's LICENSE_1_0.txt is not in it. --license-file <name>=<file> supplies the text for a package or formula that ships none; the macOS job passes the Boost Software License from cmake/third_party_licenses/contrib/boost. INDEX.txt says where such a text came from. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [Packaging] Ship the licenses of the contrib libraries and the Thermo bridge's assemblies A build against the OpenMS contrib, as the pyOpenMS wheels are, links Boost, Xerces-C, libsvm, COIN-OR, Arrow and others from it, and no package manager accounts for their licenses. openms_install_contrib_licenses() installs the texts of the libraries a build found inside OPENMS_CONTRIB_LIBS, judged by the paths the find modules report, to share/OpenMS/LICENSES/contrib/<library>. Arrow brings snappy, zstd, Thrift, xsimd, RapidJSON and mimalloc, which it builds itself. The texts are those of the contrib's versions (contrib e127dea), taken verbatim from upstream. README.txt names the versions and the source code, which MPL-2.0 (Eigen) and EPL-1.0 (COIN-OR) require, and carries the acknowledgment that Eigen's MINPACK port asks for. The AWS SDK that Arrow builds on Unix is left out: OpenMS does not link it. The managed folder of the Thermo bridge gets THIRD-PARTY-NOTICES.txt for ThermoWrapperManaged (BSD-3-Clause), CommandLineParser (MIT), OpenMcdf and OpenMcdf.Extensions (MPL-2.0, with the address of the source code), and nethost (MIT, from the .NET host pack), which the native bridge links. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [CI] Resolve @rpath with the run paths of the whole load chain dyld resolves an @rpath reference against the LC_RPATHs of the image and of the images that led to it. collect_wheel_licenses.py used only the image's own, so a Homebrew library that relies on a run path of its loader would be reported as unresolved. The walk now carries the run paths down the chain and walks a library again when it is reached with run paths it has not been tried with; only references that no chain resolves are reported. The macOS package's Homebrew collector in third_party_licenses.cmake now also looks in share/doc/<formula> and share/licenses/<formula> of a keg, as the wheel script does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] Take the Thermo bridge's notices from openms-thermo-bridge 0.3.1 openms-thermo-bridge 0.3.1 publishes THIRD-PARTY-NOTICES.txt with its managed assemblies (OpenMS/openms-thermo-bridge#12). The managed directory that the build installs to share/openms_thermo_bridge/managed therefore carries the file, and the copy of the bridge 0.3.0 notices kept here is removed. Pin the bridge to v0.3.1 (d809f8a) in the FetchContent declaration, in the vcpkg overlay port (SHA512 of its source archive) and in fetch_thermo_assets.sh (SHA-256 of the v0.3.1 release zips), and require 0.3.1 from a system installation. A managed directory without the notices, e.g. a pre-built one of an older bridge, stops the installation instead of shipping the assemblies without them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] Take the contrib libraries' licenses from the contrib's share/licenses OpenMS/contrib#187 (d077390) makes the contrib install the license and notice files of every library it builds into share/licenses/<library>/. Each folder has a SOURCE.txt that names the source archive of its library, and arrow/bundled/ holds the files of the libraries Arrow builds itself. openms_install_contrib_licenses() now installs these folders for the libraries the build found inside OPENMS_CONTRIB_LIBS, and the copies kept in cmake/third_party_licenses/contrib are removed. COIN-OR's folder is now named coin-or. GLPK and HDF5 are covered when a build takes them from the contrib. With an older contrib, configuring warns and installing stops, so builds keep working and packages and wheels do not ship without the texts. Boost's license text moves to cmake/third_party_licenses/homebrew, for the macOS wheel: its Homebrew keg has no license file. The contrib submodule moves to d077390. The commits since e127dea also add curl's debug library on Windows and remove kissfft, which OpenMS no longer uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] THIRDPARTY: ship the tools' license texts, drop SpectraST Moves the THIRDPARTY submodule from 00c619e (MaRaCluster 1.04.1, #10259) to abe0956 on its master, which adds the license texts of Comet, MaRaCluster, Percolator and X!Tandem to their folders and a THIRD-PARTY-NOTICES.txt for ThermoRawFileParser's assemblies, and removes SpectraST (GPL, shipped without its text or source). install_thirdparty_folder() installs each tool folder whole, so the packages pick the texts up without a CMake change. The SpectraST tests in third_party_tests.cmake are already disabled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] THIRD-PARTY-NOTICES.txt: the third-party license texts of an installation in one file share/OpenMS/THIRD-PARTY-NOTICES.txt lists the third-party components an installation contains, grouped by where they come from (Qt, vcpkg, Homebrew, the contrib, the build system, code compiled into OpenMS, the Thermo reader, the THIRDPARTY tools), each with the numbers of the texts that apply to it. Then it gives the texts, each once: components whose texts are identical up to white space share a number. For the Linux wheel, 99 license files become 56 components and 76 texts. The code that installs license files records them with openms_add_third_party_notice(). The list is written when configuring, the notices when installing, in the component 'share': the Thermo bridge's notices exist only after the build, and the package generators install each component into a folder of its own. The wheel builds write the notices again from the installed tree (cmake -P) after collect_wheel_licenses.py has added the libraries the repair tools copy in. The files stay in share/OpenMS/LICENSES and the tool folders. The DEB also installs them, after the OpenMS license, as /usr/share/doc/openms/copyright (Debian policy 12.5). License.txt, which the installers show and the wheels carry as their license file, points to the notices instead of ending with a list of third-party code that had one entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [DOC] CHANGELOG: the license entries of this PR in four bullets The seven bullets that had grown with the PR repeated each other: the wheels, the Thermo bridge and THIRD-PARTY-NOTICES.txt had bullets of their own. Now one bullet says what share/OpenMS/LICENSES and THIRD-PARTY-NOTICES.txt hold, one covers the THIRDPARTY tools and the Thermo bridge, and ProteoWizard and the About dialog keep theirs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] Wheels built with vcpkg carry the license texts of the vcpkg ports The Linux and Windows wheels link their dependencies statically from vcpkg now (#10331, #10333), so the texts they need are the copyright files of the vcpkg ports, as for the packages. openms_install_vcpkg_licenses() installs LICENSES/vcpkg/<port>.txt for every installation built with vcpkg, not only for packages, and records the files for THIRD-PARTY-NOTICES.txt. - No wheel or package uses the contrib any more (#10328), so openms_install_contrib_licenses(), LICENSES/contrib/ and its group in the notices are gone, and the contrib submodule stays at develop's revision. - Linux wheels: tools/ci/build_openms_manylinux.sh collects the licenses of the system libraries auditwheel grafts (GCC's libgomp, libgfortran and libquadmath), skipping the vcpkg tree, and writes THIRD-PARTY-NOTICES.txt again. - The Windows wheel bundles only OpenMS's own DLLs and the MSVC runtime, so it needs no collector. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 * [BUILD] Leave vcpkg's build helpers out of the license texts On Linux the host triplet is also the target triplet, so the installed tree of the target triplet holds the host dependencies too: vcpkg-cmake, vcpkg-cmake-config, vcpkg-cmake-get-vars, vcpkg-boost and vcpkg-make in the wheels. These ports only carry CMake scripts for the builds of other ports, and no installation contains anything of them, yet their license texts were installed and listed in THIRD-PARTY-NOTICES.txt. openms_install_vcpkg_licenses() now reads the file list that vcpkg keeps for every installed port (vcpkg/info/<port>_<version>_<triplet>.list) and leaves out the ports that install nothing outside their own share/<port> folder. A port with any other file keeps its license, and so does a port without a file list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7 --------- Co-authored-by: Claude <noreply@anthropic.com>
Description
Software that is built against the contrib and redistributes its libraries has to ship their license texts. The pyOpenMS wheels for Linux and Windows are such software, and OpenMS/OpenMS#10292 so far adds its own copies of the texts for them. This PR installs the texts in the contrib instead, taken straight from the source archives, so OpenMS can pick them up from the contrib build.
share/licenses/<library>/in the build directory. This covers:SOURCE.txtin each folder names the source archive, its SHA-256 and where it is published. It also points to this repository for the build scripts and patches. MPL-2.0 (Eigen) and EPL-1.0 (COIN-OR, which the contrib patches) ask for this.share/licenses/arrow/bundled/<dependency>/gets the license files from the top of their source trees in Arrow's build directory, plus Arrow'sthirdparty/versions.txt.FATAL_ERROR, as the other macros do.lib bin include share) and the manylinux image keepshare/, so both carry the files.Library_Licences.txtandlicensetexts/are removed. They linked to web pages for libraries the contrib no longer builds, and the installed files replace them.macOS build
The macOS job of this workflow has failed on master since July; the last green run was on 2026-07-03.
Apple Inc. version cctools_ld-<version>, but Arrow 23.0.0 only acceptscctools-<version>. Its configuration therefore stops withlibtool found appears not to be Apple's libtool: /usr/bin/libtool.patches/arrow/BuildUtils.cmake.diffchanges that check to the regex of GH-49369: [C++][R] Deal with validating libtool again apache/arrow#49370. That regex accepts both forms and still rejects GNU libtool.Testing
SOURCE.txtmatches the archive.versions.txtfrom the real build tree.OPENMS_PATCHapplies it to the Arrow 23.0.0 source and skips it on a second run.Apple Inc. version cctools_ld-1266.5andApple Inc. version cctools-1010.6, and rejects GNU libtool's output and empty output.Installing ... license files .. done.After merging
ghcr.io/openms/contrib_manylinux_2_34:latest, which the Linux wheels use.CIworkflow creates a release withcontrib_build-*.tar.gz, which the Windows wheels download.<contrib>/share/licenses/and drops its copies.🤖 Generated with Claude Code
https://claude.ai/code/session_01YC1T2K9HQEUk2kQMZqC8h7
Generated by Claude Code
Summary by CodeRabbit
New Features
share/licenses/<library>/.SOURCE.txtwith archive and source details.Documentation