forked from conan-io/conan
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcompute_pid.py
94 lines (79 loc) · 4.33 KB
/
compute_pid.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from collections import OrderedDict
from conan.internal.errors import conanfile_remove_attr, conanfile_exception_formatter
from conan.errors import ConanException, ConanInvalidConfiguration
from conan.internal.methods import auto_header_only_package_id
from conan.internal.model.info import ConanInfo, RequirementsInfo, RequirementInfo, PythonRequiresInfo
def compute_package_id(node, modes, config_version, hook_manager):
"""
Compute the binary package ID of this node
"""
conanfile = node.conanfile
unknown_mode, non_embed_mode, embed_mode, python_mode, build_mode = modes
python_requires = getattr(conanfile, "python_requires", None)
if python_requires:
python_requires = python_requires.info_requires()
data = OrderedDict()
build_data = OrderedDict()
for require, transitive in node.transitive_deps.items():
dep_node = transitive.node
require.deduce_package_id_mode(conanfile.package_type, dep_node,
non_embed_mode, embed_mode, build_mode, unknown_mode)
if require.package_id_mode is not None:
req_info = RequirementInfo(dep_node.pref.ref, dep_node.pref.package_id,
require.package_id_mode)
if require.build:
build_data[require] = req_info
else:
data[require] = req_info
if conanfile.vendor: # Make the package_id fully independent of dependencies versions
data, build_data = OrderedDict(), OrderedDict() # TODO, cleaner, now minimal diff
reqs_info = RequirementsInfo(data)
build_requires_info = RequirementsInfo(build_data)
python_requires = PythonRequiresInfo(python_requires, python_mode)
try:
copied_options = conanfile.options.copy_conaninfo_options()
except ConanException as e:
raise ConanException(f"{conanfile}: {e}")
conanfile.info = ConanInfo(settings=conanfile.settings.copy_conaninfo_settings(),
options=copied_options,
reqs_info=reqs_info,
build_requires_info=build_requires_info,
python_requires=python_requires,
conf=conanfile.conf.copy_conaninfo_conf(),
config_version=config_version.copy() if config_version else None)
conanfile.original_info = conanfile.info.clone()
run_validate_package_id(conanfile, hook_manager)
if conanfile.info.settings_target:
# settings_target has beed added to conan package via package_id api
conanfile.original_info.settings_target = conanfile.info.settings_target
info = conanfile.info
node.package_id = info.package_id()
def run_validate_package_id(conanfile, hook_manager=None):
# IMPORTANT: This validation code must run before calling info.package_id(), to mark "invalid"
if hasattr(conanfile, "validate_build"):
with conanfile_exception_formatter(conanfile, "validate_build"):
with conanfile_remove_attr(conanfile, ['cpp_info'], "validate_build"):
try:
conanfile.validate_build()
except ConanInvalidConfiguration as e:
# This 'cant_build' will be ignored if we don't have to build the node.
conanfile.info.cant_build = str(e)
if hasattr(conanfile, "validate"):
with conanfile_exception_formatter(conanfile, "validate"):
if hook_manager:
hook_manager.execute("pre_validate", conanfile=conanfile)
with conanfile_remove_attr(conanfile, ['cpp_info'], "validate"):
try:
conanfile.validate()
except ConanInvalidConfiguration as e:
conanfile.info.invalid = str(e)
if hook_manager:
hook_manager.execute("post_validate", conanfile=conanfile)
# Once we are done, call package_id() to narrow and change possible values
if hasattr(conanfile, "package_id"):
with conanfile_exception_formatter(conanfile, "package_id"):
with conanfile_remove_attr(conanfile, ['cpp_info', 'settings', 'options'], "package_id"):
conanfile.package_id()
elif "auto_header_only" in conanfile.implements:
auto_header_only_package_id(conanfile)
conanfile.info.validate()