From 3ba9aa6676b9c28104f7debab4dc4fd330414506 Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Thu, 22 Aug 2024 03:48:30 +0800 Subject: [PATCH 1/3] cmake: setup-hook.sh: format with shfmt Format with `shfmt -i 4 -w pkgs/by-name/cm/cmake/setup-hook.sh`. Keeping the code auto-formatted makes refactoring easier. --- pkgs/by-name/cm/cmake/setup-hook.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/cm/cmake/setup-hook.sh b/pkgs/by-name/cm/cmake/setup-hook.sh index 0bb0426bca824..637ed034ee909 100755 --- a/pkgs/by-name/cm/cmake/setup-hook.sh +++ b/pkgs/by-name/cm/cmake/setup-hook.sh @@ -9,7 +9,7 @@ fixCmakeFiles() { echo "fixing cmake files..." find "$1" -type f \( -name "*.cmake" -o -name "*.cmake.in" -o -name CMakeLists.txt \) -print | while read fn; do - sed -e 's^/usr\([ /]\|$\)^/var/empty\1^g' -e 's^/opt\([ /]\|$\)^/var/empty\1^g' < "$fn" > "$fn.tmp" + sed -e 's^/usr\([ /]\|$\)^/var/empty\1^g' -e 's^/opt\([ /]\|$\)^/var/empty\1^g' <"$fn" >"$fn.tmp" mv "$fn.tmp" "$fn" done } @@ -77,7 +77,7 @@ cmakeConfigurePhase() { if [[ -z "$shareDocName" ]]; then local cmakeLists="${cmakeDir}/CMakeLists.txt" if [[ -f "$cmakeLists" ]]; then - local shareDocName="$(grep --only-matching --perl-regexp --ignore-case '\bproject\s*\(\s*"?\K([^[:space:]")]+)' < "$cmakeLists" | head -n1)" + local shareDocName="$(grep --only-matching --perl-regexp --ignore-case '\bproject\s*\(\s*"?\K([^[:space:]")]+)' <"$cmakeLists" | head -n1)" fi # The argument sometimes contains garbage or variable interpolation. # When that is the case, let’s fall back to the derivation name. From d00607f4df18ba242c9d4d7ce44e6b2f9a05ecea Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Mon, 19 Aug 2024 04:39:15 +0800 Subject: [PATCH 2/3] cmake: setup-hook.sh: collect default flags into cmakeDefaultFlags Collect the default CMake configure flags collected by cmakeConfigurePhase into a Bash array named cmakeDefaultFlags. --- pkgs/by-name/cm/cmake/setup-hook.sh | 124 ++++++++++++++-------------- 1 file changed, 64 insertions(+), 60 deletions(-) diff --git a/pkgs/by-name/cm/cmake/setup-hook.sh b/pkgs/by-name/cm/cmake/setup-hook.sh index 637ed034ee909..1204d28d68fbb 100755 --- a/pkgs/by-name/cm/cmake/setup-hook.sh +++ b/pkgs/by-name/cm/cmake/setup-hook.sh @@ -37,40 +37,7 @@ cmakeConfigurePhase() { : ${cmakeDir:=.} fi - if [ -z "${dontAddPrefix-}" ]; then - prependToVar cmakeFlags "-DCMAKE_INSTALL_PREFIX=$prefix" - fi - - # We should set the proper `CMAKE_SYSTEM_NAME`. - # http://www.cmake.org/Wiki/CMake_Cross_Compiling - # - # Unfortunately cmake seems to expect absolute paths for ar, ranlib, and - # strip. Otherwise they are taken to be relative to the source root of the - # package being built. - prependToVar cmakeFlags "-DCMAKE_CXX_COMPILER=$CXX" - prependToVar cmakeFlags "-DCMAKE_C_COMPILER=$CC" - prependToVar cmakeFlags "-DCMAKE_AR=$(command -v $AR)" - prependToVar cmakeFlags "-DCMAKE_RANLIB=$(command -v $RANLIB)" - prependToVar cmakeFlags "-DCMAKE_STRIP=$(command -v $STRIP)" - - # on macOS we want to prefer Unix-style headers to Frameworks - # because we usually do not package the framework - prependToVar cmakeFlags "-DCMAKE_FIND_FRAMEWORK=LAST" - - # we never want to use the global macOS SDK - prependToVar cmakeFlags "-DCMAKE_OSX_SYSROOT=" - - # correctly detect our clang compiler - prependToVar cmakeFlags "-DCMAKE_POLICY_DEFAULT_CMP0025=NEW" - - # This installs shared libraries with a fully-specified install - # name. By default, cmake installs shared libraries with just the - # basename as the install name, which means that, on Darwin, they - # can only be found by an executable at runtime if the shared - # libraries are in a system path or in the same directory as the - # executable. This flag makes the shared library accessible from its - # nix/store directory. - prependToVar cmakeFlags "-DCMAKE_INSTALL_NAME_DIR=${!outputLib}/lib" + declare -ga cmakeDefaultFlags=() # The docdir flag needs to include PROJECT_NAME as per GNU guidelines, # try to extract it from CMakeLists.txt. @@ -90,41 +57,78 @@ cmakeConfigurePhase() { fi fi - # 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 - prependToVar cmakeFlags "-DCMAKE_INSTALL_BINDIR=${!outputBin}/bin" - prependToVar cmakeFlags "-DCMAKE_INSTALL_SBINDIR=${!outputBin}/sbin" - prependToVar cmakeFlags "-DCMAKE_INSTALL_INCLUDEDIR=${!outputInclude}/include" - prependToVar cmakeFlags "-DCMAKE_INSTALL_OLDINCLUDEDIR=${!outputInclude}/include" - prependToVar cmakeFlags "-DCMAKE_INSTALL_MANDIR=${!outputMan}/share/man" - prependToVar cmakeFlags "-DCMAKE_INSTALL_INFODIR=${!outputInfo}/share/info" - prependToVar cmakeFlags "-DCMAKE_INSTALL_DOCDIR=${!outputDoc}/share/doc/${shareDocName}" - prependToVar cmakeFlags "-DCMAKE_INSTALL_LIBDIR=${!outputLib}/lib" - prependToVar cmakeFlags "-DCMAKE_INSTALL_LIBEXECDIR=${!outputLib}/libexec" - prependToVar cmakeFlags "-DCMAKE_INSTALL_LOCALEDIR=${!outputLib}/share/locale" + cmakeDefaultFlags+=( + # We should set the proper `CMAKE_SYSTEM_NAME`. + # http://www.cmake.org/Wiki/CMake_Cross_Compiling + # + # Unfortunately cmake seems to expect absolute paths for ar, ranlib, and + # strip. Otherwise they are taken to be relative to the source root of the + # package being built. + "-DCMAKE_CXX_COMPILER=$CXX" + "-DCMAKE_C_COMPILER=$CC" + "-DCMAKE_AR=$(command -v $AR)" + "-DCMAKE_RANLIB=$(command -v $RANLIB)" + "-DCMAKE_STRIP=$(command -v $STRIP)" + + # on macOS we want to prefer Unix-style headers to Frameworks + # because we usually do not package the framework + "-DCMAKE_FIND_FRAMEWORK=LAST" + + # we never want to use the global macOS SDK + "-DCMAKE_OSX_SYSROOT=" + + # correctly detect our clang compiler + "-DCMAKE_POLICY_DEFAULT_CMP0025=NEW" + + # This installs shared libraries with a fully-specified install + # name. By default, cmake installs shared libraries with just the + # basename as the install name, which means that, on Darwin, they + # can only be found by an executable at runtime if the shared + # libraries are in a system path or in the same directory as the + # executable. This flag makes the shared library accessible from its + # nix/store directory. + "-DCMAKE_INSTALL_NAME_DIR=${!outputLib}/lib" + + # 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 + "-DCMAKE_INSTALL_BINDIR=${!outputBin}/bin" + "-DCMAKE_INSTALL_SBINDIR=${!outputBin}/sbin" + "-DCMAKE_INSTALL_INCLUDEDIR=${!outputInclude}/include" + "-DCMAKE_INSTALL_OLDINCLUDEDIR=${!outputInclude}/include" + "-DCMAKE_INSTALL_MANDIR=${!outputMan}/share/man" + "-DCMAKE_INSTALL_INFODIR=${!outputInfo}/share/info" + "-DCMAKE_INSTALL_DOCDIR=${!outputDoc}/share/doc/${shareDocName}" + "-DCMAKE_INSTALL_LIBDIR=${!outputLib}/lib" + "-DCMAKE_INSTALL_LIBEXECDIR=${!outputLib}/libexec" + "-DCMAKE_INSTALL_LOCALEDIR=${!outputLib}/share/locale" + + # Always build Release, to ensure optimisation flags + "-DCMAKE_BUILD_TYPE=${cmakeBuildType:-Release}" + + # Disable user package registry to avoid potential side effects + # and unecessary attempts to access non-existent home folder + # https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#disabling-the-package-registry + "-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON" + "-DCMAKE_FIND_USE_PACKAGE_REGISTRY=OFF" + "-DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF" + ) + + if [ -z "${dontAddPrefix-}" ]; then + cmakeDefaultFlags+=("-DCMAKE_INSTALL_PREFIX=$prefix") + fi # Don’t build tests when doCheck = false if [ -z "${doCheck-}" ]; then - prependToVar cmakeFlags "-DBUILD_TESTING=OFF" + cmakeDefaultFlags+=("-DBUILD_TESTING=OFF") fi - # Always build Release, to ensure optimisation flags - prependToVar cmakeFlags "-DCMAKE_BUILD_TYPE=${cmakeBuildType:-Release}" - - # Disable user package registry to avoid potential side effects - # and unecessary attempts to access non-existent home folder - # https://cmake.org/cmake/help/latest/manual/cmake-packages.7.html#disabling-the-package-registry - prependToVar cmakeFlags "-DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON" - prependToVar cmakeFlags "-DCMAKE_FIND_USE_PACKAGE_REGISTRY=OFF" - prependToVar cmakeFlags "-DCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY=OFF" - if [ "${buildPhase-}" = ninjaBuildPhase ]; then - prependToVar cmakeFlags "-GNinja" + cmakeDefaultFlags+=("-GNinja") fi local flagsArray=() - concatTo flagsArray cmakeFlags cmakeFlagsArray + concatTo flagsArray cmakeDefaultFlags cmakeFlags cmakeFlagsArray echoCmd 'cmake flags' "${flagsArray[@]}" From a3cfdba90aae20b0c3a433f288dbd2ce1e36e869 Mon Sep 17 00:00:00 2001 From: Yueh-Shun Li Date: Mon, 19 Aug 2024 04:43:53 +0800 Subject: [PATCH 3/3] cmake: setup-hooks.sh: add genCmakeDefaultFlags Extract the code constructing the cmakeDefaultFlags into a Bash function genCmakeDefaultFlags. --- pkgs/by-name/cm/cmake/setup-hook.sh | 50 ++++++++++++++++------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/pkgs/by-name/cm/cmake/setup-hook.sh b/pkgs/by-name/cm/cmake/setup-hook.sh index 1204d28d68fbb..c284e3629f796 100755 --- a/pkgs/by-name/cm/cmake/setup-hook.sh +++ b/pkgs/by-name/cm/cmake/setup-hook.sh @@ -14,29 +14,7 @@ fixCmakeFiles() { done } -cmakeConfigurePhase() { - runHook preConfigure - - # default to CMake defaults if unset - : ${cmakeBuildDir:=build} - - export CTEST_OUTPUT_ON_FAILURE=1 - if [ -n "${enableParallelChecking-1}" ]; then - export CTEST_PARALLEL_LEVEL=$NIX_BUILD_CORES - fi - - if [ -z "${dontFixCmake-}" ]; then - fixCmakeFiles . - fi - - if [ -z "${dontUseCmakeBuildDir-}" ]; then - mkdir -p "$cmakeBuildDir" - cd "$cmakeBuildDir" - : ${cmakeDir:=..} - else - : ${cmakeDir:=.} - fi - +genCmakeDefaultFlags() { declare -ga cmakeDefaultFlags=() # The docdir flag needs to include PROJECT_NAME as per GNU guidelines, @@ -126,6 +104,32 @@ cmakeConfigurePhase() { if [ "${buildPhase-}" = ninjaBuildPhase ]; then cmakeDefaultFlags+=("-GNinja") fi +} + +cmakeConfigurePhase() { + runHook preConfigure + + # default to CMake defaults if unset + : ${cmakeBuildDir:=build} + + export CTEST_OUTPUT_ON_FAILURE=1 + if [ -n "${enableParallelChecking-1}" ]; then + export CTEST_PARALLEL_LEVEL=$NIX_BUILD_CORES + fi + + if [ -z "${dontFixCmake-}" ]; then + fixCmakeFiles . + fi + + if [ -z "${dontUseCmakeBuildDir-}" ]; then + mkdir -p "$cmakeBuildDir" + cd "$cmakeBuildDir" + : ${cmakeDir:=..} + else + : ${cmakeDir:=.} + fi + + genCmakeDefaultFlags local flagsArray=() concatTo flagsArray cmakeDefaultFlags cmakeFlags cmakeFlagsArray