Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: tools/mb/docs/design_spec.md

Issue 1062613004: Implement mb - a meta-build wrapper for bots to use in the GYP->GN migration. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: bug fixes and tests, reorganize mb_config.pyl Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/mb/README.md ('k') | tools/mb/docs/user_guide.md » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # The MB (Meta-Build wrapper) design spec
2
3 [TOC]
4
5 ## Intro
6
7 MB is intended to address two major aspects of the GYP -> GN transition
8 for Chromium:
9
10 1. "bot toggling" - make it so that we can easily flip a given bot
11 back and forth between GN and GYP.
12
13 2. "bot configuration" - provide a single source of truth for all of
14 the different configurations (os/arch/`gyp_define` combinations) of
15 Chromium that are supported.
16
17 MB must handle at least the `gen` and `analyze` steps on the bots, i.e.,
18 we need to wrap both the `gyp_chromium` invocation to generate the
19 Ninja files, and the `analyze` step that takes a list of modified files
20 and a list of targets to build and returns which targets are affected by
21 the files.
22
23 ## Design
24
25 MB is intended to be as simple as possible, and to defer as much work as
26 possible to GN or GYP. It should live as a very simple Python wrapper
27 that offers little in the way of surprises.
28
29 ### Command line
30
31 It is structured as a single binary that supports a list of subcommands:
32
33 * `mb gen -c linux_rel_bot //out/Release`
34 * `mb analyze -m tryserver.chromium.linux -b linux_rel /tmp/input.json /tmp/outp ut.json`
35
36 ### Configurations
37
38 `mb` looks in the `//tools/mb/mb_config.pyl` config file to determine whether
39 to use GYP or GN for a particular build directory, and what set of flags
40 (`GYP_DEFINES` or `gn args`) to use.
41
42 A config can either be specified directly (useful for testing) or by specifying
43 the master name and builder name (useful on the bots so that they do not need
44 to specify a config directly and can be hidden from the details).
45
46 See the [user guide](user_guide.md#mb_config.pyl) for details.
47
48 ### Handling the analyze step
49
50 The interface to `mb analyze` is described in the
51 [user\_guide](user_guide.md#mb_analyze).
52
53 Since the interface basically mirrors the way the "analyze" step on the bots
54 invokes gyp\_chromium today, when the config is found to be a gyp config,
55 the arguments are passed straight through.
56
57 It implements the equivalent functionality in GN by calling `'gn refs
58 [list of files] --type=executable --all --as=output` and filtering the
59 output to match the list of targets.
60
61 ## Detailed Design Requirements and Rationale
62
63 This section is collection of semi-organized notes on why MB is the way
64 it is ...
65
66 ### in-tree or out-of-tree
67
68 The first issue is whether or not this should exist as a script in
69 Chromium at all; an alternative would be to simply change the bot
70 configurations to know whether to use GYP or GN, and which flags to
71 pass.
72
73 That would certainly work, but experience over the past two years
74 suggests a few things:
75
76 * we should push as much logic as we can into the source repositories
77 so that they can be versioned and changed atomically with changes to
78 the product code; having to coordinate changes between src/ and
79 build/ is at best annoying and can lead to weird errors.
80 * the infra team would really like to move to providing
81 product-independent services (i.e., not have to do one thing for
82 Chromium, another for NaCl, a third for V8, etc.).
83 * we found that during the SVN->GIT migration the ability to flip bot
84 configurations between the two via changes to a file in chromium
85 was very useful.
86
87 All of this suggests that the interface between bots and Chromium should
88 be a simple one, hiding as much of the chromium logic as possible.
89
90 ### Why not have MB be smarter about de-duping flags?
91
92 This just adds complexity to the MB implementation, and duplicates logic
93 that GYP and GN already have to support anyway; in particular, it might
94 require MB to know how to parse GYP and GN values. The belief is that
95 if MB does *not* do this, it will lead to fewer surprises.
96
97 It will not be hard to change this if need be.
98
99 ### Integration w/ gclient runhooks
100
101 On the bots, we will disable `gyp_chromium` as part of runhooks (using
102 `GYP_CHROMIUM_NO_ACTION=1`), so that mb shows up as a separate step.
103
104 At the moment, we expect most developers to either continue to use
105 `gyp_chromium` in runhooks or to disable at as above if they have no
106 use for GYP at all. We may revisit how this works once we encourage more
107 people to use GN full-time (i.e., we might take `gyp_chromium` out of
108 runhooks altogether).
109
110 ### Config per flag set or config per (os/arch/flag set)?
111
112 Currently, mb_config.pyl does not specify the host_os, target_os, host_cpu, or
113 target_cpu values for every config that Chromium runs on, it only specifies
114 them for when the values need to be explicitly set on the command line.
115
116 Instead, we have one config per unique combination of flags only.
117
118 In other words, rather than having `linux_rel_bot`, `win_rel_bot`, and
119 `mac_rel_bot`, we just have `rel_bot`.
120
121 This design allows us to determine easily all of the different sets
122 of flags that we need to support, but *not* which flags are used on which
123 host/target combinations.
124
125 It may be that we should really track the latter. Doing so is just a
126 config file change, however.
127
128 ### Non-goals
129
130 * MB is not intended to replace direct invocation of GN or GYP for
131 complicated build scenarios (aka ChromeOS), where multiple flags need
132 to be set to user-defined paths for specific toolchains (e.g., where
133 ChromeOS needs to specify specific board types and compilers).
134
135 * MB is not intended at this time to be something developers use frequently,
136 or to add a lot of features to. We hope to be able to get rid of it once
137 the GYP->GN migration is done, and so we should not add things for
138 developers that can't easily be added to GN itself.
139
140 * MB is not intended to replace the
141 [CR tool](https://code.google.com/p/chromium/wiki/CRUserManual). Not
142 only is it only intended to replace the gyp\_chromium part of `'gclient
143 runhooks'`, it is not really meant as a developer-facing tool.
144
145 ### Open issues
146
147 * Some common flags (goma\_dir being the obvious one) may need to be
148 specified via the user, and it's unclear how to integrate this with
149 the concept of build\_configs.
150
151 Right now, MB has hard-coded support for a few flags (i.e., you can
152 pass the --goma-dir flag, and it will know to expand "${goma\_dir}" in
153 the string before calling out to the tool. We may want to generalize
154 this to a common key/value approach (perhaps then meeting the
155 ChromeOS non-goal, above), or we may want to keep this very strictly
156 limited for simplicity.
OLDNEW
« no previous file with comments | « tools/mb/README.md ('k') | tools/mb/docs/user_guide.md » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698