Packaging: each package installs its license notices under a directory of its own - share/doc/jfjoch_broker, share/doc/jfjoch_writer, share/doc/jfjoch_viewer, share/doc/jfjoch_driver_dkms - instead of all of them into the shared share/doc/jfjoch, so jfjoch and jfjoch-writer can be upgraded one at a time instead of only together.
* Packaging: each package installs its license notices under a directory of its own - `share/doc/jfjoch_broker`, `share/doc/jfjoch_writer`, `share/doc/jfjoch_viewer`, `share/doc/jfjoch_driver_dkms` - instead of all of them into the shared `share/doc/jfjoch`, so `jfjoch` and `jfjoch-writer` can be upgraded one at a time instead of only together.
Since rc.153 every component package has installed LICENSE,
THIRD_PARTY_NOTICES.md and licenses/*.txt into share/doc/jfjoch, because the
install rule loops over CPACK_COMPONENTS_ALL with one fixed destination. So
jfjoch, jfjoch-writer, and (when built) jfjoch-viewer and jfjoch-driver-dkms all
claim the same paths.
rpm and dpkg only tolerate two installed packages owning one path while the
content matches. That is fine when the packages are installed or upgraded in a
single transaction, and it breaks the moment they are upgraded one after the
other: as soon as a release changes the notices, updating jfjoch alone conflicts
with the still-installed older jfjoch-writer. PSI deployment updates them
sequentially, so in practice jfjoch could never be updated without jfjoch-writer.
Each component now installs into a directory of its own, named after the
package's principal binary: share/doc/jfjoch_broker, jfjoch_writer, jfjoch_viewer
and jfjoch_driver_dkms.
The main package moves too, rather than keeping share/doc/jfjoch, so that no
rc.163 package claims the path the old ones shared. That is what makes the first
sequential update work from any earlier release: upgrading jfjoch to rc.163 can
no longer collide with an rc.153-rc.158 jfjoch-writer that still owns
share/doc/jfjoch with different content. Keeping the main package there would
have left that hop broken - rc.153 and rc.158 ship a different
THIRD_PARTY_NOTICES.md and licenses/traccc.txt from rc.163 - and would have
required a one-off combined update on every such host. When the old sibling is
finally upgraded its claim is dropped, nothing else owns those files, and the
stale share/doc/jfjoch is removed.
These notice files were the only paths any two components had in common. Checked
by extracting every file(INSTALL) rule from the generated cmake_install.cmake
tree per component and intersecting the four packaged components pairwise: 6 of 6
pairs share nothing, where before the fix each pair shared LICENSE,
THIRD_PARTY_NOTICES.md and all of licenses/.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPzDRu2tbgFM1cCe3qYjc
Version bump: VERSION, the OpenAPI spec version and its three generated clients
(C++ server model, python client, TypeScript frontend client), the Redoc html,
docs/conf.py, the FPGA HDL version registers and the PCIe driver/DKMS version
strings, all rewritten by update_version.sh.
The API itself is unchanged in this release - the only difference in the
generated clients is the version string.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QPzDRu2tbgFM1cCe3qYjc
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
share/doc/jfjoch_broker,share/doc/jfjoch_writer,share/doc/jfjoch_viewer,share/doc/jfjoch_driver_dkms- instead of all of them into the sharedshare/doc/jfjoch, sojfjochandjfjoch-writercan be upgraded one at a time instead of only together.