diff --git a/conan/tools/cmake/toolchain/toolchain.py b/conan/tools/cmake/toolchain/toolchain.py index 9b74a5b7671..4227efae45d 100644 --- a/conan/tools/cmake/toolchain/toolchain.py +++ b/conan/tools/cmake/toolchain/toolchain.py @@ -176,7 +176,8 @@ def generate(self): # Generators like Ninja or NMake requires an active vcvars elif self.generator is not None and "Visual" not in self.generator: VCVars(self._conanfile).generate() - toolchain = os.path.join(self._conanfile.generators_folder, toolchain_file or self.filename) + toolchain = os.path.abspath(os.path.join(self._conanfile.generators_folder, + toolchain_file or self.filename)) cache_variables = {} for name, value in self.cache_variables.items(): if isinstance(value, bool): diff --git a/conans/test/integration/toolchains/cmake/test_cmaketoolchain.py b/conans/test/integration/toolchains/cmake/test_cmaketoolchain.py index a4f7f09c6d9..657e6eff355 100644 --- a/conans/test/integration/toolchains/cmake/test_cmaketoolchain.py +++ b/conans/test/integration/toolchains/cmake/test_cmaketoolchain.py @@ -490,3 +490,28 @@ def configure(self): """) client.save({"conanfile.py": conanfile}) client.run("create . foo/1.0@ -s os=Android -s os.api_level=23 -c tools.android:ndk_path=/foo") + + +@pytest.mark.skipif(platform.system() != "Windows", reason="Only Windows") +def test_presets_paths_correct(): + client = TestClient() + conanfile = textwrap.dedent(""" + from conan import ConanFile + from conan.tools.cmake import cmake_layout + + class Conan(ConanFile): + settings = "os", "arch", "compiler", "build_type" + generators = "CMakeToolchain" + + def layout(self): + cmake_layout(self) + """) + client.save({"conanfile.py": conanfile}) + client.run("install . ") + contents = json.loads(client.load("build/generators/CMakePresets.json")) + toolchain_file = contents["configurePresets"][0]["toolchainFile"] + assert "/" not in toolchain_file + + binary_dir = contents["configurePresets"][0]["binaryDir"] + assert "/" not in binary_dir +