From 6624f4a3f5695cc8cfc29d690ff852517729c096 Mon Sep 17 00:00:00 2001 From: czoido Date: Fri, 25 Nov 2022 14:03:01 +0100 Subject: [PATCH 01/13] draft --- conan/tools/cmake/cmakedeps/cmakedeps.py | 36 +++++++++- .../cmake/cmakedeps/templates/__init__.py | 12 ++-- .../cmake/cmakedeps/templates/target_data.py | 10 +-- conan/tools/cmake/utils.py | 24 ------- conans/client/generators/markdown.py | 6 +- .../cmake/cmakedeps/test_cmakedeps.py | 67 +++++++++++++++++++ 6 files changed, 115 insertions(+), 40 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index 0306575cbb9..bbb680193e4 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -1,4 +1,5 @@ import os +from collections import defaultdict from conan.tools._check_build_profile import check_using_build_profile from conan.tools.cmake.cmakedeps import FIND_MODE_CONFIG, FIND_MODE_NONE, FIND_MODE_BOTH, \ @@ -32,6 +33,7 @@ def __init__(self, conanfile): # Enable/Disable checking if a component target exists or not self.check_components_exist = False + self._properties = defaultdict(dict) def generate(self): # FIXME: Remove this in 2.0 @@ -76,7 +78,7 @@ def content(self): if dep.is_build_context and dep.ref.name not in self.build_context_activated: continue - cmake_find_mode = dep.cpp_info.get_property("cmake_find_mode") + cmake_find_mode = self.get_property("cmake_find_mode", dep) cmake_find_mode = cmake_find_mode or FIND_MODE_CONFIG cmake_find_mode = cmake_find_mode.lower() # Skip from the requirement @@ -112,3 +114,35 @@ def _generate_files(self, require, dep, ret, find_module_mode): # file is common for the different configurations. if not os.path.exists(config.filename): ret[config.filename] = config.render() + + def set_property(self, prop, dependency, value): + self._properties[dependency].update({prop: value}) + + def get_property(self, prop, dependency, component=None): + dep_property = dependency.cpp_info.get_property(prop) if not component else \ + dependency.cpp_info.components[component].get_property(prop) + dep_and_comp = dependency.ref.name if not component else f"{dependency.ref.name}::{component}" + return self._properties[dep_and_comp].get(prop) or dep_property + + def get_cmake_package_name(self, req, module_mode=None): + """Get the name of the file for the find_package(XXX)""" + # This is used by CMakeDeps to determine: + # - The filename to generate (XXX-config.cmake or FindXXX.cmake) + # - The name of the defined XXX_DIR variables + # - The name of transitive dependencies for calls to find_dependency + if module_mode and self.get_find_mode(req) in [FIND_MODE_MODULE, FIND_MODE_BOTH]: + ret = self.get_property("cmake_module_file_name", req) + if ret: + return ret + ret = self.get_property("cmake_file_name", req) + return ret or req.ref.name + + def get_find_mode(self, req): + """ + :param req: requirement + :return: "none" or "config" or "module" or "both" or "config" when not set + """ + tmp = self.get_property("cmake_find_mode", req) + if tmp is None: + return "config" + return tmp.lower() diff --git a/conan/tools/cmake/cmakedeps/templates/__init__.py b/conan/tools/cmake/cmakedeps/templates/__init__.py index 05415e983c1..e6dc25e0f7f 100644 --- a/conan/tools/cmake/cmakedeps/templates/__init__.py +++ b/conan/tools/cmake/cmakedeps/templates/__init__.py @@ -1,7 +1,6 @@ import jinja2 from jinja2 import Template -from conan.tools.cmake.utils import get_cmake_package_name from conans.errors import ConanException @@ -23,7 +22,7 @@ def root_target_name(self): @property def file_name(self): - return get_cmake_package_name(self.conanfile, module_mode=self.generating_module) + self.suffix + return self.cmakedeps.get_cmake_package_name(self.conanfile, module_mode=self.generating_module) + self.suffix @property def suffix(self): @@ -85,10 +84,10 @@ def _get_target_default_name(req, component_name="", suffix=""): def get_root_target_name(self, req, suffix=""): if self.generating_module: - ret = req.cpp_info.get_property("cmake_module_target_name") + ret = self.cmakedeps.get_property("cmake_module_target_name", req) if ret: return ret - ret = req.cpp_info.get_property("cmake_target_name") + ret = self.cmakedeps.get_property("cmake_target_name", req) return ret or self._get_target_default_name(req, suffix=suffix) def get_component_alias(self, req, comp_name): @@ -99,10 +98,11 @@ def get_component_alias(self, req, comp_name): raise ConanException("Component '{name}::{cname}' not found in '{name}' " "package requirement".format(name=req.ref.name, cname=comp_name)) if self.generating_module: - ret = req.cpp_info.components[comp_name].get_property("cmake_module_target_name") + ret = self.cmakedeps.get_property("cmake_module_target_name", req, comp_name) if ret: return ret - ret = req.cpp_info.components[comp_name].get_property("cmake_target_name") + ret = self.cmakedeps.get_property("cmake_target_name", req, comp_name) + # If we don't specify the `cmake_target_name` property for the component it will # fallback to the pkg_name::comp_name, it wont use the root cpp_info cmake_target_name # property because that is also an absolute name (Greetings::Greetings), it is not a namespace diff --git a/conan/tools/cmake/cmakedeps/templates/target_data.py b/conan/tools/cmake/cmakedeps/templates/target_data.py index cb4b733b0ec..d29ae5a0383 100644 --- a/conan/tools/cmake/cmakedeps/templates/target_data.py +++ b/conan/tools/cmake/cmakedeps/templates/target_data.py @@ -4,7 +4,7 @@ from conan.tools.cmake.cmakedeps import FIND_MODE_NONE, FIND_MODE_CONFIG, FIND_MODE_MODULE, \ FIND_MODE_BOTH from conan.tools.cmake.cmakedeps.templates import CMakeDepsFileTemplate -from conan.tools.cmake.utils import get_cmake_package_name, get_find_mode + """ foo-release-x86_64-data.cmake @@ -177,9 +177,9 @@ def _get_dependency_filenames(self): for dep_name, _ in self.conanfile.cpp_info.required_components: if dep_name and dep_name not in ret: # External dep req = direct_host[dep_name] - ret.append(get_cmake_package_name(req)) + ret.append(self.cmakedeps.get_cmake_package_name(req)) elif direct_host: - ret = [get_cmake_package_name(r, self.generating_module) for r in direct_host.values()] + ret = [self.cmakedeps.get_cmake_package_name(r, self.generating_module) for r in direct_host.values()] return ret @@ -189,8 +189,8 @@ def _get_dependencies_find_modes(self): return ret deps = self.conanfile.dependencies.filter({"build": False, "visible": True, "direct": True}) for dep in deps.values(): - dep_file_name = get_cmake_package_name(dep, self.generating_module) - find_mode = get_find_mode(dep) + dep_file_name = self.cmakedeps.get_cmake_package_name(dep, self.generating_module) + find_mode = self.cmakedeps.get_find_mode(dep) default_value = "NO_MODULE" if not self.generating_module else "MODULE" values = { FIND_MODE_NONE: "", diff --git a/conan/tools/cmake/utils.py b/conan/tools/cmake/utils.py index cceea99bfe9..0a99e28b900 100644 --- a/conan/tools/cmake/utils.py +++ b/conan/tools/cmake/utils.py @@ -6,27 +6,3 @@ def is_multi_configuration(generator): return False return "Visual" in generator or "Xcode" in generator or "Multi-Config" in generator - -def get_cmake_package_name(conanfile, module_mode=None): - """Get the name of the file for the find_package(XXX)""" - # This is used by CMakeToolchain/CMakeDeps to determine: - # - The filename to generate (XXX-config.cmake or FindXXX.cmake) - # - The name of the defined XXX_DIR variables - # - The name of transitive dependencies for calls to find_dependency - if module_mode and get_find_mode(conanfile) in [FIND_MODE_MODULE, FIND_MODE_BOTH]: - ret = conanfile.cpp_info.get_property("cmake_module_file_name") - if ret: - return ret - ret = conanfile.cpp_info.get_property("cmake_file_name") - return ret or conanfile.ref.name - - -def get_find_mode(conanfile): - """ - :param conanfile: conanfile of the requirement - :return: "none" or "config" or "module" or "both" or "config" when not set - """ - tmp = conanfile.cpp_info.get_property("cmake_find_mode") - if tmp is None: - return "config" - return tmp.lower() diff --git a/conans/client/generators/markdown.py b/conans/client/generators/markdown.py index 1776b11d0d1..76e17f2c9d5 100644 --- a/conans/client/generators/markdown.py +++ b/conans/client/generators/markdown.py @@ -6,9 +6,7 @@ from jinja2 import Environment from conan.tools.cmake.cmakedeps.cmakedeps import CMakeDeps -from conan.tools.cmake.cmakedeps.templates import ( - CMakeDepsFileTemplate, - get_cmake_package_name as cmake_get_file_name) +from conan.tools.cmake.cmakedeps.templates import CMakeDepsFileTemplate from conan.tools.gnu.pkgconfigdeps import ( _get_component_name as pkgconfig_get_component_name, _get_name_with_namespace as pkgconfig_get_name_with_namespace, @@ -444,7 +442,7 @@ def read_pkg_file(filename): cmake_variables = { 'global_target_name': requirement.cpp_info.get_property('cmake_target_name') or "{0}::{0}".format(requirement.ref.name), 'component_alias': cmake_component_alias, - 'file_name': cmake_get_file_name(requirement) + 'file_name': cmake_deps.cmake_get_file_name(requirement) } pkgconfig_component_alias = { diff --git a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py index 5e147de5182..a4e6b9afa89 100644 --- a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py +++ b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py @@ -187,3 +187,70 @@ def package_info(self): assert r"spaces=me you" in deps assert r"foobar=bazbuz" in deps assert r"answer=42" in deps + + +def test_cmakedeps_set_dependency_props_from_consumer(): + client = TestClient(path_with_spaces=False) + bar = textwrap.dedent(r''' + from conan import ConanFile + class FooConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + def package_info(self): + self.cpp_info.set_property("cmake_find_mode", "both") + self.cpp_info.components["component1"].requires = [] + ''') + + foo = textwrap.dedent(r''' + from conan import ConanFile + from conan.tools.cmake import CMakeDeps, cmake_layout + class FooConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + requires = "bar/1.0" + def layout(self): + cmake_layout(self) + def generate(self): + deps = CMakeDeps(self) + deps.set_property("cmake_find_mode", "bar", "{find_mode}") + deps.set_property("cmake_file_name", "bar", "custom_bar_file_name") + deps.set_property("cmake_module_file_name", "bar", "custom_bar_module_file_name") + deps.set_property("cmake_target_name", "bar", "custom_bar_target_name") + deps.set_property("cmake_module_target_name", "bar", "custom_bar_module_target_name") + deps.set_property("cmake_target_name", "bar::component1", "custom_bar_component_target_name") + deps.generate() + ''') + + client.save({"foo.py": foo.format(find_mode=""), "bar.py": bar}, clean_first=True) + + module_file = os.path.join(client.current_folder, "build", "generators", "module-custom_bar_module_file_nameTargets.cmake") + components_module = os.path.join(client.current_folder, "build", "generators", "custom_bar_file_name-Target-release.cmake") + config_file = os.path.join(client.current_folder, "build", "generators", "custom_bar_file_nameTargets.cmake") + + # uses cmake_find_mode set in bar: both + client.run("create bar.py bar/1.0@") + client.run("install foo.py foo/1.0@") + assert os.path.exists(module_file) + assert os.path.exists(config_file) + module_content = client.load(module_file) + assert "add_library(custom_bar_module_target_name INTERFACE IMPORTED)" in module_content + config_content = client.load(config_file) + assert "add_library(custom_bar_target_name INTERFACE IMPORTED)" in config_content + components_module_content = client.load(components_module) + assert "add_library(bar_custom_bar_component_target_name_DEPS_TARGET INTERFACE IMPORTED)" in components_module_content + + client.save({"foo.py": foo.format(find_mode="none"), "bar.py": bar}, clean_first=True) + client.run("create bar.py bar/1.0@") + client.run("install foo.py foo/1.0@") + assert not os.path.exists(module_file) + assert not os.path.exists(config_file) + + client.save({"foo.py": foo.format(find_mode="module"), "bar.py": bar}, clean_first=True) + client.run("create bar.py bar/1.0@") + client.run("install foo.py foo/1.0@") + assert os.path.exists(module_file) + assert not os.path.exists(config_file) + + client.save({"foo.py": foo.format(find_mode="config"), "bar.py": bar}, clean_first=True) + client.run("create bar.py bar/1.0@") + client.run("install foo.py foo/1.0@") + assert not os.path.exists(module_file) + assert os.path.exists(config_file) From 9c60e8fca0ae4334fd900f32e0d6de73f855253f Mon Sep 17 00:00:00 2001 From: czoido Date: Fri, 25 Nov 2022 14:13:48 +0100 Subject: [PATCH 02/13] change arg order --- conan/tools/cmake/cmakedeps/cmakedeps.py | 2 +- .../toolchains/cmake/cmakedeps/test_cmakedeps.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index bbb680193e4..2ec581e688c 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -115,7 +115,7 @@ def _generate_files(self, require, dep, ret, find_module_mode): if not os.path.exists(config.filename): ret[config.filename] = config.render() - def set_property(self, prop, dependency, value): + def set_property(self, dependency, prop, value): self._properties[dependency].update({prop: value}) def get_property(self, prop, dependency, component=None): diff --git a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py index a4e6b9afa89..a8cae98f957 100644 --- a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py +++ b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py @@ -210,12 +210,12 @@ def layout(self): cmake_layout(self) def generate(self): deps = CMakeDeps(self) - deps.set_property("cmake_find_mode", "bar", "{find_mode}") - deps.set_property("cmake_file_name", "bar", "custom_bar_file_name") - deps.set_property("cmake_module_file_name", "bar", "custom_bar_module_file_name") - deps.set_property("cmake_target_name", "bar", "custom_bar_target_name") - deps.set_property("cmake_module_target_name", "bar", "custom_bar_module_target_name") - deps.set_property("cmake_target_name", "bar::component1", "custom_bar_component_target_name") + deps.set_property("bar", "cmake_find_mode", "{find_mode}") + deps.set_property("bar", "cmake_file_name", "custom_bar_file_name") + deps.set_property("bar", "cmake_module_file_name", "custom_bar_module_file_name") + deps.set_property("bar", "cmake_target_name", "custom_bar_target_name") + deps.set_property("bar", "cmake_module_target_name", "custom_bar_module_target_name") + deps.set_property("bar::component1", "cmake_target_name", "custom_bar_component_target_name") deps.generate() ''') From e53a0d4d171d8919d1eda6c8deb2c790863efdf2 Mon Sep 17 00:00:00 2001 From: czoido Date: Fri, 25 Nov 2022 14:28:46 +0100 Subject: [PATCH 03/13] fix name --- conans/client/generators/markdown.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conans/client/generators/markdown.py b/conans/client/generators/markdown.py index 76e17f2c9d5..f855662bebb 100644 --- a/conans/client/generators/markdown.py +++ b/conans/client/generators/markdown.py @@ -442,7 +442,7 @@ def read_pkg_file(filename): cmake_variables = { 'global_target_name': requirement.cpp_info.get_property('cmake_target_name') or "{0}::{0}".format(requirement.ref.name), 'component_alias': cmake_component_alias, - 'file_name': cmake_deps.cmake_get_file_name(requirement) + 'file_name': cmake_deps.get_cmake_package_name(requirement) } pkgconfig_component_alias = { From 223d954c0c7accd5a2566bd99b036ddef1efc2e2 Mon Sep 17 00:00:00 2001 From: czoido Date: Fri, 25 Nov 2022 14:30:57 +0100 Subject: [PATCH 04/13] minor changes --- conan/tools/cmake/cmakedeps/cmakedeps.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index 2ec581e688c..67b7bb6570b 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -118,31 +118,31 @@ def _generate_files(self, require, dep, ret, find_module_mode): def set_property(self, dependency, prop, value): self._properties[dependency].update({prop: value}) - def get_property(self, prop, dependency, component=None): - dep_property = dependency.cpp_info.get_property(prop) if not component else \ - dependency.cpp_info.components[component].get_property(prop) - dep_and_comp = dependency.ref.name if not component else f"{dependency.ref.name}::{component}" + def get_property(self, prop, dep, component=None): + dep_property = dep.cpp_info.get_property(prop) if not component else \ + dep.cpp_info.components[component].get_property(prop) + dep_and_comp = dep.ref.name if not component else f"{dep.ref.name}::{component}" return self._properties[dep_and_comp].get(prop) or dep_property - def get_cmake_package_name(self, req, module_mode=None): + def get_cmake_package_name(self, dep, module_mode=None): """Get the name of the file for the find_package(XXX)""" # This is used by CMakeDeps to determine: # - The filename to generate (XXX-config.cmake or FindXXX.cmake) # - The name of the defined XXX_DIR variables # - The name of transitive dependencies for calls to find_dependency - if module_mode and self.get_find_mode(req) in [FIND_MODE_MODULE, FIND_MODE_BOTH]: - ret = self.get_property("cmake_module_file_name", req) + if module_mode and self.get_find_mode(dep) in [FIND_MODE_MODULE, FIND_MODE_BOTH]: + ret = self.get_property("cmake_module_file_name", dep) if ret: return ret - ret = self.get_property("cmake_file_name", req) - return ret or req.ref.name + ret = self.get_property("cmake_file_name", dep) + return ret or dep.ref.name - def get_find_mode(self, req): + def get_find_mode(self, dep): """ - :param req: requirement + :param dep: requirement :return: "none" or "config" or "module" or "both" or "config" when not set """ - tmp = self.get_property("cmake_find_mode", req) + tmp = self.get_property("cmake_find_mode", dep) if tmp is None: return "config" return tmp.lower() From 7be64c5548fc7826d9820687021defc487f9ffa4 Mon Sep 17 00:00:00 2001 From: czoido Date: Fri, 25 Nov 2022 14:32:35 +0100 Subject: [PATCH 05/13] minor changes --- conan/tools/cmake/cmakedeps/cmakedeps.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index 67b7bb6570b..2a1e3cd1294 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -115,8 +115,8 @@ def _generate_files(self, require, dep, ret, find_module_mode): if not os.path.exists(config.filename): ret[config.filename] = config.render() - def set_property(self, dependency, prop, value): - self._properties[dependency].update({prop: value}) + def set_property(self, dep, prop, value): + self._properties[dep].update({prop: value}) def get_property(self, prop, dep, component=None): dep_property = dep.cpp_info.get_property(prop) if not component else \ From 9b7da3a91edd54c498c26f7e66b6c7ffc5d0a6e5 Mon Sep 17 00:00:00 2001 From: czoido Date: Mon, 28 Nov 2022 08:19:49 +0100 Subject: [PATCH 06/13] change dict syntax --- conan/tools/cmake/cmakedeps/cmakedeps.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index 2a1e3cd1294..4ee2e07b06d 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -33,7 +33,7 @@ def __init__(self, conanfile): # Enable/Disable checking if a component target exists or not self.check_components_exist = False - self._properties = defaultdict(dict) + self._properties = {} def generate(self): # FIXME: Remove this in 2.0 @@ -116,7 +116,7 @@ def _generate_files(self, require, dep, ret, find_module_mode): ret[config.filename] = config.render() def set_property(self, dep, prop, value): - self._properties[dep].update({prop: value}) + self._properties.setdefault(dep, {}).update({prop: value}) def get_property(self, prop, dep, component=None): dep_property = dep.cpp_info.get_property(prop) if not component else \ From 338ca72efd31b7e193bb37f35773b377b2477b4b Mon Sep 17 00:00:00 2001 From: czoido Date: Mon, 28 Nov 2022 08:53:57 +0100 Subject: [PATCH 07/13] fix get --- conan/tools/cmake/cmakedeps/cmakedeps.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index 4ee2e07b06d..487f1519128 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -122,7 +122,10 @@ def get_property(self, prop, dep, component=None): dep_property = dep.cpp_info.get_property(prop) if not component else \ dep.cpp_info.components[component].get_property(prop) dep_and_comp = dep.ref.name if not component else f"{dep.ref.name}::{component}" - return self._properties[dep_and_comp].get(prop) or dep_property + try: + return self._properties[dep_and_comp].get(prop) or dep_property + except KeyError: + return dep_property def get_cmake_package_name(self, dep, module_mode=None): """Get the name of the file for the find_package(XXX)""" From f5717ec10035a04ecf90a059b2f0a05600b2ae45 Mon Sep 17 00:00:00 2001 From: czoido Date: Mon, 28 Nov 2022 12:43:00 +0100 Subject: [PATCH 08/13] wip --- conan/tools/cmake/cmakedeps/cmakedeps.py | 18 ++- .../cmake/cmakedeps/templates/__init__.py | 8 +- .../cmake/cmakedeps/test_cmakedeps.py | 116 ++++++++++++++++-- 3 files changed, 120 insertions(+), 22 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index 487f1519128..72a2dad5fce 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -1,5 +1,4 @@ import os -from collections import defaultdict from conan.tools._check_build_profile import check_using_build_profile from conan.tools.cmake.cmakedeps import FIND_MODE_CONFIG, FIND_MODE_NONE, FIND_MODE_BOTH, \ @@ -78,7 +77,7 @@ def content(self): if dep.is_build_context and dep.ref.name not in self.build_context_activated: continue - cmake_find_mode = self.get_property("cmake_find_mode", dep) + cmake_find_mode = self.get_property("cmake_find_mode", dep.cpp_info) cmake_find_mode = cmake_find_mode or FIND_MODE_CONFIG cmake_find_mode = cmake_find_mode.lower() # Skip from the requirement @@ -118,14 +117,11 @@ def _generate_files(self, require, dep, ret, find_module_mode): def set_property(self, dep, prop, value): self._properties.setdefault(dep, {}).update({prop: value}) - def get_property(self, prop, dep, component=None): - dep_property = dep.cpp_info.get_property(prop) if not component else \ - dep.cpp_info.components[component].get_property(prop) - dep_and_comp = dep.ref.name if not component else f"{dep.ref.name}::{component}" + def get_property(self, prop, dep): try: - return self._properties[dep_and_comp].get(prop) or dep_property + return self._properties[dep].get(prop) or dep.get_property(prop) except KeyError: - return dep_property + return dep.get_property(prop) def get_cmake_package_name(self, dep, module_mode=None): """Get the name of the file for the find_package(XXX)""" @@ -134,10 +130,10 @@ def get_cmake_package_name(self, dep, module_mode=None): # - The name of the defined XXX_DIR variables # - The name of transitive dependencies for calls to find_dependency if module_mode and self.get_find_mode(dep) in [FIND_MODE_MODULE, FIND_MODE_BOTH]: - ret = self.get_property("cmake_module_file_name", dep) + ret = self.get_property("cmake_module_file_name", dep.cpp_info) if ret: return ret - ret = self.get_property("cmake_file_name", dep) + ret = self.get_property("cmake_file_name", dep.cpp_info) return ret or dep.ref.name def get_find_mode(self, dep): @@ -145,7 +141,7 @@ def get_find_mode(self, dep): :param dep: requirement :return: "none" or "config" or "module" or "both" or "config" when not set """ - tmp = self.get_property("cmake_find_mode", dep) + tmp = self.get_property("cmake_find_mode", dep.cpp_info) if tmp is None: return "config" return tmp.lower() diff --git a/conan/tools/cmake/cmakedeps/templates/__init__.py b/conan/tools/cmake/cmakedeps/templates/__init__.py index e6dc25e0f7f..eea4f0cddd4 100644 --- a/conan/tools/cmake/cmakedeps/templates/__init__.py +++ b/conan/tools/cmake/cmakedeps/templates/__init__.py @@ -84,10 +84,10 @@ def _get_target_default_name(req, component_name="", suffix=""): def get_root_target_name(self, req, suffix=""): if self.generating_module: - ret = self.cmakedeps.get_property("cmake_module_target_name", req) + ret = self.cmakedeps.get_property("cmake_module_target_name", req.cpp_info) if ret: return ret - ret = self.cmakedeps.get_property("cmake_target_name", req) + ret = self.cmakedeps.get_property("cmake_target_name", req.cpp_info) return ret or self._get_target_default_name(req, suffix=suffix) def get_component_alias(self, req, comp_name): @@ -98,10 +98,10 @@ def get_component_alias(self, req, comp_name): raise ConanException("Component '{name}::{cname}' not found in '{name}' " "package requirement".format(name=req.ref.name, cname=comp_name)) if self.generating_module: - ret = self.cmakedeps.get_property("cmake_module_target_name", req, comp_name) + ret = self.cmakedeps.get_property("cmake_module_target_name", req.cpp_info.components[comp_name]) if ret: return ret - ret = self.cmakedeps.get_property("cmake_target_name", req, comp_name) + ret = self.cmakedeps.get_property("cmake_target_name", req.cpp_info.components[comp_name]) # If we don't specify the `cmake_target_name` property for the component it will # fallback to the pkg_name::comp_name, it wont use the root cpp_info cmake_target_name diff --git a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py index a8cae98f957..83720e29c18 100644 --- a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py +++ b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py @@ -189,7 +189,7 @@ def package_info(self): assert r"answer=42" in deps -def test_cmakedeps_set_dependency_props_from_consumer(): +def test_dependency_props_from_consumer(): client = TestClient(path_with_spaces=False) bar = textwrap.dedent(r''' from conan import ConanFile @@ -210,12 +210,12 @@ def layout(self): cmake_layout(self) def generate(self): deps = CMakeDeps(self) - deps.set_property("bar", "cmake_find_mode", "{find_mode}") - deps.set_property("bar", "cmake_file_name", "custom_bar_file_name") - deps.set_property("bar", "cmake_module_file_name", "custom_bar_module_file_name") - deps.set_property("bar", "cmake_target_name", "custom_bar_target_name") - deps.set_property("bar", "cmake_module_target_name", "custom_bar_module_target_name") - deps.set_property("bar::component1", "cmake_target_name", "custom_bar_component_target_name") + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_find_mode", "{find_mode}") + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_file_name", "custom_bar_file_name") + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_module_file_name", "custom_bar_module_file_name") + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_target_name", "custom_bar_target_name") + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_module_target_name", "custom_bar_module_target_name") + deps.set_property(self.dependencies["bar"].cpp_info.components["component1"], "cmake_target_name", "custom_bar_component_target_name") deps.generate() ''') @@ -254,3 +254,105 @@ def generate(self): client.run("install foo.py foo/1.0@") assert not os.path.exists(module_file) assert os.path.exists(config_file) + + +def test_props_from_consumer_build_context_activated(): + client = TestClient(path_with_spaces=False) + bar = textwrap.dedent(r''' + from conan import ConanFile + class FooConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + def package_info(self): + self.cpp_info.set_property("cmake_find_mode", "both") + self.cpp_info.components["component1"].requires = [] + ''') + + foo = textwrap.dedent(r''' + from conan import ConanFile + from conan.tools.cmake import CMakeDeps, cmake_layout + class FooConan(ConanFile): + settings = "os", "compiler", "build_type", "arch" + requires = "bar/1.0" + tool_requires = "bar/1.0" + def layout(self): + cmake_layout(self) + def generate(self): + deps = CMakeDeps(self) + deps.build_context_activated = ["bar"] + deps.build_context_suffix = {{"bar": "_BUILD"}} + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_find_mode", "{find_mode}") + deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_find_mode", "{find_mode}") + + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_file_name", "custom_bar_file_name") + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_module_file_name", "custom_bar_module_file_name") + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_target_name", "custom_bar_target_name") + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_module_target_name", "custom_bar_module_target_name") + deps.set_property(self.dependencies["bar"].cpp_info.components["component1"], "cmake_target_name", "custom_bar_component_target_name") + + deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_file_name", "custom_bar_build_file_name") + deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_module_file_name", "custom_bar_build_module_file_name") + deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_target_name", "custom_bar_build_target_name") + deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_module_target_name", "custom_bar_build_module_target_name") + deps.set_property(self.dependencies.build["bar"].cpp_info.components["component1"], "cmake_target_name", "custom_bar_build_component_target_name") + + deps.generate() + ''') + + client.save({"foo.py": foo.format(find_mode=""), "bar.py": bar}, clean_first=True) + + module_file = os.path.join(client.current_folder, "build", "generators", "module-custom_bar_module_file_nameTargets.cmake") + components_module = os.path.join(client.current_folder, "build", "generators", "custom_bar_file_name-Target-release.cmake") + config_file = os.path.join(client.current_folder, "build", "generators", "custom_bar_file_nameTargets.cmake") + + module_file_build = os.path.join(client.current_folder, "build", "generators", "module-custom_bar_build_module_file_name_BUILDTargets.cmake") + components_module_build = os.path.join(client.current_folder, "build", "generators", "custom_bar_build_file_name_BUILD-Target-release.cmake") + config_file_build = os.path.join(client.current_folder, "build", "generators", "custom_bar_build_file_name_BUILDTargets.cmake") + + # uses cmake_find_mode set in bar: both + client.run("create bar.py bar/1.0@ -pr:h=default -pr:b=default") + client.run("install foo.py foo/1.0@ -pr:h=default -pr:b=default") + assert os.path.exists(module_file) + assert os.path.exists(config_file) + assert os.path.exists(module_file_build) + assert os.path.exists(config_file_build) + + module_content = client.load(module_file) + assert "add_library(custom_bar_module_target_name INTERFACE IMPORTED)" in module_content + config_content = client.load(config_file) + assert "add_library(custom_bar_target_name INTERFACE IMPORTED)" in config_content + + module_content_build = client.load(module_file_build) + assert "add_library(custom_bar_build_module_target_name INTERFACE IMPORTED)" in module_content_build + config_content_build = client.load(config_file_build) + assert "add_library(custom_bar_build_target_name INTERFACE IMPORTED)" in config_content_build + + components_module_content = client.load(components_module) + assert "add_library(bar_custom_bar_component_target_name_DEPS_TARGET INTERFACE IMPORTED)" in components_module_content + + components_module_content_build = client.load(components_module_build) + assert "add_library(bar_BUILD_custom_bar_build_component_target_name_DEPS_TARGET INTERFACE IMPORTED)" in components_module_content_build + + client.save({"foo.py": foo.format(find_mode="none"), "bar.py": bar}, clean_first=True) + client.run("create bar.py bar/1.0@ -pr:h=default -pr:b=default") + client.run("install foo.py foo/1.0@ -pr:h=default -pr:b=default") + assert not os.path.exists(module_file) + assert not os.path.exists(config_file) + assert not os.path.exists(module_file_build) + assert not os.path.exists(config_file_build) + + client.save({"foo.py": foo.format(find_mode="module"), "bar.py": bar}, clean_first=True) + client.run("create bar.py bar/1.0@ -pr:h=default -pr:b=default") + client.run("install foo.py foo/1.0@ -pr:h=default -pr:b=default") + assert os.path.exists(module_file) + assert not os.path.exists(config_file) + assert os.path.exists(module_file_build) + assert not os.path.exists(config_file_build) + + client.save({"foo.py": foo.format(find_mode="config"), "bar.py": bar}, clean_first=True) + client.run("create bar.py bar/1.0@ -pr:h=default -pr:b=default") + client.run("install foo.py foo/1.0@ -pr:h=default -pr:b=default") + assert not os.path.exists(module_file) + assert os.path.exists(config_file) + assert not os.path.exists(module_file_build) + assert os.path.exists(config_file_build) + From 1924659947b4352236fa99d519dcd961153fa0c3 Mon Sep 17 00:00:00 2001 From: czoido Date: Mon, 28 Nov 2022 13:04:52 +0100 Subject: [PATCH 09/13] remove or --- conan/tools/cmake/cmakedeps/cmakedeps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index 72a2dad5fce..a885f840759 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -119,7 +119,7 @@ def set_property(self, dep, prop, value): def get_property(self, prop, dep): try: - return self._properties[dep].get(prop) or dep.get_property(prop) + return self._properties[dep].get(prop) except KeyError: return dep.get_property(prop) From 3d7061303546accbfe3b0da071319b4533591357 Mon Sep 17 00:00:00 2001 From: czoido Date: Mon, 28 Nov 2022 13:15:39 +0100 Subject: [PATCH 10/13] restore or --- conan/tools/cmake/cmakedeps/cmakedeps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index a885f840759..72a2dad5fce 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -119,7 +119,7 @@ def set_property(self, dep, prop, value): def get_property(self, prop, dep): try: - return self._properties[dep].get(prop) + return self._properties[dep].get(prop) or dep.get_property(prop) except KeyError: return dep.get_property(prop) From bb348f4c8e2a7235b4ed5ae65716bbc9e55c1b1a Mon Sep 17 00:00:00 2001 From: czoido Date: Mon, 28 Nov 2022 13:35:23 +0100 Subject: [PATCH 11/13] invalidate upstream --- conan/tools/cmake/cmakedeps/cmakedeps.py | 2 +- .../cmake/cmakedeps/test_cmakedeps.py | 64 ++++++++++++++----- 2 files changed, 48 insertions(+), 18 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index 72a2dad5fce..a00f926cd03 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -119,7 +119,7 @@ def set_property(self, dep, prop, value): def get_property(self, prop, dep): try: - return self._properties[dep].get(prop) or dep.get_property(prop) + return self._properties[dep][prop] except KeyError: return dep.get_property(prop) diff --git a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py index 83720e29c18..98ce5546985 100644 --- a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py +++ b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py @@ -210,7 +210,7 @@ def layout(self): cmake_layout(self) def generate(self): deps = CMakeDeps(self) - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_find_mode", "{find_mode}") + {set_find_mode} deps.set_property(self.dependencies["bar"].cpp_info, "cmake_file_name", "custom_bar_file_name") deps.set_property(self.dependencies["bar"].cpp_info, "cmake_module_file_name", "custom_bar_module_file_name") deps.set_property(self.dependencies["bar"].cpp_info, "cmake_target_name", "custom_bar_target_name") @@ -219,7 +219,11 @@ def generate(self): deps.generate() ''') - client.save({"foo.py": foo.format(find_mode=""), "bar.py": bar}, clean_first=True) + set_find_mode = """ + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_find_mode", {find_mode}) + """ + + client.save({"foo.py": foo.format(set_find_mode=""), "bar.py": bar}, clean_first=True) module_file = os.path.join(client.current_folder, "build", "generators", "module-custom_bar_module_file_nameTargets.cmake") components_module = os.path.join(client.current_folder, "build", "generators", "custom_bar_file_name-Target-release.cmake") @@ -237,19 +241,22 @@ def generate(self): components_module_content = client.load(components_module) assert "add_library(bar_custom_bar_component_target_name_DEPS_TARGET INTERFACE IMPORTED)" in components_module_content - client.save({"foo.py": foo.format(find_mode="none"), "bar.py": bar}, clean_first=True) + client.save({"foo.py": foo.format(set_find_mode=set_find_mode.format(find_mode="'none'")), + "bar.py": bar}, clean_first=True) client.run("create bar.py bar/1.0@") client.run("install foo.py foo/1.0@") assert not os.path.exists(module_file) assert not os.path.exists(config_file) - client.save({"foo.py": foo.format(find_mode="module"), "bar.py": bar}, clean_first=True) + client.save({"foo.py": foo.format(set_find_mode=set_find_mode.format(find_mode="'module'")), + "bar.py": bar}, clean_first=True) client.run("create bar.py bar/1.0@") client.run("install foo.py foo/1.0@") assert os.path.exists(module_file) assert not os.path.exists(config_file) - client.save({"foo.py": foo.format(find_mode="config"), "bar.py": bar}, clean_first=True) + client.save({"foo.py": foo.format(set_find_mode=set_find_mode.format(find_mode="'config'")), + "bar.py": bar}, clean_first=True) client.run("create bar.py bar/1.0@") client.run("install foo.py foo/1.0@") assert not os.path.exists(module_file) @@ -280,8 +287,7 @@ def generate(self): deps = CMakeDeps(self) deps.build_context_activated = ["bar"] deps.build_context_suffix = {{"bar": "_BUILD"}} - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_find_mode", "{find_mode}") - deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_find_mode", "{find_mode}") + {set_find_mode} deps.set_property(self.dependencies["bar"].cpp_info, "cmake_file_name", "custom_bar_file_name") deps.set_property(self.dependencies["bar"].cpp_info, "cmake_module_file_name", "custom_bar_module_file_name") @@ -298,15 +304,26 @@ def generate(self): deps.generate() ''') - client.save({"foo.py": foo.format(find_mode=""), "bar.py": bar}, clean_first=True) + set_find_mode = """ + deps.set_property(self.dependencies["bar"].cpp_info, "cmake_find_mode", {find_mode}) + deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_find_mode", {find_mode}) + """ - module_file = os.path.join(client.current_folder, "build", "generators", "module-custom_bar_module_file_nameTargets.cmake") - components_module = os.path.join(client.current_folder, "build", "generators", "custom_bar_file_name-Target-release.cmake") - config_file = os.path.join(client.current_folder, "build", "generators", "custom_bar_file_nameTargets.cmake") + client.save({"foo.py": foo.format(set_find_mode=""), "bar.py": bar}, clean_first=True) + + module_file = os.path.join(client.current_folder, "build", "generators", + "module-custom_bar_module_file_nameTargets.cmake") + components_module = os.path.join(client.current_folder, "build", "generators", + "custom_bar_file_name-Target-release.cmake") + config_file = os.path.join(client.current_folder, "build", "generators", + "custom_bar_file_nameTargets.cmake") - module_file_build = os.path.join(client.current_folder, "build", "generators", "module-custom_bar_build_module_file_name_BUILDTargets.cmake") - components_module_build = os.path.join(client.current_folder, "build", "generators", "custom_bar_build_file_name_BUILD-Target-release.cmake") - config_file_build = os.path.join(client.current_folder, "build", "generators", "custom_bar_build_file_name_BUILDTargets.cmake") + module_file_build = os.path.join(client.current_folder, "build", "generators", + "module-custom_bar_build_module_file_name_BUILDTargets.cmake") + components_module_build = os.path.join(client.current_folder, "build", "generators", + "custom_bar_build_file_name_BUILD-Target-release.cmake") + config_file_build = os.path.join(client.current_folder, "build", "generators", + "custom_bar_build_file_name_BUILDTargets.cmake") # uses cmake_find_mode set in bar: both client.run("create bar.py bar/1.0@ -pr:h=default -pr:b=default") @@ -332,7 +349,9 @@ def generate(self): components_module_content_build = client.load(components_module_build) assert "add_library(bar_BUILD_custom_bar_build_component_target_name_DEPS_TARGET INTERFACE IMPORTED)" in components_module_content_build - client.save({"foo.py": foo.format(find_mode="none"), "bar.py": bar}, clean_first=True) + client.save( + {"foo.py": foo.format(set_find_mode=set_find_mode.format(find_mode="'none'")), "bar.py": bar}, + clean_first=True) client.run("create bar.py bar/1.0@ -pr:h=default -pr:b=default") client.run("install foo.py foo/1.0@ -pr:h=default -pr:b=default") assert not os.path.exists(module_file) @@ -340,7 +359,8 @@ def generate(self): assert not os.path.exists(module_file_build) assert not os.path.exists(config_file_build) - client.save({"foo.py": foo.format(find_mode="module"), "bar.py": bar}, clean_first=True) + client.save({"foo.py": foo.format(set_find_mode=set_find_mode.format(find_mode="'module'")), + "bar.py": bar}, clean_first=True) client.run("create bar.py bar/1.0@ -pr:h=default -pr:b=default") client.run("install foo.py foo/1.0@ -pr:h=default -pr:b=default") assert os.path.exists(module_file) @@ -348,7 +368,8 @@ def generate(self): assert os.path.exists(module_file_build) assert not os.path.exists(config_file_build) - client.save({"foo.py": foo.format(find_mode="config"), "bar.py": bar}, clean_first=True) + client.save({"foo.py": foo.format(set_find_mode=set_find_mode.format(find_mode="'config'")), + "bar.py": bar}, clean_first=True) client.run("create bar.py bar/1.0@ -pr:h=default -pr:b=default") client.run("install foo.py foo/1.0@ -pr:h=default -pr:b=default") assert not os.path.exists(module_file) @@ -356,3 +377,12 @@ def generate(self): assert not os.path.exists(module_file_build) assert os.path.exists(config_file_build) + # invalidate upstream property setting a None, will use config that's the default + client.save({"foo.py": foo.format(set_find_mode=set_find_mode.format(find_mode="None")), + "bar.py": bar}, clean_first=True) + client.run("create bar.py bar/1.0@ -pr:h=default -pr:b=default") + client.run("install foo.py foo/1.0@ -pr:h=default -pr:b=default") + assert not os.path.exists(module_file) + assert os.path.exists(config_file) + assert not os.path.exists(module_file_build) + assert os.path.exists(config_file_build) From 75e99784da5a7c2e8fd41f5f7ec887dc60b4bc7f Mon Sep 17 00:00:00 2001 From: czoido Date: Mon, 28 Nov 2022 18:37:49 +0100 Subject: [PATCH 12/13] change syntax --- conan/tools/cmake/cmakedeps/cmakedeps.py | 24 ++++++++----- .../cmake/cmakedeps/templates/__init__.py | 8 ++--- .../cmake/cmakedeps/test_cmakedeps.py | 36 +++++++++---------- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index a00f926cd03..9cba79142ab 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -77,7 +77,7 @@ def content(self): if dep.is_build_context and dep.ref.name not in self.build_context_activated: continue - cmake_find_mode = self.get_property("cmake_find_mode", dep.cpp_info) + cmake_find_mode = self.get_property("cmake_find_mode", dep) cmake_find_mode = cmake_find_mode or FIND_MODE_CONFIG cmake_find_mode = cmake_find_mode.lower() # Skip from the requirement @@ -114,14 +114,20 @@ def _generate_files(self, require, dep, ret, find_module_mode): if not os.path.exists(config.filename): ret[config.filename] = config.render() - def set_property(self, dep, prop, value): - self._properties.setdefault(dep, {}).update({prop: value}) + def set_property(self, dep, prop, value, build_context=False): + build_suffix = "_build" if build_context else "" + self._properties.setdefault(f"{dep}{build_suffix}", {}).update({prop: value}) - def get_property(self, prop, dep): + def get_property(self, prop, dep, comp_name=None): + dep_name = dep.ref.name + build_suffix = "_build" if str( + dep_name) in self.build_context_activated and dep.context == "build" else "" + dep_comp = f"{str(dep_name)}::{comp_name}" if comp_name else f"{str(dep_name)}" try: - return self._properties[dep][prop] + return self._properties[f"{dep_comp}{build_suffix}"][prop] except KeyError: - return dep.get_property(prop) + return dep.cpp_info.get_property(prop) if not comp_name else dep.cpp_info.components[ + comp_name].get_property(prop) def get_cmake_package_name(self, dep, module_mode=None): """Get the name of the file for the find_package(XXX)""" @@ -130,10 +136,10 @@ def get_cmake_package_name(self, dep, module_mode=None): # - The name of the defined XXX_DIR variables # - The name of transitive dependencies for calls to find_dependency if module_mode and self.get_find_mode(dep) in [FIND_MODE_MODULE, FIND_MODE_BOTH]: - ret = self.get_property("cmake_module_file_name", dep.cpp_info) + ret = self.get_property("cmake_module_file_name", dep) if ret: return ret - ret = self.get_property("cmake_file_name", dep.cpp_info) + ret = self.get_property("cmake_file_name", dep) return ret or dep.ref.name def get_find_mode(self, dep): @@ -141,7 +147,7 @@ def get_find_mode(self, dep): :param dep: requirement :return: "none" or "config" or "module" or "both" or "config" when not set """ - tmp = self.get_property("cmake_find_mode", dep.cpp_info) + tmp = self.get_property("cmake_find_mode", dep) if tmp is None: return "config" return tmp.lower() diff --git a/conan/tools/cmake/cmakedeps/templates/__init__.py b/conan/tools/cmake/cmakedeps/templates/__init__.py index eea4f0cddd4..7e11bd8618a 100644 --- a/conan/tools/cmake/cmakedeps/templates/__init__.py +++ b/conan/tools/cmake/cmakedeps/templates/__init__.py @@ -84,10 +84,10 @@ def _get_target_default_name(req, component_name="", suffix=""): def get_root_target_name(self, req, suffix=""): if self.generating_module: - ret = self.cmakedeps.get_property("cmake_module_target_name", req.cpp_info) + ret = self.cmakedeps.get_property("cmake_module_target_name", req) if ret: return ret - ret = self.cmakedeps.get_property("cmake_target_name", req.cpp_info) + ret = self.cmakedeps.get_property("cmake_target_name", req) return ret or self._get_target_default_name(req, suffix=suffix) def get_component_alias(self, req, comp_name): @@ -98,10 +98,10 @@ def get_component_alias(self, req, comp_name): raise ConanException("Component '{name}::{cname}' not found in '{name}' " "package requirement".format(name=req.ref.name, cname=comp_name)) if self.generating_module: - ret = self.cmakedeps.get_property("cmake_module_target_name", req.cpp_info.components[comp_name]) + ret = self.cmakedeps.get_property("cmake_module_target_name", req, comp_name=comp_name) if ret: return ret - ret = self.cmakedeps.get_property("cmake_target_name", req.cpp_info.components[comp_name]) + ret = self.cmakedeps.get_property("cmake_target_name", req, comp_name=comp_name) # If we don't specify the `cmake_target_name` property for the component it will # fallback to the pkg_name::comp_name, it wont use the root cpp_info cmake_target_name diff --git a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py index 98ce5546985..15d07a2e95f 100644 --- a/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py +++ b/conans/test/integration/toolchains/cmake/cmakedeps/test_cmakedeps.py @@ -211,16 +211,16 @@ def layout(self): def generate(self): deps = CMakeDeps(self) {set_find_mode} - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_file_name", "custom_bar_file_name") - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_module_file_name", "custom_bar_module_file_name") - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_target_name", "custom_bar_target_name") - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_module_target_name", "custom_bar_module_target_name") - deps.set_property(self.dependencies["bar"].cpp_info.components["component1"], "cmake_target_name", "custom_bar_component_target_name") + deps.set_property("bar", "cmake_file_name", "custom_bar_file_name") + deps.set_property("bar", "cmake_module_file_name", "custom_bar_module_file_name") + deps.set_property("bar", "cmake_target_name", "custom_bar_target_name") + deps.set_property("bar", "cmake_module_target_name", "custom_bar_module_target_name") + deps.set_property("bar::component1", "cmake_target_name", "custom_bar_component_target_name") deps.generate() ''') set_find_mode = """ - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_find_mode", {find_mode}) + deps.set_property("bar", "cmake_find_mode", {find_mode}) """ client.save({"foo.py": foo.format(set_find_mode=""), "bar.py": bar}, clean_first=True) @@ -289,24 +289,24 @@ def generate(self): deps.build_context_suffix = {{"bar": "_BUILD"}} {set_find_mode} - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_file_name", "custom_bar_file_name") - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_module_file_name", "custom_bar_module_file_name") - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_target_name", "custom_bar_target_name") - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_module_target_name", "custom_bar_module_target_name") - deps.set_property(self.dependencies["bar"].cpp_info.components["component1"], "cmake_target_name", "custom_bar_component_target_name") + deps.set_property("bar", "cmake_file_name", "custom_bar_file_name") + deps.set_property("bar", "cmake_module_file_name", "custom_bar_module_file_name") + deps.set_property("bar", "cmake_target_name", "custom_bar_target_name") + deps.set_property("bar", "cmake_module_target_name", "custom_bar_module_target_name") + deps.set_property("bar::component1", "cmake_target_name", "custom_bar_component_target_name") - deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_file_name", "custom_bar_build_file_name") - deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_module_file_name", "custom_bar_build_module_file_name") - deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_target_name", "custom_bar_build_target_name") - deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_module_target_name", "custom_bar_build_module_target_name") - deps.set_property(self.dependencies.build["bar"].cpp_info.components["component1"], "cmake_target_name", "custom_bar_build_component_target_name") + deps.set_property("bar", "cmake_file_name", "custom_bar_build_file_name", build_context=True) + deps.set_property("bar", "cmake_module_file_name", "custom_bar_build_module_file_name", build_context=True) + deps.set_property("bar", "cmake_target_name", "custom_bar_build_target_name", build_context=True) + deps.set_property("bar", "cmake_module_target_name", "custom_bar_build_module_target_name", build_context=True) + deps.set_property("bar::component1", "cmake_target_name", "custom_bar_build_component_target_name", build_context=True) deps.generate() ''') set_find_mode = """ - deps.set_property(self.dependencies["bar"].cpp_info, "cmake_find_mode", {find_mode}) - deps.set_property(self.dependencies.build["bar"].cpp_info, "cmake_find_mode", {find_mode}) + deps.set_property("bar", "cmake_find_mode", {find_mode}) + deps.set_property("bar", "cmake_find_mode", {find_mode}, build_context=True) """ client.save({"foo.py": foo.format(set_find_mode=""), "bar.py": bar}, clean_first=True) From 38d9eeed35103f460151d13916dd4309170d220e Mon Sep 17 00:00:00 2001 From: czoido Date: Mon, 28 Nov 2022 20:05:59 +0100 Subject: [PATCH 13/13] change suffix --- conan/tools/cmake/cmakedeps/cmakedeps.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conan/tools/cmake/cmakedeps/cmakedeps.py b/conan/tools/cmake/cmakedeps/cmakedeps.py index 9cba79142ab..75751841c2c 100644 --- a/conan/tools/cmake/cmakedeps/cmakedeps.py +++ b/conan/tools/cmake/cmakedeps/cmakedeps.py @@ -115,12 +115,12 @@ def _generate_files(self, require, dep, ret, find_module_mode): ret[config.filename] = config.render() def set_property(self, dep, prop, value, build_context=False): - build_suffix = "_build" if build_context else "" + build_suffix = "&build" if build_context else "" self._properties.setdefault(f"{dep}{build_suffix}", {}).update({prop: value}) def get_property(self, prop, dep, comp_name=None): dep_name = dep.ref.name - build_suffix = "_build" if str( + build_suffix = "&build" if str( dep_name) in self.build_context_activated and dep.context == "build" else "" dep_comp = f"{str(dep_name)}::{comp_name}" if comp_name else f"{str(dep_name)}" try: