blob: 02e574505b1ee306c39f180a4691280abf2d337a [file] [log] [blame] [view]
zpeng8d6f584a2016-12-16 20:50:281# Adding third_party Libraries
2
3[TOC]
4
5Using third party code can save time and is consistent with our values - no need
6to reinvent the wheel! We put all code that isn't written by Chromium developers
Dirk Pranke568e95c2018-11-01 23:41:507into `//third_party` (even if you end up modifying just a few functions). We do
zpeng8d6f584a2016-12-16 20:50:288this to make it easy to track license compliance, security patches, and supply
9the right credit and attributions. It also makes it a lot easier for other
10projects that embed our code to track what is Chromium licensed and what is
11covered by other licenses.
12
Dirk Pranke568e95c2018-11-01 23:41:5013## Put the code in //third_party
zpeng8d6f584a2016-12-16 20:50:2814
Dirk Pranke568e95c2018-11-01 23:41:5015By default, all code should be checked into [//third_party](../third_party/),
16for the reasons given above. Other locations are only appropriate in a few
17situations and need explicit approval; don't assume that because there's some
18other directory with third_party in the name it's okay to put new things
19there.
zpeng8d6f584a2016-12-16 20:50:2820
Tim van der Lippe5870ac32019-10-18 11:46:5421## Before you start
22
23To make sure the inclusion of a new third_party project makes sense for the
Alex Mineer55764332022-02-25 18:05:1924Chromium project, you should first obtain
John Abd-El-Malek704bca02022-12-14 18:47:5925[Chrome ATL](../ATL_OWNERS) approval. Please include the following information in an
John Abd-El-Malekf44dc07b2023-02-07 02:39:1126email to chrome-atls-discuss@google.com:
Yaron Friedmane34271392022-04-29 16:45:5327* Motivation of your project
28* Design docs
29* Additional checkout size
John Abd-El-Malekdde7f232022-12-14 23:41:5030 * If the increase is significant (e.g., 20+ MB), can we consider limiting the
31 files to be checked in?
Yaron Friedmane34271392022-04-29 16:45:5332* Build time increase
John Abd-El-Malekdde7f232022-12-14 23:41:5033 * If the increase is significant (e.g., 30+ seconds), can we consider making
34 this an optional build target?
35* Binary size increase on Android ([official](https://www.chromium.org/developers/gn-build-configuration) builds)
36 * Any 16 KB increase on Android is flagged on the build bots and
37 justification is needed.
Yaron Friedmane34271392022-04-29 16:45:5338* Binary size increase on Windows
John Abd-El-Malekdde7f232022-12-14 23:41:5039* Is this library maintained on all platforms that we will use it on?
40 * If not, will the Chrome org be expected to maintain this for some or all
41 platforms?
42* Does it have any performance / memory implications (esp. on Android)? Was the
43library designed with intended use on Android?
44* Do we really need the library? Is there any alternative such as an existing
45library already in Chromium? If introducing a library with similar functionality
46as existing, will it be easy for another developer to understand which should be
47used where? Will you commit to consolidating uses in Chromium and remove the
48alternative libraries?
49* For desktop (Win/Mac/Linux/ChromeOS), does the dependency introduce closed
50source components (e.g., binaries, WASM binaries, obfuscated code)? If yes,
51please reach out to Chrome ATLs.
52
Yaron Friedmane34271392022-04-29 16:45:5353
John Abd-El-Malek704bca02022-12-14 18:47:5954Googlers can access [go/chrome-atls](https://goto.google.com/chrome-atls) and review
55existing topics in g/chrome-atls, and can also come to office hours to ask
Alex Mineer55764332022-02-25 18:05:1956questions.
57
Scott Violet50a02e42022-11-29 20:02:3458### Rust
59
60Rust is allowed for third-party libraries as long as there is a business need,
61which includes the following:
62
63* The Rust implementation is the best (e.g., speed, memory, lack of bugs) or
64only existing implementation available for the third-party library.
65* The Rust implementation allows the operation to move to a higher privileged
66process, and this benefits the product by improving on guardrail metrics (e.g.
67through avoiding process startup, IPC overheads, or C++ memory-unsafety
68mitigations).
69* The Rust implementation can meaningfully reduce our expected risk of
70(memory/crashes/undefined behavior) bugs, when compared to the existing
71third-party library and related C++ code required to use the library. We realize
72assessing risk is quite complex and very nuanced. If this is the criteria by
John Abd-El-Malekf44dc07b2023-02-07 02:39:1173which the third-party library is being added, chrome-atls-discuss@google.com and
Scott Violet50a02e42022-11-29 20:02:3474chrome-rust@google.com may ask for more data.
75
76Support for third-party libraries written in Rust is in active development. If
77the library you wish to add is in Rust, reach out to chrome-rust@google.com
78first.
79
Yaron Friedmane34271392022-04-29 16:45:5380### A note on size constraints
81
82The size of Chromium derived executables can impact overall performance of those binaries as they
83need to run on a wide range of devices including those with extremely limited RAM. Additionally, we
84have experience from Windows of the binary size impacting successful patch rate of updates as well
85as constraints from the Android Ecosystem where APKs included in the system image have hard
86limits on their size due to allocation size of the system partition. For more details and
87guidelines on size increases see
Michael Cui5d517752022-11-01 14:11:3288[//docs/speed/binary_size/binary_size_explainer.md](speed/binary_size/binary_size_explainer.md) and Googlers can
89additionally check [go/chrome-binary-size](https://goto.google.com/chrome-binary-size)
Tim van der Lippe5870ac32019-10-18 11:46:5490
Dirk Pranke568e95c2018-11-01 23:41:5091## Get the code
zpeng8d6f584a2016-12-16 20:50:2892
Dirk Pranke568e95c2018-11-01 23:41:5093There are two common ways to depend on third-party code: you can reference a
Jason D. Clintonb21e99b2021-09-30 19:19:5894Git repo directly (via entries in the DEPS file) or you can check in a
95snapshot. The former is preferable in most cases:
96
971. If you are actively developing in the upstream repo, then having the DEPS
98 file include the upstream (that's been mirrored to GoB, see below) can be a
99 way to include those changes into Chromium at a particular revision. The
100 DEPS file will be updated to a new revision when you are ready to "roll" the
101 new version into Chromium. This also avoids duplicate copies of the code
102 showing up in multiple repos leading to contributor confusion.
1031. This interacts favorably with our upstream tracking automation. We
104 automatically consume the upstream Git hashes and match them against a
105 database of known upstreams to tracking drift between Chromium and upstream
106 sources.
1071. This makes adding deps that don't need local changes easier. E.g. some of
108 our automation automatically converts non-GN build rules into GN build rules
109 without any additional CLs.
110
111Checking in a snapshot is useful if this is effectively taking on maintenance
112of an unmaintained project (e.g. an ancient library that we're going to GN-ify
113that hasn't been updated in years). And, of course, if the code you need isn't
114in a Git repo, then you have to snapshot.
zpeng8d6f584a2016-12-16 20:50:28115
Tim van der Lippe5870ac32019-10-18 11:46:54116### Node packages
117
118To include a Node package, add the dependency to the
119[Node package.json](../third_party/node/package.json). Make sure to update
120the corresponding [`npm_exclude.txt`](../third_party/node/npm_exclude.txt)
121and [`npm_include.txt`](../third_party/node/npm_include.txt) to make the code
122available during checkout.
123
Dirk Pranke568e95c2018-11-01 23:41:50124### Pulling the code via DEPS
125
126If the code is in a Git repo that you want to mirror, please file an [infra git
127ticket](https://bugs.chromium.org/p/chromium/issues/entry?template=Infra-Git)
128to get the repo mirrored onto chromium.googlesource.com; we don't allow direct
129dependencies on non-Google-hosted repositories, so that we can still build
Jason D. Clintonb21e99b2021-09-30 19:19:58130if an external repository goes down.
Dirk Pranke568e95c2018-11-01 23:41:50131
132Once the mirror is set up, add an entry to [//DEPS](../DEPS) so that gclient
133will pull it in. If the code is only needed on some platforms, add a condition
134to the deps entry so that developers on other platforms don't pull in things
135they don't need.
136
137As for specifying the path where the library is fetched, a path like
138`//third_party/<project_name>/src` is highly recommended so that you can put
139the file like OWNERS or README.chromium at `//third_party/<project_name>`. If
140you have a wrong path in DEPS and want to change the path of the existing
141library in DEPS, please ask the infrastructure team before committing the
142change.
143
David Dorwin7fde299b2020-09-25 02:10:34144Lastly, add the new directory to Chromium's `//third_party/.gitignore`, so that
145it won't show up as untracked files when you run `git status` on the main
146repository.
Dirk Pranke568e95c2018-11-01 23:41:50147
148### Checking in the code directly
149
150If you are checking in a snapshot, please describe the source in the
151README.chromium file, described below. For security reasons, please retrieve
152the code as securely as you can, using HTTPS and GPG signatures if available.
153If retrieving a tarball, please do not check the tarball itself into the tree,
154but do list the source and the SHA-512 hash (for verification) in the
155README.chromium and Change List. The SHA-512 hash can be computed via
156`sha512sum` or `openssl dgst -sha512`. If retrieving from a git
157repository, please list the revision that the code was pulled from.
158
159If you are checking the files in directly, you do not need an entry in DEPS
David Dorwin7fde299b2020-09-25 02:10:34160and do not need to modify `//third_party/.gitignore`.
Dirk Pranke568e95c2018-11-01 23:41:50161
162### Checking in large files
163
164_Accessible to Googlers only. Non-Googlers can email one of the people in
165third_party/OWNERS for help.
166
167See [Moving large files to Google Storage](https://goto.google.com/checking-in-large-files)
168
169## Document the code's context
zpeng8d6f584a2016-12-16 20:50:28170
171### Add OWNERS
172
Forrest Fleming80f70212020-07-01 00:13:50173Your OWNERS file must either list two Chromium developer accounts as the first
174two lines or include a `file:` directive to an OWNERS file within the
175`third_party` directory that itself conforms to this criterion. This will ensure
zpeng8d6f584a2016-12-16 20:50:28176accountability for maintenance of the code over time. While there isn't always
177an ideal or obvious set of people that should go in OWNERS, this is critical for
178first-line triage of any issues that crop up in the code.
179
180As an OWNER, you're expected to:
181
182* Remove the dependency when/if it is no longer needed
183* Update the dependency when a security or stability bug is fixed upstream
184* Help ensure the Chrome feature that uses the dependency continues to use the
185 dependency in the best way, as the feature and the dependency change over
186 time.
187
188### Add a README.chromium
189
190You need a README.chromium file with information about the project from which
191you're re-using code. See
Dirk Pranke568e95c2018-11-01 23:41:50192[//third_party/README.chromium.template](../third_party/README.chromium.template)
zpeng8d6f584a2016-12-16 20:50:28193for a list of fields to include. A presubmit check will check this has the right
194format.
195
Dirk Pranke568e95c2018-11-01 23:41:50196README.chromium files contain a field indicating whether the package is
197security-critical or not. A package is security-critical if it is compiled
198into the product and does any of the following:
199
200* Accepts untrustworthy inputs from the internet
201* Parses or interprets complex input formats
202* Sends data to internet servers
203* Collects new data
204* Influences or sets security-related policy (including the user experience)
205
Adrian Taylor0a06ec32020-03-03 05:00:07206One of the fields is CPEPrefix. This is used by Chromium and Google systems to
207spot known upstream security vulnerabilities, and ensure we merge the fixes
208into our third-party copy. These systems are not foolproof, so as the OWNER,
209it's up to you to keep an eye out rather than solely relying on these
210automated systems. But, adding CPEs decreases the chances of us missing
211vulnerabilities, so they should always be added if possible.
212
213The CPE is a common format shared across the industry; you can look up the CPE
214for your package [here](https://nvd.nist.gov/products/cpe/search). Please use
215CPE format 2.2. When searching for a CPE, you may find that there is not yet
216a CPE for the specific upstream version you're using. This is normal, as CPEs
217are typically allocated only when a vulnerability is found. You should follow
218the version number convention such that, when that does occur in future, we'll
219be notified. If no CPE is available, please specify "unknown".
220
Adrian Taylor8e0d3fd2020-04-17 20:14:25221If you're using a patched or modified version which is halfway between two
222public versions, please "round downwards" to the lower of the public versions
223(it's better for us to be notified of false-positive vulnerabilities than
224false-negatives).
Adrian Taylor0a06ec32020-03-03 05:00:07225
zpeng8d6f584a2016-12-16 20:50:28226### Add a LICENSE file and run related checks
227
228You need a LICENSE file. Example:
Dirk Pranke568e95c2018-11-01 23:41:50229[//third_party/libjpeg/LICENSE](../third_party/libjpeg/LICENSE).
zpeng8d6f584a2016-12-16 20:50:28230
Andrew Mellen2be00b92022-11-11 16:38:42231Run `//tools/licenses/licenses.py scan`; this will complain about incomplete or missing
Dirk Pranke568e95c2018-11-01 23:41:50232data for third_party checkins. We use `licenses.py credits` to generate the
233about:credits page in Google Chrome builds.
zpeng8d6f584a2016-12-16 20:50:28234
235If the library will never be shipped as a part of Chrome (e.g. build-time tools,
236testing tools), make sure to set "License File" as "NOT_SHIPPED" so that the
Dirk Prankebf4136b2018-09-20 22:48:43237license is not included in about:credits page ([more on this below](#credits)).
zpeng8d6f584a2016-12-16 20:50:28238
Dirk Pranke568e95c2018-11-01 23:41:50239## Get a review
zpeng8d6f584a2016-12-16 20:50:28240
Aaron Gablefc8cdad2018-01-16 21:02:40241All third party additions and substantive changes like re-licensing need the
Dirk Pranke568e95c2018-11-01 23:41:50242following sign-offs. Some of these are accessible to Googlers only.
243Non-Googlers can email one of the people in
244[//third_party/OWNERS](../third_party/OWNERS) for help.
zpeng8d6f584a2016-12-16 20:50:28245
John Abd-El-Malek704bca02022-12-14 18:47:59246* Make sure you have the approval from Chrome ATLs as mentioned
Tim van der Lippe8c7498392019-10-28 12:21:04247 [above](#before-you-start).
Alex Rudenkof712a7f2022-02-23 17:55:36248* Get security@chromium.org (or chrome-security@google.com, Google-only)
249 approval. Email the list with relevant details and a link to the CL.
250 Third party code is a hot spot for security vulnerabilities.
Aaron Gablefc8cdad2018-01-16 21:02:40251 When adding a new package that could potentially carry security risk, make
252 sure to highlight risk to security@chromium.org. You may be asked to add
253 a README.security or, in dangerous cases, README.SECURITY.URGENTLY file.
Dirk Pranke6fb90c02018-10-17 02:02:20254* Add chromium-third-party@google.com as a reviewer on your change. This
Adam Langley88658b32018-11-20 22:12:47255 will trigger an automatic round-robin assignment to a reviewer who will check
256 licensing matters. These reviewers may not be able to +1 a change so look for
257 verbal approval in the comments. (This list does not receive or deliver
258 email, so only use it as a reviewer, not for other communication. Internally,
Michael Cui5d517752022-11-01 14:11:32259 see [cl/221704656](http://cl/221704656) for details about how
Dirk Prankef7432812020-06-10 22:38:20260 this is configured.). If you have questions about the third-party process,
261 ask one of the [//third_party/OWNERS](../third_party/OWNERS) instead.
Adam Langley88658b32018-11-20 22:12:47262* Lastly, if all other steps are complete, get a positive code review from a
263 member of [//third_party/OWNERS](../third_party/OWNERS) to land the change.
zpeng8d6f584a2016-12-16 20:50:28264
John Abd-El-Malek704bca02022-12-14 18:47:59265Please send separate emails to the ATLs and security@chromium.org.
266You can skip the ATL review and security@chromium.org when you are only moving
Kentaro Haracd328342022-02-25 08:25:44267existing directories in Chromium to //third_party/.
jochen893d5182017-01-31 22:01:49268
Dirk Pranke568e95c2018-11-01 23:41:50269Subsequent changes don't normally require third-party-owners or security
270approval; you can modify the code as much as you want. When you update code, be
271mindful of security-related mailing lists for the project and relevant CVE to
272update your package.
Dirk Prankebf4136b2018-09-20 22:48:43273
274## How we ensure that the right credits are displayed {#credits}
275
276As we said at the beginning, it is important that Chrome displays the
277right credit and attributions for all of the third_party code we use.
278
279To view this in chrome, you can open chrome://credits.
280
281That page displays a resource embedded in the browser as part of the
282[//components/resources/components_resources.grd](../components/resources/components_resource.grd)
283GRIT file; the actual HTML text is generated in the
284[//components/resources:about_credits](../components/resources/BUILD.gn)
285build target using a template from the output of the
Andrew Mellen2be00b92022-11-11 16:38:42286[//tools/licenses/licenses.py](../tools/licenses/licenses.py) script. Assuming you've followed
Dirk Prankebf4136b2018-09-20 22:48:43287the rules above to ensure that you have the proper LICENSE file and it passes
288the checks, it'll be included automatically.