blob: 06be7f995921770129f94c6545585dbcfcdab8d9 [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
24Chromium project, you should first obtain Chrome Eng Review approval.
25Googlers should see go/chrome-eng-review and review existing topics in
26g/chrome-eng-review. Please include information about the additional checkout
27size, build times, and binary sizes. Please also make sure that the motivation
28for your project is clear, e.g., a design doc has been circulated.
29
Dirk Pranke568e95c2018-11-01 23:41:5030## Get the code
zpeng8d6f584a2016-12-16 20:50:2831
Dirk Pranke568e95c2018-11-01 23:41:5032There are two common ways to depend on third-party code: you can reference a
33Git repo directly (via entries in the DEPS file), or you can check in a
34snapshot. The former is preferable if you are actively developing in it or need
35access to the history; the latter is better if you don't need the full history
36of the repo or don't need to pick up every single change. And, of course, if
37the code you need isn't in a Git repo, you have to do the latter.
zpeng8d6f584a2016-12-16 20:50:2838
Tim van der Lippe5870ac32019-10-18 11:46:5439### Node packages
40
41To include a Node package, add the dependency to the
42[Node package.json](../third_party/node/package.json). Make sure to update
43the corresponding [`npm_exclude.txt`](../third_party/node/npm_exclude.txt)
44and [`npm_include.txt`](../third_party/node/npm_include.txt) to make the code
45available during checkout.
46
Dirk Pranke568e95c2018-11-01 23:41:5047### Pulling the code via DEPS
48
49If the code is in a Git repo that you want to mirror, please file an [infra git
50ticket](https://bugs.chromium.org/p/chromium/issues/entry?template=Infra-Git)
51to get the repo mirrored onto chromium.googlesource.com; we don't allow direct
52dependencies on non-Google-hosted repositories, so that we can still build
53if an external repository goes down..
54
55Once the mirror is set up, add an entry to [//DEPS](../DEPS) so that gclient
56will pull it in. If the code is only needed on some platforms, add a condition
57to the deps entry so that developers on other platforms don't pull in things
58they don't need.
59
60As for specifying the path where the library is fetched, a path like
61`//third_party/<project_name>/src` is highly recommended so that you can put
62the file like OWNERS or README.chromium at `//third_party/<project_name>`. If
63you have a wrong path in DEPS and want to change the path of the existing
64library in DEPS, please ask the infrastructure team before committing the
65change.
66
67Lastly, add the new directory to Chromium's `//.gitignore`, so that it won't
68show up as untracked files when you run `git status` on the main repository.
69
70### Checking in the code directly
71
72If you are checking in a snapshot, please describe the source in the
73README.chromium file, described below. For security reasons, please retrieve
74the code as securely as you can, using HTTPS and GPG signatures if available.
75If retrieving a tarball, please do not check the tarball itself into the tree,
76but do list the source and the SHA-512 hash (for verification) in the
77README.chromium and Change List. The SHA-512 hash can be computed via
78`sha512sum` or `openssl dgst -sha512`. If retrieving from a git
79repository, please list the revision that the code was pulled from.
80
81If you are checking the files in directly, you do not need an entry in DEPS
82and do not need to modify `//.gitignore`.
83
84### Checking in large files
85
86_Accessible to Googlers only. Non-Googlers can email one of the people in
87third_party/OWNERS for help.
88
89See [Moving large files to Google Storage](https://goto.google.com/checking-in-large-files)
90
91## Document the code's context
zpeng8d6f584a2016-12-16 20:50:2892
93### Add OWNERS
94
95Your OWNERS file must include 2 Chromium developer accounts. This will ensure
96accountability for maintenance of the code over time. While there isn't always
97an ideal or obvious set of people that should go in OWNERS, this is critical for
98first-line triage of any issues that crop up in the code.
99
100As an OWNER, you're expected to:
101
102* Remove the dependency when/if it is no longer needed
103* Update the dependency when a security or stability bug is fixed upstream
104* Help ensure the Chrome feature that uses the dependency continues to use the
105 dependency in the best way, as the feature and the dependency change over
106 time.
107
108### Add a README.chromium
109
110You need a README.chromium file with information about the project from which
111you're re-using code. See
Dirk Pranke568e95c2018-11-01 23:41:50112[//third_party/README.chromium.template](../third_party/README.chromium.template)
zpeng8d6f584a2016-12-16 20:50:28113for a list of fields to include. A presubmit check will check this has the right
114format.
115
Dirk Pranke568e95c2018-11-01 23:41:50116README.chromium files contain a field indicating whether the package is
117security-critical or not. A package is security-critical if it is compiled
118into the product and does any of the following:
119
120* Accepts untrustworthy inputs from the internet
121* Parses or interprets complex input formats
122* Sends data to internet servers
123* Collects new data
124* Influences or sets security-related policy (including the user experience)
125
zpeng8d6f584a2016-12-16 20:50:28126### Add a LICENSE file and run related checks
127
128You need a LICENSE file. Example:
Dirk Pranke568e95c2018-11-01 23:41:50129[//third_party/libjpeg/LICENSE](../third_party/libjpeg/LICENSE).
zpeng8d6f584a2016-12-16 20:50:28130
Dirk Pranke568e95c2018-11-01 23:41:50131Run `//tools/licenses.py scan`; this will complain about incomplete or missing
132data for third_party checkins. We use `licenses.py credits` to generate the
133about:credits page in Google Chrome builds.
zpeng8d6f584a2016-12-16 20:50:28134
135If the library will never be shipped as a part of Chrome (e.g. build-time tools,
136testing tools), make sure to set "License File" as "NOT_SHIPPED" so that the
Dirk Prankebf4136b2018-09-20 22:48:43137license is not included in about:credits page ([more on this below](#credits)).
zpeng8d6f584a2016-12-16 20:50:28138
Dirk Pranke568e95c2018-11-01 23:41:50139## Get a review
zpeng8d6f584a2016-12-16 20:50:28140
Aaron Gablefc8cdad2018-01-16 21:02:40141All third party additions and substantive changes like re-licensing need the
Dirk Pranke568e95c2018-11-01 23:41:50142following sign-offs. Some of these are accessible to Googlers only.
143Non-Googlers can email one of the people in
144[//third_party/OWNERS](../third_party/OWNERS) for help.
zpeng8d6f584a2016-12-16 20:50:28145
Aaron Gablefc8cdad2018-01-16 21:02:40146* Get [email protected] approval. Email the list with relevant details and
147 a link to the CL. Third party code is a hot spot for security vulnerabilities.
148 When adding a new package that could potentially carry security risk, make
149 sure to highlight risk to [email protected]. You may be asked to add
150 a README.security or, in dangerous cases, README.SECURITY.URGENTLY file.
Dirk Pranke6fb90c02018-10-17 02:02:20151* Add [email protected] as a reviewer on your change. This
Adam Langley88658b32018-11-20 22:12:47152 will trigger an automatic round-robin assignment to a reviewer who will check
153 licensing matters. These reviewers may not be able to +1 a change so look for
154 verbal approval in the comments. (This list does not receive or deliver
155 email, so only use it as a reviewer, not for other communication. Internally,
156 see cl/221704656 for details about how this is configured.)
157* Lastly, if all other steps are complete, get a positive code review from a
158 member of [//third_party/OWNERS](../third_party/OWNERS) to land the change.
zpeng8d6f584a2016-12-16 20:50:28159
Dirk Pranke6fb90c02018-10-17 02:02:20160Please send separate emails to the eng review and security lists.
jochen893d5182017-01-31 22:01:49161
Dirk Pranke568e95c2018-11-01 23:41:50162Subsequent changes don't normally require third-party-owners or security
163approval; you can modify the code as much as you want. When you update code, be
164mindful of security-related mailing lists for the project and relevant CVE to
165update your package.
Dirk Prankebf4136b2018-09-20 22:48:43166
167## How we ensure that the right credits are displayed {#credits}
168
169As we said at the beginning, it is important that Chrome displays the
170right credit and attributions for all of the third_party code we use.
171
172To view this in chrome, you can open chrome://credits.
173
174That page displays a resource embedded in the browser as part of the
175[//components/resources/components_resources.grd](../components/resources/components_resource.grd)
176GRIT file; the actual HTML text is generated in the
177[//components/resources:about_credits](../components/resources/BUILD.gn)
178build target using a template from the output of the
179[//tools/licenses.py](../tools/licenses.py) script. Assuming you've followed
180the rules above to ensure that you have the proper LICENSE file and it passes
181the checks, it'll be included automatically.