CMakeLists: make daedalus-fourier.pc relocatable via ${pcfiledir} #5
Reference in New Issue
Block a user
Delete Branch "noether/pkgconfig-relocatable-prefix"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fixes a pkg-config bug where the .pc generated by
cmake --install --prefix /foostill hard-coded the configure-time CMAKE_INSTALL_PREFIX (typically/usr/local), breaking downstream consumers that build against ad-hoc install trees.Concrete bite
Encountered today on hertz during the deploy-test of daedalus-v4l2 PRs #21/#22:
Daemon's
pkg_check_modules(DAEDALUS_FOURIER ...)then resolved include path to/usr/local/include(empty on the test host) and main.c failed:Fix
Write the .pc with
prefix=${pcfiledir}/<rel>where<rel>is the configure-time-computed relative path from<prefix>/<libdir>/pkgconfigback to<prefix>. pkg-config substitutes${pcfiledir}with the actual on-disk location of the .pc at lookup time, so prefix tracks wherever the install tree ends up.The relative-path computation handles GNUInstallDirs multiarch layouts (Debian's
lib/aarch64-linux-gnu) without hard-coding../...Verification (hertz Debian trixie, libdir=lib)
Works for
cmake --install --prefix /foo, DESTDIR-staged installs, apt package installs, and any test-tree relocation.Unblocks daedalus-v4l2 daemon out-of-tree builds against local daedalus-fourier installs (the hertz deploy of PRs #21/#22).
The pkg-config file was generated at *configure* time with `prefix=${CMAKE_INSTALL_PREFIX}`, which captured whatever CMAKE_INSTALL_PREFIX happened to be set to at `cmake -B build` time — typically the default `/usr/local`. `cmake --install build --prefix /foo` then put the files under /foo but the .pc still pointed pkg-config at /usr/local/include and /usr/local/lib, which broke downstream consumers configuring against the install tree. Concrete bite encountered today on hertz: the daedalus-v4l2 daemon CMake configure on a /tmp/df-prefix install tree resolved DAEDALUS_FOURIER_INCLUDE_DIRS to /usr/local/include (empty path on the test host), so main.c failed to find <daedalus.h>. Fix: write the .pc with `prefix=${pcfiledir}/<rel>` where <rel> is the configure-time-computed relative path from <prefix>/<libdir>/pkgconfig back to <prefix>. pkg-config substitutes ${pcfiledir} with the actual on-disk location of the .pc at lookup time, so the resolved prefix tracks wherever the install tree is moved to — including DESTDIR-staged builds, apt package installs, and ad-hoc `cmake --install --prefix /tmp/foo` test installs. The relative-path computation handles GNUInstallDirs layouts that add multiarch tuples (Debian's lib/aarch64-linux-gnu) without hard-coding `../..`. Tested on hertz (Debian trixie, libdir=lib): prefix=${pcfiledir}/../../ ... $ pkg-config --variable=prefix daedalus-fourier /tmp/df-prefix-test/lib/pkgconfig/../../ # mv preserves relocation: $ mv /tmp/df-prefix-test /tmp/df-prefix-moved $ pkg-config --variable=prefix daedalus-fourier /tmp/df-prefix-moved/lib/pkgconfig/../../ This unblocks the daedalus-v4l2 daemon out-of-tree builds against local daedalus-fourier installs and is a prerequisite for tidy test-rig deployments (per the hertz reload session 2026-05-23).