blob: d7ed64a6b37e1fe3408e1230f2eb67dd51348ba1 [file] [log] [blame] [view]
andybons3322f762015-08-24 21:37:091# Updating clang
2
Nico Weber4071eca2018-09-25 12:29:143We distribute prebuilt packages of LLVM binaries, including clang and lld, that
4all developers and bots pull at `gclient runhooks` time. These binaries are
5just regular LLVM binaries built at a fixed upstream revision. This document
6describes how to build a package at a newer revision and update Chromium to it.
7An archive of all packages built so far is at https://is.gd/chromeclang
8
Nico Weberf218afd2018-09-20 19:11:2191. Check that https://ci.chromium.org/p/chromium/g/chromium.clang/console
10 looks reasonably green.
nodir06cbaa02015-08-25 17:15:24111. Sync your Chromium tree to the latest revision to pick up any plugin
rnk61e1abc62016-05-04 16:50:2112 changes
pccc9228e42017-06-16 10:36:53131. Run `python tools/clang/scripts/upload_revision.py NNNN`
hansc3a66162017-05-12 16:27:0714 with the target LLVM SVN revision number. This creates a roll CL on a new
15 branch, uploads it and starts tryjobs that build the compiler binaries into
16 a staging bucket on Google Cloud Storage (GCS).
171. If the clang upload try bots succeed, copy the binaries from the staging
18 bucket to the production one. For example:
19
ingloriond277c61f2017-09-15 23:08:0620 ```shell
21 $ export rev=123456-1
22 $ for x in Linux_x64 Mac Win ; do \
23 gsutil.py cp -n -a public-read gs://chromium-browser-clang-staging/$x/clang-$rev.tgz \
24 gs://chromium-browser-clang/$x/clang-$rev.tgz ; \
25 gsutil.py cp -n -a public-read gs://chromium-browser-clang-staging/$x/llvmobjdump-$rev.tgz \
26 gs://chromium-browser-clang/$x/llvmobjdump-$rev.tgz ; \
Mitch Phillipscab458302017-11-20 21:44:3627 gsutil.py cp -n -a public-read gs://chromium-browser-clang-staging/$x/llvmcfiverify-$rev.tgz \
28 gs://chromium-browser-clang/$x/llvmcfiverify-$rev.tgz ; \
Vlad Tsyrklevicheeab6d72018-08-08 21:06:0229 gsutil.py cp -n -a public-read gs://chromium-browser-clang-staging/$x/safestack-$rev.tgz \
30 gs://chromium-browser-clang/$x/safestack-$rev.tgz ; \
ingloriond277c61f2017-09-15 23:08:0631 gsutil.py cp -n -a public-read gs://chromium-browser-clang-staging/$x/translation_unit-$rev.tgz \
32 gs://chromium-browser-clang/$x/translation_unit-$rev.tgz ; \
33 gsutil.py cp -n -a public-read gs://chromium-browser-clang-staging/$x/llvm-code-coverage-$rev.tgz \
34 gs://chromium-browser-clang/$x/llvm-code-coverage-$rev.tgz ; \
35 done
Fabrice de Gans-Riberi0f2885832018-08-31 17:55:2536 $ for x in Linux_x64 Mac ; do \
37 gsutil.py cp -n -a public-read gs://chromium-browser-clang-staging/$x/llvmstrip-$rev.tgz \
38 gs://chromium-browser-clang/$x/llvmstrip-$rev.tgz ; \
39 done
Nico Weber251622582017-10-09 18:00:5140 $ gsutil.py cp -n -a public-read gs://chromium-browser-clang-staging/Mac/lld-$rev.tgz \
Hans Wennborge583b5e2017-10-11 02:40:5541 gs://chromium-browser-clang/Mac/lld-$rev.tgz
ingloriond277c61f2017-09-15 23:08:0642 ```
Hans Wennborge583b5e2017-10-11 02:40:5543
hansc3a66162017-05-12 16:27:07441. Run the goma package update script to push these packages to goma. If you do
45 not have the necessary credentials to do the upload, ask clang@chromium.org
46 to find someone who does
thakis3447dcd2016-05-05 18:17:15471. Run an exhaustive set of try jobs to test the new compiler:
ingloriond277c61f2017-09-15 23:08:0648
49 ```shell
Nico Weberb8603fb2018-05-21 15:42:1050 git cl try &&
Nico Weberb8603fb2018-05-21 15:42:1051 git cl try -m tryserver.blink -b linux_trusty_blink_rel &&
Eric Foo11fc8a172018-08-31 23:14:3352 git cl try -B luci.chromium.try -b ios-device -b mac_chromium_asan_rel_ng \
Nico Weberf218afd2018-09-20 19:11:2153 -b linux_chromium_cfi_rel_ng \
inglorion475c6e192018-06-22 20:42:2554 -b linux_chromium_chromeos_asan_rel_ng -b linux_chromium_msan_rel_ng \
Hans Wennborga8d99632018-10-01 11:37:3755 -b linux_chromium_chromeos_msan_rel_ng -b linux-chromeos-dbg \
56 -b win-asan
ingloriond277c61f2017-09-15 23:08:0657 ```
58
Hans Wennborgad4e8842018-08-01 09:25:13591. Optional: Start Pinpoint perf tryjobs. These are generally too noisy to
60 catch minor regressions pre-commit, but make sure there are no large
61 regressions.
Hans Wennborg62e06b212018-06-18 14:44:4262
63 a. (Log in to store OAuth2 token in the depot_tools cache. Only needs to be
64 run once:)
65
Hans Wennborg62e06b212018-06-18 14:44:4266 $ PYTHONPATH=$(dirname $(which git-cl)) python -c"import auth;auth.OAUTH_CLIENT_ID='62121018386-h08uiaftreu4dr3c4alh3l7mogskvb7i.apps.googleusercontent.com';auth.OAUTH_CLIENT_SECRET='vc1fZfV1cZC6mgDSHV-KSPOz';print auth.get_authenticator_for_host('pinpoint',auth.make_auth_config()).login()"
Hans Wennborg62e06b212018-06-18 14:44:4267
Hans Wennborg40d03572018-10-09 12:16:5168 b. Generate a fresh Oauth2 token:
Hans Wennborg62e06b212018-06-18 14:44:4269
Hans Wennborg62e06b212018-06-18 14:44:4270 $ TOKEN=$(PYTHONPATH=$(dirname $(which git-cl)) python -c"import auth;print auth.get_authenticator_for_host('pinpoint',auth.make_auth_config()).get_access_token().token")
Hans Wennborg62e06b212018-06-18 14:44:4271
Hans Wennborg07b9d9e2018-10-09 09:34:3072 c. Launch Pinpoint job:
Hans Wennborg62e06b212018-06-18 14:44:4273
Hans Wennborg62e06b212018-06-18 14:44:4274 $ curl -H"Authorization: Bearer $TOKEN" -F configuration=chromium-rel-win7-gpu-nvidia \
Hans Wennborg07b9d9e2018-10-09 09:34:3075 -F target=performance_test_suite -F benchmark=speedometer2 \
Hans Wennborg62e06b212018-06-18 14:44:4276 -F patch=https://chromium-review.googlesource.com/c/chromium/src/+/$(git cl issue | cut -d' ' -f3) \
77 -F start_git_hash=HEAD -F end_git_hash=HEAD https://pinpoint-dot-chromeperf.appspot.com/api/new
Hans Wennborg62e06b212018-06-18 14:44:4278
Hans Wennborg07b9d9e2018-10-09 09:34:3079 d. Use the URL returned by the command above to see the progress and result
Hans Wennborg62e06b212018-06-18 14:44:4280 of the tryjob, checking that it doesn't regress significantly (> 10%).
81 Post the URL to the codereview.
82
nodir06cbaa02015-08-25 17:15:24831. Commit roll CL from the first step
841. The bots will now pull the prebuilt binary, and goma will have a matching
85 binary, too.
Nico Weber4071eca2018-09-25 12:29:1486
87## Adding files to the clang package
88
89The clang package is downloaded unconditionally by all bots and devs. It's
90called "clang" for historical reasons, but nowadays also contains other
91mission-critical toolchain pieces besides clang.
92
93We try to limit the contents of the clang package. They should meet these
94criteria:
95
96- things that are used by most developers use most of the time (e.g. a
97 compiler, a linker, sanitizer runtimes)
98- things needed for doing official builds
99
100If you want to add something to the clang package that doesn't (yet?) meet
101these criteria, you can make package.py upload it to a separate zip file
102and then download it on an opt-in basis by requiring users to run a script
103to download the additional zip file. You can structure your script in a way that
104it downloads your additional zip automatically if the script detects an
105old version on disk, that way users have to run the download script just
106once. `tools/clang/scripts/download_lld_mac.py` is an example for this
107(It doesn't do the "only download if old version is on disk or if requested"
108bit, and hence doesn't run as a default DEPS hook. TODO(thakis): Make
109coverage stuff a better example and link to that.)
110
111If you're adding a new feature that you expect will meet the inclusion criteria
112eventually but doesn't yet, start by having your things in a separate zip
113and move it to the main zip once the criteria are met.