From 2de2d52fef89879cb798b1380e2e7b505344e947 Mon Sep 17 00:00:00 2001 From: memsharded Date: Fri, 26 Feb 2021 23:57:32 +0100 Subject: [PATCH 1/3] preparing migration of names to CMakeDeps --- conans/model/build_info.py | 8 +++++++ .../test/unittests/model/build_info_test.py | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/conans/model/build_info.py b/conans/model/build_info.py index 88fc0cd3e90..6202890c77b 100644 --- a/conans/model/build_info.py +++ b/conans/model/build_info.py @@ -210,12 +210,20 @@ def name(self, value): self._name = value def get_name(self, generator): + if generator == "CMakeDeps": + return self.names.get(generator, self.names.get("cmake_find_package_multi", self._name)) + if generator == "cmake_find_package_multi": + return self.names.get(generator, self.names.get("CMakeDeps", self._name)) return self.names.get(generator, self._name) def get_filename(self, generator): result = self.filenames.get(generator) if result: return result + if generator == "CMakeDeps": + return self.filenames.get("cmake_find_package_multi", self.get_name(generator)) + if generator == "cmake_find_package_multi": + return self.filenames.get("CMakeDeps", self.get_name(generator)) return self.get_name(generator) # Compatibility for 'cppflags' (old style property to allow decoration) diff --git a/conans/test/unittests/model/build_info_test.py b/conans/test/unittests/model/build_info_test.py index 54b72e85bd9..05628be77d2 100644 --- a/conans/test/unittests/model/build_info_test.py +++ b/conans/test/unittests/model/build_info_test.py @@ -238,6 +238,30 @@ def test_cpp_info_name(self): self.assertIn("MyName", deps_cpp_info["myname"].get_name("my_undefined_generator")) self.assertIn("MyNameForMyGenerator", deps_cpp_info["myname"].get_name("my_generator")) + @staticmethod + def test_cpp_info_name_cmakedeps(): + info = CppInfo("pkg", "folder") + info.names["CMakeDeps"] = "MyNameForMyGenerator" + deps_cpp_info = DepsCppInfo() + deps_cpp_info.add("pkg", DepCppInfo(info)) + assert "MyNameForMyGenerator" == deps_cpp_info["pkg"].get_name("cmake_find_package_multi") + assert "MyNameForMyGenerator" == deps_cpp_info["pkg"].get_name("CMakeDeps") + + info = CppInfo("pkg2", "folder") + info.names["cmake_find_package_multi"] = "MyNameForMyGenerator" + deps_cpp_info = DepsCppInfo() + deps_cpp_info.add("pkg2", DepCppInfo(info)) + assert "MyNameForMyGenerator" == deps_cpp_info["pkg2"].get_name("cmake_find_package_multi") + assert "MyNameForMyGenerator" == deps_cpp_info["pkg2"].get_name("CMakeDeps") + + info = CppInfo("pkg3", "folder") + info.names["cmake_find_package_multi"] = "MyNameForMyGenerator" + info.names["CMakeDeps"] = "MyNameForMyGenerator2" + deps_cpp_info = DepsCppInfo() + deps_cpp_info.add("pkg3", DepCppInfo(info)) + assert "MyNameForMyGenerator" == deps_cpp_info["pkg3"].get_name("cmake_find_package_multi") + assert "MyNameForMyGenerator2" == deps_cpp_info["pkg3"].get_name("CMakeDeps") + def test_cpp_info_build_modules(self): folder = temp_folder() info = CppInfo("myname", folder) From dcffbfc1b613435ed763612fbf299b92326708ce Mon Sep 17 00:00:00 2001 From: memsharded Date: Mon, 1 Mar 2021 18:08:05 +0100 Subject: [PATCH 2/3] moving the workaround to CMakeDeps --- conan/tools/cmake/cmakedeps.py | 24 ++++++++++++++----- conans/model/build_info.py | 8 ------- .../test/unittests/model/build_info_test.py | 24 ------------------- .../unittests/tools/cmake/test_cmakedeps.py | 24 +++++++++++++++++++ 4 files changed, 42 insertions(+), 38 deletions(-) create mode 100644 conans/test/unittests/tools/cmake/test_cmakedeps.py diff --git a/conan/tools/cmake/cmakedeps.py b/conan/tools/cmake/cmakedeps.py index 27608c8b97e..745d3308929 100644 --- a/conan/tools/cmake/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps.py @@ -560,12 +560,24 @@ def _check_component_in_requirements(require): for pkg_require in cpp_info.requires: _check_component_in_requirements(pkg_require) + def _get_name(self, cpp_info): + # FIXME: This is a workaround to be able to use existing recipes that declare + # FIXME: cpp_info.names["cmake_find_package_multi"] = "xxxxx" + return cpp_info.names.get(self.name, cpp_info.names.get("cmake_find_package_multi", + cpp_info._name)) + + def _get_filename(self, cpp_info): + # FIXME: This is a workaround to be able to use existing recipes that declare + # FIXME: cpp_info.filenames["cmake_find_package_multi"] = "xxxxx" + return cpp_info.filenames.get(self.name, cpp_info.filenames.get("cmake_find_package_multi", + cpp_info._name)) + def _get_require_name(self, pkg_name, req): pkg, cmp = req.split(COMPONENT_SCOPE) if COMPONENT_SCOPE in req else (pkg_name, req) pkg_cpp_info = self._conanfile.deps_cpp_info[pkg] - pkg_name = pkg_cpp_info.get_name(self.name) + pkg_name = self._get_name(pkg_cpp_info) if cmp in pkg_cpp_info.components: - cmp_name = pkg_cpp_info.components[cmp].get_name(self.name) + cmp_name = self._get_name(pkg_cpp_info.components[cmp]) else: cmp_name = pkg_name return pkg_name, cmp_name @@ -575,7 +587,7 @@ def _get_components(self, pkg_name, cpp_info): sorted_comps = cpp_info._get_sorted_components() for comp_name, comp in sorted_comps.items(): - comp_genname = cpp_info.components[comp_name].get_name(self.name) + comp_genname = self._get_name(cpp_info.components[comp_name]) comp_requires_gennames = [] for require in comp.requires: comp_requires_gennames.append(self._get_require_name(pkg_name, require)) @@ -617,8 +629,8 @@ def content(self): for pkg_name, cpp_info in self._conanfile.deps_cpp_info.dependencies: self._validate_components(cpp_info) - pkg_filename = cpp_info.get_filename(self.name) - pkg_findname = cpp_info.get_name(self.name) + pkg_filename = self._get_filename(cpp_info) + pkg_findname = self._get_name(cpp_info) pkg_version = cpp_info.version public_deps = self.get_public_deps(cpp_info) @@ -628,7 +640,7 @@ def content(self): if name not in deps_names: deps_names.append(name) deps_names = ';'.join(deps_names) - pkg_public_deps_filenames = [self._conanfile.deps_cpp_info[it[0]].get_filename(self.name) + pkg_public_deps_filenames = [self._get_filename(self._conanfile.deps_cpp_info[it[0]]) for it in public_deps] config_version = self.config_version_template.format(version=pkg_version) ret[self._config_version_filename(pkg_filename)] = config_version diff --git a/conans/model/build_info.py b/conans/model/build_info.py index 6202890c77b..88fc0cd3e90 100644 --- a/conans/model/build_info.py +++ b/conans/model/build_info.py @@ -210,20 +210,12 @@ def name(self, value): self._name = value def get_name(self, generator): - if generator == "CMakeDeps": - return self.names.get(generator, self.names.get("cmake_find_package_multi", self._name)) - if generator == "cmake_find_package_multi": - return self.names.get(generator, self.names.get("CMakeDeps", self._name)) return self.names.get(generator, self._name) def get_filename(self, generator): result = self.filenames.get(generator) if result: return result - if generator == "CMakeDeps": - return self.filenames.get("cmake_find_package_multi", self.get_name(generator)) - if generator == "cmake_find_package_multi": - return self.filenames.get("CMakeDeps", self.get_name(generator)) return self.get_name(generator) # Compatibility for 'cppflags' (old style property to allow decoration) diff --git a/conans/test/unittests/model/build_info_test.py b/conans/test/unittests/model/build_info_test.py index 05628be77d2..54b72e85bd9 100644 --- a/conans/test/unittests/model/build_info_test.py +++ b/conans/test/unittests/model/build_info_test.py @@ -238,30 +238,6 @@ def test_cpp_info_name(self): self.assertIn("MyName", deps_cpp_info["myname"].get_name("my_undefined_generator")) self.assertIn("MyNameForMyGenerator", deps_cpp_info["myname"].get_name("my_generator")) - @staticmethod - def test_cpp_info_name_cmakedeps(): - info = CppInfo("pkg", "folder") - info.names["CMakeDeps"] = "MyNameForMyGenerator" - deps_cpp_info = DepsCppInfo() - deps_cpp_info.add("pkg", DepCppInfo(info)) - assert "MyNameForMyGenerator" == deps_cpp_info["pkg"].get_name("cmake_find_package_multi") - assert "MyNameForMyGenerator" == deps_cpp_info["pkg"].get_name("CMakeDeps") - - info = CppInfo("pkg2", "folder") - info.names["cmake_find_package_multi"] = "MyNameForMyGenerator" - deps_cpp_info = DepsCppInfo() - deps_cpp_info.add("pkg2", DepCppInfo(info)) - assert "MyNameForMyGenerator" == deps_cpp_info["pkg2"].get_name("cmake_find_package_multi") - assert "MyNameForMyGenerator" == deps_cpp_info["pkg2"].get_name("CMakeDeps") - - info = CppInfo("pkg3", "folder") - info.names["cmake_find_package_multi"] = "MyNameForMyGenerator" - info.names["CMakeDeps"] = "MyNameForMyGenerator2" - deps_cpp_info = DepsCppInfo() - deps_cpp_info.add("pkg3", DepCppInfo(info)) - assert "MyNameForMyGenerator" == deps_cpp_info["pkg3"].get_name("cmake_find_package_multi") - assert "MyNameForMyGenerator2" == deps_cpp_info["pkg3"].get_name("CMakeDeps") - def test_cpp_info_build_modules(self): folder = temp_folder() info = CppInfo("myname", folder) diff --git a/conans/test/unittests/tools/cmake/test_cmakedeps.py b/conans/test/unittests/tools/cmake/test_cmakedeps.py new file mode 100644 index 00000000000..60bcfe12cf2 --- /dev/null +++ b/conans/test/unittests/tools/cmake/test_cmakedeps.py @@ -0,0 +1,24 @@ +from conan.tools.cmake import CMakeDeps +from conans import ConanFile, Settings +from conans.model.build_info import CppInfo +from conans.model.env_info import EnvValues +from conans.test.utils.mocks import TestBufferConanOutput + + +def test_cpp_info_name_cmakedeps(): + + conanfile = ConanFile(TestBufferConanOutput(), None) + conanfile.settings = "os", "compiler", "build_type", "arch" + conanfile.initialize(Settings({"os": ["Windows"], + "compiler": ["gcc"], + "build_type": ["Release"], + "arch": ["x86"]}), EnvValues()) + + cpp_info = CppInfo("mypkg", "dummy_root_folder1") + cpp_info.names["cmake_find_package_multi"] = "MySuperPkg1" + cpp_info.filenames["cmake_find_package_multi"] = "ComplexFileName1" + conanfile.deps_cpp_info.add("mypkg", cpp_info) + + cmakedeps = CMakeDeps(conanfile) + files = cmakedeps.content + assert "TARGET MySuperPkg1::MySuperPkg1" in files["ComplexFileName1Config.cmake"] From 9152834988b00e5d78b67b5569ecfd4125be40bd Mon Sep 17 00:00:00 2001 From: memsharded Date: Tue, 2 Mar 2021 11:32:32 +0100 Subject: [PATCH 3/3] review --- conan/tools/cmake/cmakedeps.py | 44 +++++++++++++------ .../unittests/tools/cmake/test_cmakedeps.py | 41 +++++++++++++++-- 2 files changed, 68 insertions(+), 17 deletions(-) diff --git a/conan/tools/cmake/cmakedeps.py b/conan/tools/cmake/cmakedeps.py index 745d3308929..304cf62644b 100644 --- a/conan/tools/cmake/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps.py @@ -5,6 +5,7 @@ from conans.errors import ConanException from conans.model.build_info import CppInfo, merge_dicts +from conans.util.conan_v2_mode import conan_v2_error from conans.util.files import save COMPONENT_SCOPE = "::" @@ -560,24 +561,40 @@ def _check_component_in_requirements(require): for pkg_require in cpp_info.requires: _check_component_in_requirements(pkg_require) - def _get_name(self, cpp_info): + def _get_name(self, cpp_info, pkg_name): # FIXME: This is a workaround to be able to use existing recipes that declare # FIXME: cpp_info.names["cmake_find_package_multi"] = "xxxxx" - return cpp_info.names.get(self.name, cpp_info.names.get("cmake_find_package_multi", - cpp_info._name)) - - def _get_filename(self, cpp_info): + name = cpp_info.names.get(self.name) + if name is not None: + return name + find_name = cpp_info.names.get("cmake_find_package_multi") + if find_name is not None: + # Not displaying a warning, too noisy as this is called many times + conan_v2_error("'{}' defines information for 'cmake_find_package_multi', " + "but not 'CMakeDeps'".format(pkg_name)) + return find_name + return cpp_info._name + + def _get_filename(self, cpp_info, pkg_name): # FIXME: This is a workaround to be able to use existing recipes that declare # FIXME: cpp_info.filenames["cmake_find_package_multi"] = "xxxxx" - return cpp_info.filenames.get(self.name, cpp_info.filenames.get("cmake_find_package_multi", - cpp_info._name)) + name = cpp_info.filenames.get(self.name) + if name is not None: + return name + find_name = cpp_info.filenames.get("cmake_find_package_multi") + if find_name is not None: + # Not displaying a warning, too noisy as this is called many times + conan_v2_error("'{}' defines information for 'cmake_find_package_multi', " + "but not 'CMakeDeps'".format(pkg_name)) + return find_name + return cpp_info._name def _get_require_name(self, pkg_name, req): pkg, cmp = req.split(COMPONENT_SCOPE) if COMPONENT_SCOPE in req else (pkg_name, req) pkg_cpp_info = self._conanfile.deps_cpp_info[pkg] - pkg_name = self._get_name(pkg_cpp_info) + pkg_name = self._get_name(pkg_cpp_info, pkg_name) if cmp in pkg_cpp_info.components: - cmp_name = self._get_name(pkg_cpp_info.components[cmp]) + cmp_name = self._get_name(pkg_cpp_info.components[cmp], pkg_name) else: cmp_name = pkg_name return pkg_name, cmp_name @@ -587,7 +604,7 @@ def _get_components(self, pkg_name, cpp_info): sorted_comps = cpp_info._get_sorted_components() for comp_name, comp in sorted_comps.items(): - comp_genname = self._get_name(cpp_info.components[comp_name]) + comp_genname = self._get_name(cpp_info.components[comp_name], pkg_name) comp_requires_gennames = [] for require in comp.requires: comp_requires_gennames.append(self._get_require_name(pkg_name, require)) @@ -629,8 +646,8 @@ def content(self): for pkg_name, cpp_info in self._conanfile.deps_cpp_info.dependencies: self._validate_components(cpp_info) - pkg_filename = self._get_filename(cpp_info) - pkg_findname = self._get_name(cpp_info) + pkg_filename = self._get_filename(cpp_info, pkg_name) + pkg_findname = self._get_name(cpp_info, pkg_name) pkg_version = cpp_info.version public_deps = self.get_public_deps(cpp_info) @@ -640,7 +657,8 @@ def content(self): if name not in deps_names: deps_names.append(name) deps_names = ';'.join(deps_names) - pkg_public_deps_filenames = [self._get_filename(self._conanfile.deps_cpp_info[it[0]]) + pkg_public_deps_filenames = [self._get_filename(self._conanfile.deps_cpp_info[it[0]], + pkg_name) for it in public_deps] config_version = self.config_version_template.format(version=pkg_version) ret[self._config_version_filename(pkg_filename)] = config_version diff --git a/conans/test/unittests/tools/cmake/test_cmakedeps.py b/conans/test/unittests/tools/cmake/test_cmakedeps.py index 60bcfe12cf2..99b96cc1ef9 100644 --- a/conans/test/unittests/tools/cmake/test_cmakedeps.py +++ b/conans/test/unittests/tools/cmake/test_cmakedeps.py @@ -1,13 +1,17 @@ +import pytest +from mock import Mock + from conan.tools.cmake import CMakeDeps from conans import ConanFile, Settings -from conans.model.build_info import CppInfo +from conans.client.tools import environment_append +from conans.errors import ConanException +from conans.model.build_info import CppInfo, DepCppInfo from conans.model.env_info import EnvValues -from conans.test.utils.mocks import TestBufferConanOutput +from conans.util.conan_v2_mode import CONAN_V2_MODE_ENVVAR def test_cpp_info_name_cmakedeps(): - - conanfile = ConanFile(TestBufferConanOutput(), None) + conanfile = ConanFile(Mock(), None) conanfile.settings = "os", "compiler", "build_type", "arch" conanfile.initialize(Settings({"os": ["Windows"], "compiler": ["gcc"], @@ -22,3 +26,32 @@ def test_cpp_info_name_cmakedeps(): cmakedeps = CMakeDeps(conanfile) files = cmakedeps.content assert "TARGET MySuperPkg1::MySuperPkg1" in files["ComplexFileName1Config.cmake"] + + with pytest.raises(ConanException, + match="'mypkg' defines information for 'cmake_find_package_multi'"): + with environment_append({CONAN_V2_MODE_ENVVAR: "1"}): + _ = cmakedeps.content + + +def test_cpp_info_name_cmakedeps_components(): + conanfile = ConanFile(Mock(), None) + conanfile.settings = "os", "compiler", "build_type", "arch" + conanfile.initialize(Settings({"os": ["Windows"], + "compiler": ["gcc"], + "build_type": ["Release"], + "arch": ["x86"]}), EnvValues()) + + cpp_info = CppInfo("mypkg", "dummy_root_folder1") + cpp_info.names["cmake_find_package_multi"] = "GlobakPkgName1" + cpp_info.components["mycomp"].names["cmake_find_package_multi"] = "MySuperPkg1" + cpp_info.filenames["cmake_find_package_multi"] = "ComplexFileName1" + conanfile.deps_cpp_info.add("mypkg", DepCppInfo(cpp_info)) + + cmakedeps = CMakeDeps(conanfile) + files = cmakedeps.content + assert "TARGET GlobakPkgName1::MySuperPkg1" in files["ComplexFileName1Config.cmake"] + + with pytest.raises(ConanException, + match="'mypkg' defines information for 'cmake_find_package_multi'"): + with environment_append({CONAN_V2_MODE_ENVVAR: "1"}): + _ = cmakedeps.content