From be1b22538a60e52987d238bb11f93043682b6e9a Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Wed, 24 Jun 2020 17:58:30 +0000 Subject: [PATCH] cmake: only set output paths with multiple outputs This brings cmake inline with the behaviour used for configure scripts, defined in multiple-outputs.sh. It's important because that setup hook will only set shareDocName if multiple outputs are in use (and setOutputFlags hasn't been disabled). So previously, CMAKE_INSTALL_DOCDIR would be set to $out/share/doc for single-output derivations, instead of $out/share/doc/$shareDocName, which would result in collisions. Since this hook now uses the setOutputFlags variable, I had to remove the empty assignment of it added in a714284d8b7d2dac3ed2c76670f290fe332da00c. Fixes: https://github.com/NixOS/nixpkgs/issues/82304 --- .../tools/build-managers/cmake/setup-hook.sh | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/pkgs/development/tools/build-managers/cmake/setup-hook.sh b/pkgs/development/tools/build-managers/cmake/setup-hook.sh index 87bbefa6bbfaec2..b343e1f91fceb7d 100755 --- a/pkgs/development/tools/build-managers/cmake/setup-hook.sh +++ b/pkgs/development/tools/build-managers/cmake/setup-hook.sh @@ -68,19 +68,24 @@ cmakeConfigurePhase() { # nix/store directory. cmakeFlags="-DCMAKE_INSTALL_NAME_DIR=${!outputLib}/lib $cmakeFlags" - # This ensures correct paths with multiple output derivations - # It requires the project to use variables from GNUInstallDirs module - # https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html - cmakeFlags="-DCMAKE_INSTALL_BINDIR=${!outputBin}/bin $cmakeFlags" - cmakeFlags="-DCMAKE_INSTALL_SBINDIR=${!outputBin}/sbin $cmakeFlags" - cmakeFlags="-DCMAKE_INSTALL_INCLUDEDIR=${!outputInclude}/include $cmakeFlags" - cmakeFlags="-DCMAKE_INSTALL_OLDINCLUDEDIR=${!outputInclude}/include $cmakeFlags" - cmakeFlags="-DCMAKE_INSTALL_MANDIR=${!outputMan}/share/man $cmakeFlags" - cmakeFlags="-DCMAKE_INSTALL_INFODIR=${!outputInfo}/share/info $cmakeFlags" - cmakeFlags="-DCMAKE_INSTALL_DOCDIR=${!outputDoc}/share/doc/${shareDocName} $cmakeFlags" + if [ "$outputs" != "out" -a -n "${setOutputFlags-1}" ]; then + # This ensures correct paths with multiple output derivations + # It requires the project to use variables from GNUInstallDirs module + # https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html + cmakeFlags="-DCMAKE_INSTALL_BINDIR=${!outputBin}/bin $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_SBINDIR=${!outputBin}/sbin $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_INCLUDEDIR=${!outputInclude}/include $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_OLDINCLUDEDIR=${!outputInclude}/include $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_MANDIR=${!outputMan}/share/man $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_INFODIR=${!outputInfo}/share/info $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_DOCDIR=${!outputDoc}/share/doc/${shareDocName} $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_LIBEXECDIR=${!outputLib}/libexec $cmakeFlags" + cmakeFlags="-DCMAKE_INSTALL_LOCALEDIR=${!outputLib}/share/locale $cmakeFlags" + fi + + # This output flag must always be set, unlike the others, because + # otherwise we end up with lib64. cmakeFlags="-DCMAKE_INSTALL_LIBDIR=${!outputLib}/lib $cmakeFlags" - cmakeFlags="-DCMAKE_INSTALL_LIBEXECDIR=${!outputLib}/libexec $cmakeFlags" - cmakeFlags="-DCMAKE_INSTALL_LOCALEDIR=${!outputLib}/share/locale $cmakeFlags" # Don’t build tests when doCheck = false if [ -z "${doCheck-}" ]; then @@ -115,7 +120,6 @@ cmakeConfigurePhase() { } if [ -z "${dontUseCmakeConfigure-}" -a -z "${configurePhase-}" ]; then - setOutputFlags= configurePhase=cmakeConfigurePhase fi