From 00cb5c8fc429437faae24eea9d859850a6f9c3ce Mon Sep 17 00:00:00 2001 From: Reno Dakota <170618376+paparodeo@users.noreply.github.com> Date: Sat, 27 Jul 2024 18:35:35 +0000 Subject: [PATCH 1/3] cmake: use addToSearchPath --- pkgs/by-name/cm/cmake/setup-hook.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkgs/by-name/cm/cmake/setup-hook.sh b/pkgs/by-name/cm/cmake/setup-hook.sh index 29b72ddda435..1a8c9b0f1673 100755 --- a/pkgs/by-name/cm/cmake/setup-hook.sh +++ b/pkgs/by-name/cm/cmake/setup-hook.sh @@ -151,22 +151,22 @@ makeCmakeFindLibs(){ for flag in ${NIX_CFLAGS_COMPILE-} ${NIX_LDFLAGS-}; do if test -n "$isystem_seen" && test -d "$flag"; then isystem_seen= - export CMAKE_INCLUDE_PATH="${CMAKE_INCLUDE_PATH-}${CMAKE_INCLUDE_PATH:+:}${flag}" + addToSearchPath CMAKE_INCLUDE_PATH "${flag}" elif test -n "$iframework_seen" && test -d "$flag"; then iframework_seen= - export CMAKE_FRAMEWORK_PATH="${CMAKE_FRAMEWORK_PATH-}${CMAKE_FRAMEWORK_PATH:+:}${flag}" + addToSearchPath CMAKE_FRAMEWORK_PATH "${flag}" else isystem_seen= iframework_seen= case $flag in -I*) - export CMAKE_INCLUDE_PATH="${CMAKE_INCLUDE_PATH-}${CMAKE_INCLUDE_PATH:+:}${flag:2}" + addToSearchPath CMAKE_INCLUDE_PATH "${flag:2}" ;; -L*) - export CMAKE_LIBRARY_PATH="${CMAKE_LIBRARY_PATH-}${CMAKE_LIBRARY_PATH:+:}${flag:2}" + addToSearchPath CMAKE_LIBRARY_PATH "${flag:2}" ;; -F*) - export CMAKE_FRAMEWORK_PATH="${CMAKE_FRAMEWORK_PATH-}${CMAKE_FRAMEWORK_PATH:+:}${flag:2}" + addToSearchPath CMAKE_FRAMEWORK_PATH "${flag:2}" ;; -isystem) isystem_seen=1 From f9a7cf528b2369337b1c3f47bd2ecd56d34aa3be Mon Sep 17 00:00:00 2001 From: Reno Dakota <170618376+paparodeo@users.noreply.github.com> Date: Sat, 27 Jul 2024 12:41:55 +0000 Subject: [PATCH 2/3] meson: add support for NIXPKGS_CMAKE_PREFIX_PATH nixpkgs cmake uses NIXPKGS_CMAKE_PREFIX_PATH rather than CMAKE_PREFIX_PATH env to specify module search paths. Add the env variable to meson to allow finding modules via cmake to work. --- .../me/meson/000-nixpkgs-cmake-prefix-path.patch | 12 ++++++++++++ pkgs/by-name/me/meson/package.nix | 3 +++ 2 files changed, 15 insertions(+) create mode 100644 pkgs/by-name/me/meson/000-nixpkgs-cmake-prefix-path.patch diff --git a/pkgs/by-name/me/meson/000-nixpkgs-cmake-prefix-path.patch b/pkgs/by-name/me/meson/000-nixpkgs-cmake-prefix-path.patch new file mode 100644 index 000000000000..c45106c4f9d1 --- /dev/null +++ b/pkgs/by-name/me/meson/000-nixpkgs-cmake-prefix-path.patch @@ -0,0 +1,12 @@ +diff --git a/mesonbuild/dependencies/data/CMakePathInfo.txt b/mesonbuild/dependencies/data/CMakePathInfo.txt +index 662ec58..4d5f4e4 100644 +--- a/mesonbuild/dependencies/data/CMakePathInfo.txt ++++ b/mesonbuild/dependencies/data/CMakePathInfo.txt +@@ -5,6 +5,7 @@ list(APPEND TMP_PATHS_LIST ${CMAKE_PREFIX_PATH}) + list(APPEND TMP_PATHS_LIST ${CMAKE_FRAMEWORK_PATH}) + list(APPEND TMP_PATHS_LIST ${CMAKE_APPBUNDLE_PATH}) + list(APPEND TMP_PATHS_LIST $ENV{CMAKE_PREFIX_PATH}) ++list(APPEND TMP_PATHS_LIST $ENV{NIXPKGS_CMAKE_PREFIX_PATH}) + list(APPEND TMP_PATHS_LIST $ENV{CMAKE_FRAMEWORK_PATH}) + list(APPEND TMP_PATHS_LIST $ENV{CMAKE_APPBUNDLE_PATH}) + list(APPEND TMP_PATHS_LIST ${CMAKE_SYSTEM_PREFIX_PATH}) diff --git a/pkgs/by-name/me/meson/package.nix b/pkgs/by-name/me/meson/package.nix index 6c1a9563bf43..820433b51978 100644 --- a/pkgs/by-name/me/meson/package.nix +++ b/pkgs/by-name/me/meson/package.nix @@ -31,6 +31,9 @@ python3.pkgs.buildPythonApplication rec { }; patches = [ + # Nixpkgs cmake uses NIXPKGS_CMAKE_PREFIX_PATH for the search path + ./000-nixpkgs-cmake-prefix-path.patch + # In typical distributions, RPATH is only needed for internal libraries so # meson removes everything else. With Nix, the locations of libraries # are not as predictable, therefore we need to keep them in the RPATH. From 8c9c8ade2f88a85ccdd4858cc802d7b7d6c48fe0 Mon Sep 17 00:00:00 2001 From: Reno Dakota <170618376+paparodeo@users.noreply.github.com> Date: Sat, 8 Jun 2024 07:41:56 +0000 Subject: [PATCH 3/3] cmake: fix strictDeps patch cmake to implement a NIXPKGS_CMAKE_PREFIX_PATH env variable which is similar to CMAKE_PREFIX_PATH except it is not searched for programs. This is required because cmake will search CMAKE_PREFIX_PATH for programs before PATH which is problematic as that means buildInputs gets searched before nativeBuildInputs which can break things when the binaries in PATH are covered or the order re-arranged. --- .../cmake/000-nixpkgs-cmake-prefix-path.diff | 28 +++++++++++++++++++ pkgs/by-name/cm/cmake/package.nix | 3 ++ pkgs/by-name/cm/cmake/setup-hook.sh | 4 ++- 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 pkgs/by-name/cm/cmake/000-nixpkgs-cmake-prefix-path.diff diff --git a/pkgs/by-name/cm/cmake/000-nixpkgs-cmake-prefix-path.diff b/pkgs/by-name/cm/cmake/000-nixpkgs-cmake-prefix-path.diff new file mode 100644 index 000000000000..4ebdcced055c --- /dev/null +++ b/pkgs/by-name/cm/cmake/000-nixpkgs-cmake-prefix-path.diff @@ -0,0 +1,28 @@ +diff --git a/Source/cmFindBase.cxx b/Source/cmFindBase.cxx +index 8840cdcb..c34b7ee9 100644 +--- a/Source/cmFindBase.cxx ++++ b/Source/cmFindBase.cxx +@@ -280,6 +280,11 @@ void cmFindBase::FillCMakeEnvironmentPath() + // Add CMAKE_*_PATH environment variables + std::string var = cmStrCat("CMAKE_", this->CMakePathName, "_PATH"); + paths.AddEnvPrefixPath("CMAKE_PREFIX_PATH"); ++ if (this->CMakePathName != "PROGRAM") { ++ // Like CMAKE_PREFIX_PATH except when searching for programs. Programs need ++ // to be located via PATH ++ paths.AddEnvPrefixPath("NIXPKGS_CMAKE_PREFIX_PATH"); ++ } + paths.AddEnvPath(var); + + if (this->CMakePathName == "PROGRAM") { +diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx +index 9b51b1ad..6acc676c 100644 +--- a/Source/cmFindPackageCommand.cxx ++++ b/Source/cmFindPackageCommand.cxx +@@ -2039,6 +2039,7 @@ void cmFindPackageCommand::FillPrefixesCMakeEnvironment() + + // And now the general CMake environment variables + paths.AddEnvPath("CMAKE_PREFIX_PATH"); ++ paths.AddEnvPath("NIXPKGS_CMAKE_PREFIX_PATH"); + if (this->DebugMode) { + debugBuffer = cmStrCat(debugBuffer, + "CMAKE_PREFIX_PATH env variable " diff --git a/pkgs/by-name/cm/cmake/package.nix b/pkgs/by-name/cm/cmake/package.nix index c03c1055f724..ca0f1789a110 100644 --- a/pkgs/by-name/cm/cmake/package.nix +++ b/pkgs/by-name/cm/cmake/package.nix @@ -56,6 +56,9 @@ stdenv.mkDerivation (finalAttrs: { }; patches = [ + # Add NIXPKGS_CMAKE_PREFIX_PATH to cmake which is like CMAKE_PREFIX_PATH + # except it is not searched for programs + ./000-nixpkgs-cmake-prefix-path.diff # Don't search in non-Nix locations such as /usr, but do search in our libc. ./001-search-path.diff # Don't depend on frameworks. diff --git a/pkgs/by-name/cm/cmake/setup-hook.sh b/pkgs/by-name/cm/cmake/setup-hook.sh index 1a8c9b0f1673..9ca4a6abeebc 100755 --- a/pkgs/by-name/cm/cmake/setup-hook.sh +++ b/pkgs/by-name/cm/cmake/setup-hook.sh @@ -1,5 +1,7 @@ addCMakeParams() { - addToSearchPath CMAKE_PREFIX_PATH $1 + # NIXPKGS_CMAKE_PREFIX_PATH is like CMAKE_PREFIX_PATH except cmake + # will not search it for programs + addToSearchPath NIXPKGS_CMAKE_PREFIX_PATH $1 } fixCmakeFiles() {