blob: 40e9947e5faca1767062dba1f017cabe93d816f1 [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
Yaron Friedmane34271392022-04-29 16:45:5325[Chrome Eng Review](../ENG_REVIEW_OWNERS) approval. Please include the following information in an
26email to chrome-eng-review@google.com:
27* Motivation of your project
28* Design docs
29* Additional checkout size
30* Build time increase
31* Binary size increase on Android ([official](https://www.chromium.org/developers/gn-build-configuration) builds)
32* Binary size increase on Windows
33
34Googlers can access [go/chrome-eng-review](https://goto.google.com/chrome-eng-review) and review
Alex Mineer55764332022-02-25 18:05:1935existing topics in g/chrome-eng-review, and can also come to office hours to ask
36questions.
37
Yaron Friedmane34271392022-04-29 16:45:5338### A note on size constraints
39
40The size of Chromium derived executables can impact overall performance of those binaries as they
41need to run on a wide range of devices including those with extremely limited RAM. Additionally, we
42have experience from Windows of the binary size impacting successful patch rate of updates as well
43as constraints from the Android Ecosystem where APKs included in the system image have hard
44limits on their size due to allocation size of the system partition. For more details and
45guidelines on size increases see
46[//docs/speed/binary_size/binary_size_explainer.md](binary_size_explainer) and Googlers can
47additionally check [go/chrome-binary-size](go/chrome-binary-size)
Tim van der Lippe5870ac32019-10-18 11:46:5448
Dirk Pranke568e95c2018-11-01 23:41:5049## Get the code
zpeng8d6f584a2016-12-16 20:50:2850
Dirk Pranke568e95c2018-11-01 23:41:5051There are two common ways to depend on third-party code: you can reference a
Jason D. Clintonb21e99b2021-09-30 19:19:5852Git repo directly (via entries in the DEPS file) or you can check in a
53snapshot. The former is preferable in most cases:
54
551. If you are actively developing in the upstream repo, then having the DEPS
56 file include the upstream (that's been mirrored to GoB, see below) can be a
57 way to include those changes into Chromium at a particular revision. The
58 DEPS file will be updated to a new revision when you are ready to "roll" the
59 new version into Chromium. This also avoids duplicate copies of the code
60 showing up in multiple repos leading to contributor confusion.
611. This interacts favorably with our upstream tracking automation. We
62 automatically consume the upstream Git hashes and match them against a
63 database of known upstreams to tracking drift between Chromium and upstream
64 sources.
651. This makes adding deps that don't need local changes easier. E.g. some of
66 our automation automatically converts non-GN build rules into GN build rules
67 without any additional CLs.
68
69Checking in a snapshot is useful if this is effectively taking on maintenance
70of an unmaintained project (e.g. an ancient library that we're going to GN-ify
71that hasn't been updated in years). And, of course, if the code you need isn't
72in a Git repo, then you have to snapshot.
zpeng8d6f584a2016-12-16 20:50:2873
Tim van der Lippe5870ac32019-10-18 11:46:5474### Node packages
75
76To include a Node package, add the dependency to the
77[Node package.json](../third_party/node/package.json). Make sure to update
78the corresponding [`npm_exclude.txt`](../third_party/node/npm_exclude.txt)
79and [`npm_include.txt`](../third_party/node/npm_include.txt) to make the code
80available during checkout.
81
Dirk Pranke568e95c2018-11-01 23:41:5082### Pulling the code via DEPS
83
84If the code is in a Git repo that you want to mirror, please file an [infra git
85ticket](https://bugs.chromium.org/p/chromium/issues/entry?template=Infra-Git)
86to get the repo mirrored onto chromium.googlesource.com; we don't allow direct
87dependencies on non-Google-hosted repositories, so that we can still build
Jason D. Clintonb21e99b2021-09-30 19:19:5888if an external repository goes down.
Dirk Pranke568e95c2018-11-01 23:41:5089
90Once the mirror is set up, add an entry to [//DEPS](../DEPS) so that gclient
91will pull it in. If the code is only needed on some platforms, add a condition
92to the deps entry so that developers on other platforms don't pull in things
93they don't need.
94
95As for specifying the path where the library is fetched, a path like
96`//third_party/<project_name>/src` is highly recommended so that you can put
97the file like OWNERS or README.chromium at `//third_party/<project_name>`. If
98you have a wrong path in DEPS and want to change the path of the existing
99library in DEPS, please ask the infrastructure team before committing the
100change.
101
David Dorwin7fde299b2020-09-25 02:10:34102Lastly, add the new directory to Chromium's `//third_party/.gitignore`, so that
103it won't show up as untracked files when you run `git status` on the main
104repository.
Dirk Pranke568e95c2018-11-01 23:41:50105
106### Checking in the code directly
107
108If you are checking in a snapshot, please describe the source in the
109README.chromium file, described below. For security reasons, please retrieve
110the code as securely as you can, using HTTPS and GPG signatures if available.
111If retrieving a tarball, please do not check the tarball itself into the tree,
112but do list the source and the SHA-512 hash (for verification) in the
113README.chromium and Change List. The SHA-512 hash can be computed via
114`sha512sum` or `openssl dgst -sha512`. If retrieving from a git
115repository, please list the revision that the code was pulled from.
116
117If you are checking the files in directly, you do not need an entry in DEPS
David Dorwin7fde299b2020-09-25 02:10:34118and do not need to modify `//third_party/.gitignore`.
Dirk Pranke568e95c2018-11-01 23:41:50119
120### Checking in large files
121
122_Accessible to Googlers only. Non-Googlers can email one of the people in
123third_party/OWNERS for help.
124
125See [Moving large files to Google Storage](https://goto.google.com/checking-in-large-files)
126
127## Document the code's context
zpeng8d6f584a2016-12-16 20:50:28128
129### Add OWNERS
130
Forrest Fleming80f70212020-07-01 00:13:50131Your OWNERS file must either list two Chromium developer accounts as the first
132two lines or include a `file:` directive to an OWNERS file within the
133`third_party` directory that itself conforms to this criterion. This will ensure
zpeng8d6f584a2016-12-16 20:50:28134accountability for maintenance of the code over time. While there isn't always
135an ideal or obvious set of people that should go in OWNERS, this is critical for
136first-line triage of any issues that crop up in the code.
137
138As an OWNER, you're expected to:
139
140* Remove the dependency when/if it is no longer needed
141* Update the dependency when a security or stability bug is fixed upstream
142* Help ensure the Chrome feature that uses the dependency continues to use the
143 dependency in the best way, as the feature and the dependency change over
144 time.
145
146### Add a README.chromium
147
148You need a README.chromium file with information about the project from which
149you're re-using code. See
Dirk Pranke568e95c2018-11-01 23:41:50150[//third_party/README.chromium.template](../third_party/README.chromium.template)
zpeng8d6f584a2016-12-16 20:50:28151for a list of fields to include. A presubmit check will check this has the right
152format.
153
Dirk Pranke568e95c2018-11-01 23:41:50154README.chromium files contain a field indicating whether the package is
155security-critical or not. A package is security-critical if it is compiled
156into the product and does any of the following:
157
158* Accepts untrustworthy inputs from the internet
159* Parses or interprets complex input formats
160* Sends data to internet servers
161* Collects new data
162* Influences or sets security-related policy (including the user experience)
163
Adrian Taylor0a06ec32020-03-03 05:00:07164One of the fields is CPEPrefix. This is used by Chromium and Google systems to
165spot known upstream security vulnerabilities, and ensure we merge the fixes
166into our third-party copy. These systems are not foolproof, so as the OWNER,
167it's up to you to keep an eye out rather than solely relying on these
168automated systems. But, adding CPEs decreases the chances of us missing
169vulnerabilities, so they should always be added if possible.
170
171The CPE is a common format shared across the industry; you can look up the CPE
172for your package [here](https://nvd.nist.gov/products/cpe/search). Please use
173CPE format 2.2. When searching for a CPE, you may find that there is not yet
174a CPE for the specific upstream version you're using. This is normal, as CPEs
175are typically allocated only when a vulnerability is found. You should follow
176the version number convention such that, when that does occur in future, we'll
177be notified. If no CPE is available, please specify "unknown".
178
Adrian Taylor8e0d3fd2020-04-17 20:14:25179If you're using a patched or modified version which is halfway between two
180public versions, please "round downwards" to the lower of the public versions
181(it's better for us to be notified of false-positive vulnerabilities than
182false-negatives).
Adrian Taylor0a06ec32020-03-03 05:00:07183
zpeng8d6f584a2016-12-16 20:50:28184### Add a LICENSE file and run related checks
185
186You need a LICENSE file. Example:
Dirk Pranke568e95c2018-11-01 23:41:50187[//third_party/libjpeg/LICENSE](../third_party/libjpeg/LICENSE).
zpeng8d6f584a2016-12-16 20:50:28188
Dirk Pranke568e95c2018-11-01 23:41:50189Run `//tools/licenses.py scan`; this will complain about incomplete or missing
190data for third_party checkins. We use `licenses.py credits` to generate the
191about:credits page in Google Chrome builds.
zpeng8d6f584a2016-12-16 20:50:28192
193If the library will never be shipped as a part of Chrome (e.g. build-time tools,
194testing tools), make sure to set "License File" as "NOT_SHIPPED" so that the
Dirk Prankebf4136b2018-09-20 22:48:43195license is not included in about:credits page ([more on this below](#credits)).
zpeng8d6f584a2016-12-16 20:50:28196
Dirk Pranke568e95c2018-11-01 23:41:50197## Get a review
zpeng8d6f584a2016-12-16 20:50:28198
Aaron Gablefc8cdad2018-01-16 21:02:40199All third party additions and substantive changes like re-licensing need the
Dirk Pranke568e95c2018-11-01 23:41:50200following sign-offs. Some of these are accessible to Googlers only.
201Non-Googlers can email one of the people in
202[//third_party/OWNERS](../third_party/OWNERS) for help.
zpeng8d6f584a2016-12-16 20:50:28203
Tim van der Lippe8c7498392019-10-28 12:21:04204* Make sure you have the approval from Chrome Eng Review as mentioned
205 [above](#before-you-start).
Alex Rudenkof712a7f2022-02-23 17:55:36206* Get security@chromium.org (or chrome-security@google.com, Google-only)
207 approval. Email the list with relevant details and a link to the CL.
208 Third party code is a hot spot for security vulnerabilities.
Aaron Gablefc8cdad2018-01-16 21:02:40209 When adding a new package that could potentially carry security risk, make
210 sure to highlight risk to security@chromium.org. You may be asked to add
211 a README.security or, in dangerous cases, README.SECURITY.URGENTLY file.
Dirk Pranke6fb90c02018-10-17 02:02:20212* Add chromium-third-party@google.com as a reviewer on your change. This
Adam Langley88658b32018-11-20 22:12:47213 will trigger an automatic round-robin assignment to a reviewer who will check
214 licensing matters. These reviewers may not be able to +1 a change so look for
215 verbal approval in the comments. (This list does not receive or deliver
216 email, so only use it as a reviewer, not for other communication. Internally,
Dirk Prankef7432812020-06-10 22:38:20217 see [cl/221704656](https://cl/221704656) for details about how
218 this is configured.). If you have questions about the third-party process,
219 ask one of the [//third_party/OWNERS](../third_party/OWNERS) instead.
Adam Langley88658b32018-11-20 22:12:47220* Lastly, if all other steps are complete, get a positive code review from a
221 member of [//third_party/OWNERS](../third_party/OWNERS) to land the change.
zpeng8d6f584a2016-12-16 20:50:28222
Kentaro Haracd328342022-02-25 08:25:44223Please send separate emails to the eng review and security@chromium.org.
224You can skip the eng review and security@chromium.org when you are only moving
225existing directories in Chromium to //third_party/.
jochen893d5182017-01-31 22:01:49226
Dirk Pranke568e95c2018-11-01 23:41:50227Subsequent changes don't normally require third-party-owners or security
228approval; you can modify the code as much as you want. When you update code, be
229mindful of security-related mailing lists for the project and relevant CVE to
230update your package.
Dirk Prankebf4136b2018-09-20 22:48:43231
232## How we ensure that the right credits are displayed {#credits}
233
234As we said at the beginning, it is important that Chrome displays the
235right credit and attributions for all of the third_party code we use.
236
237To view this in chrome, you can open chrome://credits.
238
239That page displays a resource embedded in the browser as part of the
240[//components/resources/components_resources.grd](../components/resources/components_resource.grd)
241GRIT file; the actual HTML text is generated in the
242[//components/resources:about_credits](../components/resources/BUILD.gn)
243build target using a template from the output of the
244[//tools/licenses.py](../tools/licenses.py) script. Assuming you've followed
245the rules above to ensure that you have the proper LICENSE file and it passes
246the checks, it'll be included automatically.