From 8c6caa6d796af656c4ab308b3bd308ec1762bb00 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 11 May 2021 13:20:43 +0200 Subject: [PATCH] [fix] Respect order of declared directories when using components (#8927) * [fix] Respect order of directories when using components * separate functions for aggregating lists and dicts * update test --- conans/model/build_info.py | 55 ++++++++++++------- .../model/build_info/components_test.py | 11 ++++ 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/conans/model/build_info.py b/conans/model/build_info.py index 514f44c8b62..39f8cbaff68 100644 --- a/conans/model/build_info.py +++ b/conans/model/build_info.py @@ -556,14 +556,29 @@ def __getattr__(self, item): attr = self._cpp_info.__getattr__(item) return attr - def _aggregated_values(self, item, agg_func=merge_lists): + def _aggregated_dict_values(self, item): values = getattr(self, "_%s" % item) if values is not None: return values - values = getattr(self._cpp_info, item) if self._cpp_info.components: + values = {} for component in self._get_sorted_components().values(): - values = agg_func(values, getattr(component, item)) + values = merge_dicts(values, getattr(component, item)) + else: + values = getattr(self._cpp_info, item) + setattr(self, "_%s" % item, values) + return values + + def _aggregated_list_values(self, item): + values = getattr(self, "_%s" % item) + if values is not None: + return values + if self._cpp_info.components: + values = [] + for component in self._get_sorted_components().values(): + values = merge_lists(values, getattr(component, item)) + else: + values = getattr(self._cpp_info, item) setattr(self, "_%s" % item, values) return values @@ -614,71 +629,71 @@ def _get_sorted_components(self): @property def build_modules_paths(self): - return self._aggregated_values("build_modules_paths", agg_func=merge_dicts) + return self._aggregated_dict_values("build_modules_paths") @property def include_paths(self): - return self._aggregated_values("include_paths") + return self._aggregated_list_values("include_paths") @property def lib_paths(self): - return self._aggregated_values("lib_paths") + return self._aggregated_list_values("lib_paths") @property def src_paths(self): - return self._aggregated_values("src_paths") + return self._aggregated_list_values("src_paths") @property def bin_paths(self): - return self._aggregated_values("bin_paths") + return self._aggregated_list_values("bin_paths") @property def build_paths(self): - return self._aggregated_values("build_paths") + return self._aggregated_list_values("build_paths") @property def res_paths(self): - return self._aggregated_values("res_paths") + return self._aggregated_list_values("res_paths") @property def framework_paths(self): - return self._aggregated_values("framework_paths") + return self._aggregated_list_values("framework_paths") @property def libs(self): - return self._aggregated_values("libs") + return self._aggregated_list_values("libs") @property def system_libs(self): - return self._aggregated_values("system_libs") + return self._aggregated_list_values("system_libs") @property def frameworks(self): - return self._aggregated_values("frameworks") + return self._aggregated_list_values("frameworks") @property def defines(self): - return self._aggregated_values("defines") + return self._aggregated_list_values("defines") @property def cxxflags(self): - return self._aggregated_values("cxxflags") + return self._aggregated_list_values("cxxflags") @property def cflags(self): - return self._aggregated_values("cflags") + return self._aggregated_list_values("cflags") @property def sharedlinkflags(self): - return self._aggregated_values("sharedlinkflags") + return self._aggregated_list_values("sharedlinkflags") @property def exelinkflags(self): - return self._aggregated_values("exelinkflags") + return self._aggregated_list_values("exelinkflags") @property def requires(self): - return self._aggregated_values("requires") + return self._aggregated_list_values("requires") class DepsCppInfo(_BaseDepsCppInfo): diff --git a/conans/test/unittests/model/build_info/components_test.py b/conans/test/unittests/model/build_info/components_test.py index 01134759322..7fb758d9c4d 100644 --- a/conans/test/unittests/model/build_info/components_test.py +++ b/conans/test/unittests/model/build_info/components_test.py @@ -414,3 +414,14 @@ def test_deps_cpp_info_components(self): self.assertListEqual([os.path.join(folder, "include")], list(deps_cpp_info.include_paths)) self.assertListEqual([os.path.join(folder, "include")], list(deps_cpp_info["my_lib"].components["Component"].include_paths)) + + def test_deps_cpp_info_components_includedirs(self): + info = CppInfo("my_lib", "root") + info.components["component"].includedirs = ["include1", "include2"] + info.components["component"].filter_empty = False + dep_info = DepCppInfo(info) + expected = [os.path.join("root", "include1"), os.path.join("root", "include2")] + self.assertListEqual(expected, list(dep_info.include_paths)) + deps_cpp_info = DepsCppInfo() + deps_cpp_info.add("my_lib", dep_info) + self.assertListEqual(expected, list(deps_cpp_info.includedirs))