blob: 63cef1741ffd4fb962c8a96df3c28a590a7394cf [file] [log] [blame] [view]
nodir06cbaa02015-08-25 17:15:241# Updating Clang format binaries
andybons3322f762015-08-24 21:37:092
nodir06cbaa02015-08-25 17:15:243Instructions on how to update the [clang-format binaries](clang_format.md) that
4come with a checkout of Chromium.
andybons3322f762015-08-24 21:37:095
nodir06cbaa02015-08-25 17:15:246## Prerequisites
andybons3322f762015-08-24 21:37:097
Arthur Eubanks32c470c2022-03-22 00:22:428You'll also need permissions to upload to the appropriate google storage
9bucket. Chromium infrastructure team members have this, and others can be
10granted the permission based on need. If you need this permission, mention this
11in the tracking bug.
andybons3322f762015-08-24 21:37:0912
Arthur Eubanks32c470c2022-03-22 00:22:4213## Fetch and upload prebuilt clang-format binaries from recent clang rolls
andybons3322f762015-08-24 21:37:0914
Arthur Eubanks32c470c2022-03-22 00:22:4215Recent clang rolls can be found via looking at the history of
16[update.py](https://crsrc.org/c/tools/clang/scripts/update.py). You can also
17use clang-format packages built in recent successful dry run attempts at
18updating clang as mentioned [here](clang_sheriffing.md).
andybons3322f762015-08-24 21:37:0919
Arthur Eubanks32c470c2022-03-22 00:22:4220The following will, for each supported host architecture,
nodir06cbaa02015-08-25 17:15:2421
Arthur Eubanks32c470c2022-03-22 00:22:4222* Fetch the corresponding clang-format package from the specified clang roll
23* Extract and copy the clang-format binary to the proper directory
24* Upload the binary into a publicly accessible google storage bucket, also
Stephanie Kim29ae31652024-05-09 17:57:3925 updating the deps entries in DEPS files in the local checkout of Chrome
nodir06cbaa02015-08-25 17:15:2426
27```shell
Arthur Eubanks32c470c2022-03-22 00:22:4228cd $SRC/chromium/src
andybons3322f762015-08-24 21:37:0929
Arthur Eubanks32c470c2022-03-22 00:22:4230GS_PATH=gs://chromium-browser-clang-staging
31CLANG_REV=llvmorg-15-init-234-g567890abc-2
32
33echo Linux
Alan Zhaoc98914a2025-02-04 20:26:1634gsutil cp $GS_PATH/Linux_x64/clang-format-$CLANG_REV.tar.xz /tmp
Arthur Eubanks32c470c2022-03-22 00:22:4235tar xf /tmp/clang-format-$CLANG_REV.tgz -C buildtools/linux64 --strip-component=1 bin/clang-format
36
37echo Win
Alan Zhaoc98914a2025-02-04 20:26:1638gsutil cp $GS_PATH/Win/clang-format-$CLANG_REV.tar.xz /tmp
Arthur Eubanks32c470c2022-03-22 00:22:4239tar xf /tmp/clang-format-$CLANG_REV.tgz -C buildtools/win --strip-component=1 bin/clang-format.exe
40
41echo 'Mac x64'
Alan Zhaoc98914a2025-02-04 20:26:1642gsutil cp $GS_PATH/Mac/clang-format-$CLANG_REV.tar.xz /tmp
Arthur Eubanks32c470c2022-03-22 00:22:4243tar xf /tmp/clang-format-$CLANG_REV.tgz -C buildtools/mac --strip-component=1 bin/clang-format
44mv buildtools/mac/clang-format buildtools/mac/clang-format.x64
45
46echo 'Mac arm64'
47gsutil cp $GS_PATH/Mac_arm64/clang-format-$CLANG_REV.tgz /tmp
48tar xf /tmp/clang-format-$CLANG_REV.tgz -C buildtools/mac --strip-component=1 bin/clang-format
49mv buildtools/mac/clang-format buildtools/mac/clang-format.arm64
50
Stephanie Kim29ae31652024-05-09 17:57:3951# TODO(crbug.com/339490714): Remove sha1 file creation once all downstream repos that
52# use clang-format are migrated over to recursedeps into buildtools.
53echo '(Legacy) Uploading to GCS and creating sha1 files'
Arthur Eubanks32c470c2022-03-22 00:22:4254upload_to_google_storage.py --bucket=chromium-clang-format buildtools/linux64/clang-format
55upload_to_google_storage.py --bucket=chromium-clang-format buildtools/win/clang-format.exe
56upload_to_google_storage.py --bucket=chromium-clang-format buildtools/mac/clang-format.x64
57upload_to_google_storage.py --bucket=chromium-clang-format buildtools/mac/clang-format.arm64
58
Stephanie Kim29ae31652024-05-09 17:57:3959echo 'Uploading to GCS and updating DEPS files'
60# helper function to set deps entries in DEPS file using `gclient setdep`
61# first argument relative DEPS path.
62# second argument object_info
63function set_deps {
64 gclient setdep -r src/buildtools/$1@$2
65 gclient setdep -r $1@$2 --deps-file=buildtools/DEPS
66}
67# helper function to upload content to GCS and set DEPS
68# first argument: google storage path
69# second argument: relative DEPS path
70# This function parses out the object info outputted by upload_to_google_storage_first_class.py
71# and formats it into a format that gclient setdep understands
72function upload_and_set {
73 object_info=$(upload_to_google_storage_first_class.py --bucket=chromium-clang-format $1 | jq -r .path.objects[0][] | sed -z 's/\n/,/g;s/,$/\n/')',clang-format'
74 if [[ $2 == 'win/format' ]]; then
75 object_info+='.exe'
76 fi;
77 set_deps $2 $object_info
78}
79
Josip Sokceviccc85a772024-06-04 23:07:3480upload_and_set buildtools/linux64/clang-format linux64-format
81upload_and_set buildtools/win/clang-format.exe win-format
82upload_and_set buildtools/mac/clang-format.x64 mac-format
83upload_and_set buildtools/mac/clang-format.arm64 mac_arm64-format
Stephanie Kim29ae31652024-05-09 17:57:3984
Arthur Eubanks32c470c2022-03-22 00:22:4285# Clean up
86rm /tmp/clang-format-$CLANG_REV.tgz
87# These aren't in .gitignore because these mac per-arch paths only exist when updating clang-format.
88# gclient runhooks puts these binaries at buildtools/mac/clang-format.
89rm buildtools/mac/clang-format.x64 buildtools/mac/clang-format.arm64
andybons3322f762015-08-24 21:37:0990```
91
Arthur Eubanks3e6143752022-04-19 19:48:2892## Check that the new clang-format works as expected
93
94Compare the diffs created by running the old and new clang-format versions to
95see if the new version does anything unexpected. Running them on some
96substantial directory like `third_party/blink` or `base` should be sufficient.
97Upload the diffs as two patchsets in a CL for easy inspection of the
98clang-format differences by choosing patchset 1 as the base for the gerrit diff.
99
100```shell
101## New gerrit CL with results of old clang-format.
Alan Zhaoc98914a2025-02-04 20:26:16102
103# For mac, use:
104# export NPROC=$(sysctl -n hw.logicalcpu)
105export NPROC=$(nproc --all)
106
Arthur Eubanks3e6143752022-04-19 19:48:28107# use old clang-format
Alan Zhaoc98914a2025-02-04 20:26:16108find base -name '*.cc' -o -name '*.c' -o -name '*.h' -o -name '*.mm' | xargs -P $NPROC -n1 ./buildtools/linux64-format/clang-format -i
Arthur Eubanks3e6143752022-04-19 19:48:28109git commit -a
Arthur Eubanks9e9f0602023-08-21 08:28:29110git cl upload --bypass-hooks
Arthur Eubanks3e6143752022-04-19 19:48:28111## New patchset on gerrit CL with results of new clang-format.
112# update to new clang-format
Alan Zhaoc98914a2025-02-04 20:26:16113find base -name '*.cc' -o -name '*.c' -o -name '*.h' -o -name '*.mm' | xargs -P $NPROC -n1 ./buildtools/linux64/clang-format -i
Arthur Eubanks3e6143752022-04-19 19:48:28114git commit -a --amend --no-edit
Arthur Eubanks9e9f0602023-08-21 08:28:29115git cl upload --bypass-hooks
Arthur Eubanks3e6143752022-04-19 19:48:28116```
117
118If there are any unexpected diffs, file a bug upstream (and fix it if you can :)).
119
nodir06cbaa02015-08-25 17:15:24120## Upload a CL according to the following template
andybons3322f762015-08-24 21:37:09121
nodir06cbaa02015-08-25 17:15:24122 Update clang-format binaries and scripts for all platforms.
andybons3322f762015-08-24 21:37:09123
nodir06cbaa02015-08-25 17:15:24124 I followed these instructions:
John Palmer046f9872021-05-24 01:24:56125 https://chromium.googlesource.com/chromium/src/+/main/docs/updating_clang_format_binaries.md
andybons3322f762015-08-24 21:37:09126
Arthur Eubanks32c470c2022-03-22 00:22:42127 The binaries were built at clang revision ####### on ##CRREV##.
andybons3322f762015-08-24 21:37:09128
Arthur Eubanks3e6143752022-04-19 19:48:28129 Diff on base/ from previous revision of clang-format to this version:
130 https://crrev.com/c/123123123/1..2
131
132 Bug: #######
andybons3322f762015-08-24 21:37:09133
nodir06cbaa02015-08-25 17:15:24134The change should **always** include new `.sha1` files for each platform (we
135want to keep these in lockstep), should **never** include `clang-format`
136binaries directly. The change should **always** update `README.chromium`
andybons3322f762015-08-24 21:37:09137
nodir06cbaa02015-08-25 17:15:24138clang-format binaries should weigh in at 1.5MB or less. Watch out for size
139regressions.
Stephanie Kim29ae31652024-05-09 17:57:39140
141## Clean up downloaded binaries
142Delete the binaries that were just extracted. To use the new binaries that were
143updated in the DEPS files, run gclient sync.
144```shell
145rm buildtools/linux64/clang-format
146rm buildtools/win/clang-format.exe
147rm buildtools/mac/clang-format.x64
148rm buildtools/mac/clang-format.arm64
149```