# Updating Clang format binaries Instructions on how to update the [clang-format binaries](clang_format.md) that come with a checkout of Chromium. ## Prerequisites You'll also need permissions to upload to the appropriate google storage bucket. Chromium infrastructure team members have this, and others can be granted the permission based on need. If you need this permission, mention this in the tracking bug. ## Fetch and upload prebuilt clang-format binaries from recent clang rolls Recent clang rolls can be found via looking at the history of [update.py](https://crsrc.org/c/tools/clang/scripts/update.py). You can also use clang-format packages built in recent successful dry run attempts at updating clang as mentioned [here](clang_sheriffing.md). The following will, for each supported host architecture, * Fetch the corresponding clang-format package from the specified clang roll * Extract and copy the clang-format binary to the proper directory * Upload the binary into a publicly accessible google storage bucket, also updating the corresponding `.sha1` files in the local checkout of Chrome ```shell cd $SRC/chromium/src GS_PATH=gs://chromium-browser-clang-staging CLANG_REV=llvmorg-15-init-234-g567890abc-2 echo Linux gsutil cp $GS_PATH/Linux_x64/clang-format-$CLANG_REV.tgz /tmp tar xf /tmp/clang-format-$CLANG_REV.tgz -C buildtools/linux64 --strip-component=1 bin/clang-format echo Win gsutil cp $GS_PATH/Win/clang-format-$CLANG_REV.tgz /tmp tar xf /tmp/clang-format-$CLANG_REV.tgz -C buildtools/win --strip-component=1 bin/clang-format.exe echo 'Mac x64' gsutil cp $GS_PATH/Mac/clang-format-$CLANG_REV.tgz /tmp tar xf /tmp/clang-format-$CLANG_REV.tgz -C buildtools/mac --strip-component=1 bin/clang-format mv buildtools/mac/clang-format buildtools/mac/clang-format.x64 echo 'Mac arm64' gsutil cp $GS_PATH/Mac_arm64/clang-format-$CLANG_REV.tgz /tmp tar xf /tmp/clang-format-$CLANG_REV.tgz -C buildtools/mac --strip-component=1 bin/clang-format mv buildtools/mac/clang-format buildtools/mac/clang-format.arm64 echo 'Uploading to GCS and creating sha1 files' upload_to_google_storage.py --bucket=chromium-clang-format buildtools/linux64/clang-format upload_to_google_storage.py --bucket=chromium-clang-format buildtools/win/clang-format.exe upload_to_google_storage.py --bucket=chromium-clang-format buildtools/mac/clang-format.x64 upload_to_google_storage.py --bucket=chromium-clang-format buildtools/mac/clang-format.arm64 # Clean up rm /tmp/clang-format-$CLANG_REV.tgz # These aren't in .gitignore because these mac per-arch paths only exist when updating clang-format. # gclient runhooks puts these binaries at buildtools/mac/clang-format. rm buildtools/mac/clang-format.x64 buildtools/mac/clang-format.arm64 ``` ## Check that the new clang-format works as expected Compare the diffs created by running the old and new clang-format versions to see if the new version does anything unexpected. Running them on some substantial directory like `third_party/blink` or `base` should be sufficient. Upload the diffs as two patchsets in a CL for easy inspection of the clang-format differences by choosing patchset 1 as the base for the gerrit diff. ```shell ## New gerrit CL with results of old clang-format. # use old clang-format find base -name '*.cc' -o -name '*.c' -o -name '*.h' -o -name '*.mm' | xargs ./buildtools/linux64/clang-format -i git commit -a git cl upload ## New patchset on gerrit CL with results of new clang-format. # update to new clang-format find base -name '*.cc' -o -name '*.c' -o -name '*.h' -o -name '*.mm' | xargs ./buildtools/linux64/clang-format -i git commit -a --amend --no-edit git cl upload ``` If there are any unexpected diffs, file a bug upstream (and fix it if you can :)). ## Upload a CL according to the following template Update clang-format binaries and scripts for all platforms. I followed these instructions: https://chromium.googlesource.com/chromium/src/+/main/docs/updating_clang_format_binaries.md The binaries were built at clang revision ####### on ##CRREV##. Diff on base/ from previous revision of clang-format to this version: https://crrev.com/c/123123123/1..2 Bug: ####### The change should **always** include new `.sha1` files for each platform (we want to keep these in lockstep), should **never** include `clang-format` binaries directly. The change should **always** update `README.chromium` clang-format binaries should weigh in at 1.5MB or less. Watch out for size regressions.