def compute_package_ids(self): ordered = self.by_levels() for level in ordered: for node in level: conanfile = node.conanfile neighbors = node.neighbors() direct_reqs = [] # of PackageReference indirect_reqs = set() # of PackageReference, avoid duplicates for neighbor in neighbors: nref, nconan = neighbor.conan_ref, neighbor.conanfile package_id = nconan.info.package_id() package_reference = PackageReference(nref, package_id) direct_reqs.append(package_reference) indirect_reqs.update(nconan.info.requires.refs()) conanfile.options.propagate_downstream(nref, nconan.info.full_options) # Might be never used, but update original requirement, just in case conanfile.requires[nref.name].conan_reference = nref # Make sure not duplicated indirect_reqs.difference_update(direct_reqs) # There might be options that are not upstream, backup them, might be # for build-requires conanfile.build_requires_options = conanfile.options.values conanfile.options.clear_unused(indirect_reqs.union(direct_reqs)) conanfile.info = ConanInfo.create(conanfile.settings.values, conanfile.options.values, direct_reqs, indirect_reqs) # Once we are done, call package_id() to narrow and change possible values with conanfile_exception_formatter(str(conanfile), "package_id"): conanfile.package_id() return ordered
def _compute_package_id(node, default_package_id_mode): conanfile = node.conanfile neighbors = node.neighbors() direct_reqs = [] # of PackageReference indirect_reqs = set() # of PackageReference, avoid duplicates for neighbor in neighbors: ref, nconan = neighbor.ref, neighbor.conanfile direct_reqs.append(neighbor.pref) indirect_reqs.update(nconan.info.requires.refs()) conanfile.options.propagate_downstream(ref, nconan.info.full_options) # Might be never used, but update original requirement, just in case conanfile.requires[ref.name].ref = ref # Make sure not duplicated indirect_reqs.difference_update(direct_reqs) # There might be options that are not upstream, backup them, might be # for build-requires conanfile.build_requires_options = conanfile.options.values conanfile.options.clear_unused(indirect_reqs.union(direct_reqs)) conanfile.options.freeze() conanfile.info = ConanInfo.create( conanfile.settings.values, conanfile.options.values, direct_reqs, indirect_reqs, default_package_id_mode=default_package_id_mode) # Once we are done, call package_id() to narrow and change possible values with conanfile_exception_formatter(str(conanfile), "package_id"): conanfile.package_id() info = conanfile.info node.package_id = info.package_id()
def _compute_package_id(node, default_package_id_mode): """ Compute the binary package ID of this node :param node: the node to compute the package-ID :param default_package_id_mode: configuration of the package-ID mode """ # TODO Conan 2.0. To separate the propagation of the graph (options) of the package-ID # A bit risky to be done now conanfile = node.conanfile neighbors = node.neighbors() direct_reqs = [] # of PackageReference indirect_reqs = set() # of PackageReference, avoid duplicates for neighbor in neighbors: ref, nconan = neighbor.ref, neighbor.conanfile direct_reqs.append(neighbor.pref) indirect_reqs.update(nconan.info.requires.refs()) # Make sure not duplicated indirect_reqs.difference_update(direct_reqs) conanfile.info = ConanInfo.create( conanfile.settings.values, conanfile.options.values, direct_reqs, indirect_reqs, default_package_id_mode=default_package_id_mode) # Once we are done, call package_id() to narrow and change possible values with conanfile_exception_formatter(str(conanfile), "package_id"): conanfile.package_id() info = conanfile.info node.package_id = info.package_id()
def _compute_package_id(self, node, default_package_id_mode, default_python_requires_id_mode): """ Compute the binary package ID of this node :param node: the node to compute the package-ID :param default_package_id_mode: configuration of the package-ID mode """ # TODO Conan 2.0. To separate the propagation of the graph (options) of the package-ID # A bit risky to be done now conanfile = node.conanfile neighbors = node.neighbors() direct_reqs, indirect_reqs = self.package_id_transitive_reqs(node) # FIXME: Conan v2.0 This is introducing a bug for backwards compatibility, it will add # only the requirements available in the 'neighbour.info' object, not all the closure if not self._fixed_package_id: old_indirect = set() for neighbor in neighbors: old_indirect.update( (p.ref, p.id) for p in neighbor.conanfile.info.requires.refs()) indirect_reqs = set(p for p in indirect_reqs if (p.ref, p.id) in old_indirect) indirect_reqs.difference_update(direct_reqs) python_requires = getattr(conanfile, "python_requires", None) if python_requires: if isinstance(python_requires, dict): python_requires = None # Legacy python-requires do not change package-ID else: python_requires = python_requires.all_refs() conanfile.info = ConanInfo.create( conanfile.settings.values, conanfile.options.values, direct_reqs, indirect_reqs, default_package_id_mode=default_package_id_mode, python_requires=python_requires, default_python_requires_id_mode=default_python_requires_id_mode) # Once we are done, call package_id() to narrow and change possible values with conanfile_exception_formatter(str(conanfile), "package_id"): with conan_v2_property( conanfile, 'cpp_info', "'self.cpp_info' access in package_id() method is deprecated" ): conanfile.package_id() if hasattr(conanfile, "validate") and callable(conanfile.validate): with conanfile_exception_formatter(str(conanfile), "validate"): try: conanfile.validate() except ConanInvalidConfiguration as e: conanfile.info.invalid = str(e) info = conanfile.info node.package_id = info.package_id()
def _compute_package_id(self, node, default_package_id_mode, default_python_requires_id_mode): """ Compute the binary package ID of this node :param node: the node to compute the package-ID :param default_package_id_mode: configuration of the package-ID mode """ # TODO Conan 2.0. To separate the propagation of the graph (options) of the package-ID # A bit risky to be done now conanfile = node.conanfile neighbors = node.neighbors() if not self._fixed_package_id: direct_reqs = [] # of PackageReference indirect_reqs = set() # of PackageReference, avoid duplicates for neighbor in neighbors: ref, nconan = neighbor.ref, neighbor.conanfile direct_reqs.append(neighbor.pref) indirect_reqs.update(nconan.info.requires.refs()) # Make sure not duplicated indirect_reqs.difference_update(direct_reqs) else: node.id_direct_prefs = set() # of PackageReference node.id_indirect_prefs = set( ) # of PackageReference, avoid duplicates for neighbor in neighbors: node.id_direct_prefs.add(neighbor.pref) node.id_indirect_prefs.update(neighbor.id_direct_prefs) node.id_indirect_prefs.update(neighbor.id_indirect_prefs) # Make sure not duplicated, totally necessary node.id_indirect_prefs.difference_update(node.id_direct_prefs) direct_reqs = node.id_direct_prefs indirect_reqs = node.id_indirect_prefs python_requires = getattr(conanfile, "python_requires", None) if python_requires: if isinstance(python_requires, dict): python_requires = None # Legacy python-requires do not change package-ID else: python_requires = python_requires.all_refs() conanfile.info = ConanInfo.create( conanfile.settings.values, conanfile.options.values, direct_reqs, indirect_reqs, default_package_id_mode=default_package_id_mode, python_requires=python_requires, default_python_requires_id_mode=default_python_requires_id_mode) # Once we are done, call package_id() to narrow and change possible values with conanfile_exception_formatter(str(conanfile), "package_id"): with conan_v2_property( conanfile, 'cpp_info', "'self.cpp_info' access in package_id() method is deprecated" ): conanfile.package_id() info = conanfile.info node.package_id = info.package_id()
def propagate_info(self): """ takes the exports from upper level and updates the imports right now also the imports are propagated, but should be checked E.g. Conan A, depends on B. A=>B B exports an include directory "my_dir", with root "/...../0123efe" A imports are the exports of B, plus any other conans it depends on A.imports.include_dirs = B.export.include_paths. Note the difference, include_paths used to compute full paths as the user defines export relative to its folder """ ordered = self.by_levels() for level in ordered: for node in level: _, conanfile = node neighbors = self._neighbors[node] direct_reqs = [] # of PackageReference indirect_reqs = set() # of PackageReference, avoid duplicates for nref, nconan in neighbors: package_id = nconan.info.package_id() package_reference = PackageReference(nref, package_id) direct_reqs.append(package_reference) indirect_reqs.update(nconan.info.requires.refs()) conanfile.options.propagate_downstream( nref, nconan.info.full_options) # Might be never used, but update original requirement, just in case conanfile.requires[nref.name].conan_reference = nref # Make sure not duplicated indirect_reqs.difference_update(direct_reqs) # There might be options that are not upstream, backup them, might be # for build-requires conanfile.build_requires_options = conanfile.options.values conanfile.options.clear_unused( indirect_reqs.union(direct_reqs)) non_devs = self.non_dev_nodes(node) conanfile.info = ConanInfo.create(conanfile.settings.values, conanfile.options.values, direct_reqs, indirect_reqs, non_devs) # Once we are done, call package_id() to narrow and change possible values if hasattr(conanfile, "conan_info"): # Deprecated in 0.19 conanfile.conan_info() else: with conanfile_exception_formatter(str(conanfile), "package_id"): conanfile.package_id() return ordered