| #!/bin/bash -eu |
| # Copyright 2021 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| # |
| # This script generates a PGO profile for a given Python version. |
| # PGO profiles are generally pretty stable, so we should only need one per |
| # minor Python version (3.6, 3.7, ...). |
| # |
| # Usage looks like: |
| # $0 python-3.6.1 |
| |
| python_version="${1:-}" |
| if [[ -z "${python_version}" ]]; then |
| echo "Please give this script the python \${P} you want to generate" >&2 |
| echo "a profile for as its first arg. (e.g., python-3.6.12)" >&2 |
| exit 1 |
| fi |
| |
| python_ebuild="$(equery w "=dev-lang/${python_version}")" |
| if [[ -z "${python_ebuild}" ]]; then |
| echo "Failed to locate Python ebuild; quit" >&2 |
| exit 1 |
| fi |
| |
| tempfile="$(mktemp)" |
| trap 'rm "${tempfile}"' EXIT |
| |
| # Note that we *very* intentionally ignore the success of this `ebuild` |
| # command. It breaks sandbox constraints in a few ways during Python's |
| # extensive "test everything," phase. As long as the phrase that tells us most |
| # tests passed is present, be content. A side-benefit of disabling the sandbox |
| # is that it won't influence our profiles in any way. |
| FEATURES=-sandbox USE='-pgo_use pgo_generate' \ |
| ebuild "${python_ebuild}" clean compile |& tee "${tempfile}" |
| |
| if ! grep -qF "Full build with profile completed successfully." "${tempfile}"; then |
| echo "Seems that ebuild-ing python failed somehow?" >&2 |
| exit 1 |
| fi |
| |
| # ...Now fish out the profile that's being used. Python always places it |
| # at ${S}/code.profclangd. |
| profile_locations=( |
| "/var/tmp/portage/dev-lang/${python_version}"*"/work/Python-"*"/code.profclangd" |
| ) |
| |
| if [[ "${#profile_locations[@]}" -ne 1 ]]; then |
| echo "Expected to find 1 profile; got ${#profile_locations[@]}" >&2 |
| echo "Listed out: ${profile_locations[*]}" >&2 |
| echo "Maybe rm -rf /var/tmp/portage and try again?" >&2 |
| exit 1 |
| fi |
| |
| profile_location="${profile_locations[0]}" |
| profile_target="${tempfile}.tar" |
| |
| (cd "$(dirname "${profile_location}")" && |
| tar cf "${profile_target}" code.profclangd) |
| |
| xz -9 "${profile_target}" |
| profile_target="${profile_target}.xz" |
| |
| major_minor_ver="$(cut -d. -f1-2 <<< "${python_version}")" |
| echo "Profile generated successfully to ${profile_target}." |
| echo "When ready, please upload that to gs:// with something like" |
| echo "gsutil cp -n -a public-read ${profile_target}" \ |
| "gs://chromeos-localmirror/distfiles/${major_minor_ver}-profile.tar.xz" |
| echo "Once that's done, don't forget to do 'ebuild manifest'." |