Skip to content

Commit

Permalink
[fix] Respect order of declared directories when using components (#8927
Browse files Browse the repository at this point in the history
)

* [fix] Respect order of directories when using components

* separate functions for aggregating lists and dicts

* update test
  • Loading branch information
danimtb committed May 11, 2021
1 parent fb5004d commit 8c6caa6
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 20 deletions.
55 changes: 35 additions & 20 deletions conans/model/build_info.py
Expand Up @@ -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

Expand Down Expand Up @@ -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):
Expand Down
11 changes: 11 additions & 0 deletions conans/test/unittests/model/build_info/components_test.py
Expand Up @@ -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))

0 comments on commit 8c6caa6

Please sign in to comment.