blob: 5ad5bc7719125fb7731a8e270600325d43ba64f1 [file] [log] [blame]
Ned Nguyen9a7a9052019-02-05 11:04:03 -07001# -*- coding: utf-8 -*-
2# Copyright 2019 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Build graph dependency creation service.
7
8This service handles the creation of the portage build dependency graphs and the
9graphs mapping from portage packages to the dependency source.
10"""
11
12from __future__ import print_function
13
Alex Klein076841b2019-08-29 15:19:39 -060014from chromite.api import faux
Alex Klein231d2da2019-07-22 16:44:45 -060015from chromite.api import validate
Ned Nguyene5d04852019-02-19 16:33:15 -070016from chromite.lib import portage_util
Alex Kleinb7cdbe62019-02-22 11:41:32 -070017from chromite.service import dependency
Ned Nguyen9a7a9052019-02-05 11:04:03 -070018
Ned Nguyene5d04852019-02-19 16:33:15 -070019
Ned Nguyen8e144bd2019-05-02 09:09:41 -060020def AugmentDepGraphProtoFromJsonMap(json_map, graph):
21 """Augment package deps from |json_map| to graph object.
Ned Nguyene5d04852019-02-19 16:33:15 -070022
23 Args:
24 json_map: the json object that stores the portage package. This is
Alex Kleinb7cdbe62019-02-22 11:41:32 -070025 generated from chromite.lib.service.dependency.GetBuildDependency()
Ned Nguyen8e144bd2019-05-02 09:09:41 -060026 graph: the proto object that represents the dependency graph (see DepGraph
27 message in chromite/api/depgraph.proto)
Ned Nguyene5d04852019-02-19 16:33:15 -070028 """
Ned Nguyene5d04852019-02-19 16:33:15 -070029 graph.build_target.name = json_map['target_board']
30
Mike Frysinger0bdbc102019-06-13 15:27:29 -040031 for data in json_map['package_deps'].values():
Ned Nguyene5d04852019-02-19 16:33:15 -070032 package_dep_info = graph.package_deps.add()
33 package_info = package_dep_info.package_info
34 package_info.package_name = data['name']
35 package_info.category = data['category']
36 package_info.version = data['version']
37 for dep in data['deps']:
38 cpv = portage_util.SplitCPV(dep, strict=False)
39 dep_package = package_dep_info.dependency_packages.add()
40 dep_package.package_name = cpv.package
41 dep_package.category = cpv.category
42 if cpv.version:
43 dep_package.version = cpv.version
44
Ned Nguyen8be10052019-02-26 08:58:45 -070045 package_CPV = '%s/%s-%s' % (
46 package_info.category, package_info.package_name, package_info.version)
47 for path in json_map['source_path_mapping'][package_CPV]:
Ned Nguyene5d04852019-02-19 16:33:15 -070048 source_path = package_dep_info.dependency_source_paths.add()
49 source_path.path = path
50
Ned Nguyenb5d38722019-05-06 10:24:06 -060051
Michael Mortensenaf10cca2019-11-18 20:21:32 -070052def _GetBuildDependencyGraphResponse(_input_proto, output_proto, _config):
53 """Add fake dep_graph data to a successful response."""
54 output_proto.dep_graph.build_target.name = 'target_board'
55
56
57@faux.success(_GetBuildDependencyGraphResponse)
58@faux.empty_error
Alex Klein231d2da2019-07-22 16:44:45 -060059@validate.require('build_target.name')
60@validate.validation_complete
61def GetBuildDependencyGraph(input_proto, output_proto, _config):
Ned Nguyen9a7a9052019-02-05 11:04:03 -070062 """Create the build dependency graph.
63
64 Args:
65 input_proto (GetBuildDependencyGraphRequest): The input arguments message.
66 output_proto (GetBuildDependencyGraphResponse): The empty output message.
Alex Klein231d2da2019-07-22 16:44:45 -060067 _config (api_config.ApiConfig): The API call config.
Ned Nguyen9a7a9052019-02-05 11:04:03 -070068 """
69 board = input_proto.build_target.name
Ned Nguyen9a7a9052019-02-05 11:04:03 -070070
Chris McDonalda22b74f2019-11-22 13:55:06 -070071 json_map, sdk_json_map = dependency.GetBuildDependency(board)
Ned Nguyen8e144bd2019-05-02 09:09:41 -060072 AugmentDepGraphProtoFromJsonMap(json_map, output_proto.dep_graph)
Chris McDonalda22b74f2019-11-22 13:55:06 -070073 AugmentDepGraphProtoFromJsonMap(sdk_json_map, output_proto.sdk_dep_graph)