From 8ef6eace2c70a5ba454ae65acea51e431c20291c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9?= <12487815+NokiDev@users.noreply.github.com> Date: Tue, 11 Mar 2025 22:29:43 +0100 Subject: [PATCH 1/6] Use correct property type instead of package_type --- conan/tools/cmake/cmakedeps2/target_configuration.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conan/tools/cmake/cmakedeps2/target_configuration.py b/conan/tools/cmake/cmakedeps2/target_configuration.py index e85df76fd3e..4613cd6fcf1 100644 --- a/conan/tools/cmake/cmakedeps2/target_configuration.py +++ b/conan/tools/cmake/cmakedeps2/target_configuration.py @@ -65,7 +65,7 @@ def _requires(self, info, components): required_comp) dep_target = dep_target or f"{pkg_name}::{required_comp}" link = not (pkg_type is PackageType.SHARED and - dep_comp.package_type is PackageType.SHARED) + dep_comp.type is PackageType.SHARED) result[dep_target] = link else: # Different package try: @@ -87,7 +87,7 @@ def _requires(self, info, components): dep_target = self._cmakedeps.get_property("cmake_target_name", dep, comp) dep_target = dep_target or default_target link = not (pkg_type is PackageType.SHARED and - dep_comp.package_type is PackageType.SHARED) + dep_comp.type is PackageType.SHARED) result[dep_target] = link return result From 7777a0ef9ad78e31c2d56b1119a5d4f32c84e885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9?= Date: Wed, 12 Mar 2025 11:50:56 +0100 Subject: [PATCH 2/6] Ensure to not use dep_comp while None --- conan/tools/cmake/cmakedeps2/target_configuration.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/conan/tools/cmake/cmakedeps2/target_configuration.py b/conan/tools/cmake/cmakedeps2/target_configuration.py index 4613cd6fcf1..4f31e0a1a5a 100644 --- a/conan/tools/cmake/cmakedeps2/target_configuration.py +++ b/conan/tools/cmake/cmakedeps2/target_configuration.py @@ -81,13 +81,16 @@ def _requires(self, info, components): assert required_pkg == required_comp comp = None default_target = f"{dep.ref.name}::{dep.ref.name}" # replace_requires + link = pkg_type is not PackageType.SHARED else: comp = required_comp default_target = f"{required_pkg}::{required_comp}" + link = not (pkg_type is PackageType.SHARED and + dep_comp.type is PackageType.SHARED) + dep_target = self._cmakedeps.get_property("cmake_target_name", dep, comp) dep_target = dep_target or default_target - link = not (pkg_type is PackageType.SHARED and - dep_comp.type is PackageType.SHARED) + result[dep_target] = link return result From 0a1c1eac3ff1bf57410c6c4e19d175683392f1ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9?= Date: Wed, 12 Mar 2025 14:31:11 +0100 Subject: [PATCH 3/6] add test for #17942 --- .../cmake/cmakedeps2/test_cmakedeps.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py b/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py index e54bb2a613e..7e4d18add26 100644 --- a/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py +++ b/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py @@ -198,3 +198,30 @@ def package_info(self): c.run("create . --name=pkg --version=0.1 -c tools.cmake.cmakedeps:new=will_break_next") assert "CMakeConfigDeps: cmake_set_interface_link_directories deprecated and invalid. " \ "The package 'package_info()' must correctly define the (CPS) information" in c.out + +def test_consuming_cpp_info_with_components_dependency_from_same_package(): + c = TestClient() + conanfile = textwrap.dedent(""" + from conan import ConanFile + class Pkg(ConanFile): + def package_info(self): + self.cpp_info.components["lib"].type = 'shared-library' + self.cpp_info.components["lib_extended"].type = 'shared-library' + self.cpp_info.components["lib_extended"].requires = ['lib'] + """) + test_package = textwrap.dedent(""" + from conan import ConanFile + class TestPkg(ConanFile): + settings = "os", "compiler", "arch", "build_type" + generators = "VirtualRunEnv", "CMakeDeps" + + def requirements(self): + self.requires(self.tested_reference_str) + + def test(self): + pass + """) + c.save({"conanfile.py": conanfile, + "test_package/conanfile.py":test_package}) + + c.run("create . --name=pkg --version=0.1 -c tools.cmake.cmakedeps:new=will_break_next") From dd5932989c1e96dc172bd24c331461166a999ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9?= Date: Wed, 12 Mar 2025 15:55:32 +0100 Subject: [PATCH 4/6] rebase from memsharded:fix/cmakeconfigdeps_comp_type --- .../cmake/cmakedeps2/test_cmakedeps.py | 46 +++++++++++++------ 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py b/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py index 7e4d18add26..82b708afefd 100644 --- a/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py +++ b/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py @@ -209,19 +209,39 @@ def package_info(self): self.cpp_info.components["lib_extended"].type = 'shared-library' self.cpp_info.components["lib_extended"].requires = ['lib'] """) - test_package = textwrap.dedent(""" - from conan import ConanFile - class TestPkg(ConanFile): - settings = "os", "compiler", "arch", "build_type" - generators = "VirtualRunEnv", "CMakeDeps" + c.save({"conanfile.py": conanfile, + "test_package/conanfile.py": GenConanfile().with_settings("build_type") + .with_test("pass") + .with_generator("CMakeDeps")}) + c.run("create . --name=pkg --version=0.1 -c tools.cmake.cmakedeps:new=will_break_next") + # it doesn't break + assert "find_package(pkg)" in c.out - def requirements(self): - self.requires(self.tested_reference_str) - def test(self): - pass +def test_consuming_cpp_info_with_components_dependency_from_other_package(): + c = TestClient() + dep = textwrap.dedent(""" + from conan import ConanFile + class Pkg(ConanFile): + name = "dep" + version = "0.1" + def package_info(self): + self.cpp_info.components["lib"].type = 'shared-library' + """) + conanfile = textwrap.dedent(""" + from conan import ConanFile + class Pkg(ConanFile): + requires = "dep/0.1" + def package_info(self): + self.cpp_info.components["lib"].type = 'shared-library' + self.cpp_info.components["lib"].requires = ['dep::lib'] """) - c.save({"conanfile.py": conanfile, - "test_package/conanfile.py":test_package}) - - c.run("create . --name=pkg --version=0.1 -c tools.cmake.cmakedeps:new=will_break_next") + c.save({"dep/conanfile.py": dep, + "pkg/conanfile.py": conanfile, + "pkg/test_package/conanfile.py": GenConanfile().with_settings("build_type") + .with_test("pass") + .with_generator("CMakeDeps")}) + c.run("create dep") + c.run("create pkg --name=pkg --version=0.1 -c tools.cmake.cmakedeps:new=will_break_next") + # it doesn't break + assert "find_package(pkg)" in c.out \ No newline at end of file From 0b49086f77456793643b1024c378cbb1c808fcea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9?= Date: Wed, 12 Mar 2025 15:56:07 +0100 Subject: [PATCH 5/6] Add test showing access on dep_comp.type while None. --- .../cmake/cmakedeps2/test_cmakedeps.py | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py b/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py index 82b708afefd..bec4ba99505 100644 --- a/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py +++ b/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py @@ -244,4 +244,42 @@ def package_info(self): c.run("create dep") c.run("create pkg --name=pkg --version=0.1 -c tools.cmake.cmakedeps:new=will_break_next") # it doesn't break - assert "find_package(pkg)" in c.out \ No newline at end of file + assert "find_package(pkg)" in c.out + + + def test_consuming_cpp_info_transitively_by_requiring_root_component_in_another_component_from_another_package(): + c = TestClient() + dependent_conanfile = textwrap.dedent(""" + from conan import ConanFile + class Dependent(ConanFile): + settings = "os", "compiler", "arch", "build_type" + name = 'dependent' + """) + + conanfile = textwrap.dedent(""" + from conan import ConanFile + class Pkg(ConanFile): + settings = "os", "compiler", "arch", "build_type" + def requirements(self): + self.requires('dependent/0.1') + def package_info(self): + self.cpp_info.type = 'shared-library' + self.cpp_info.requires = ['dependent::dependent'] + """) + test_package = textwrap.dedent(""" + from conan import ConanFile + class TestPkg(ConanFile): + settings = "os", "compiler", "arch", "build_type" + generators = "VirtualRunEnv", "CMakeDeps" + + def requirements(self): + self.requires(self.tested_reference_str) + + def test(self): + pass + """) + c.save({"dependent/conanfile.py": dependent_conanfile, + "main/conanfile.py": conanfile, + "main/test_package/conanfile.py":test_package}) + c.run("create ./dependent/ --name=dependent --version=0.1 -c tools.cmake.cmakedeps:new=will_break_next") + c.run("create ./main/ --name=pkg --version=0.1 -c tools.cmake.cmakedeps:new=will_break_next") From 50495a9310ef99b9aecde7816b73940ca279e702 Mon Sep 17 00:00:00 2001 From: James Date: Wed, 12 Mar 2025 16:27:51 +0100 Subject: [PATCH 6/6] Update test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py --- test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py b/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py index bec4ba99505..42d05c9ba0b 100644 --- a/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py +++ b/test/integration/toolchains/cmake/cmakedeps2/test_cmakedeps.py @@ -247,7 +247,7 @@ def package_info(self): assert "find_package(pkg)" in c.out - def test_consuming_cpp_info_transitively_by_requiring_root_component_in_another_component_from_another_package(): +def test_consuming_cpp_info_transitively_by_requiring_root_component_in_another_component_from_another_package(): c = TestClient() dependent_conanfile = textwrap.dedent(""" from conan import ConanFile