| # Copyright 2022 The ChromiumOS Authors |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| EAPI=7 |
| |
| CROS_WORKON_COMMIT="23fc6ce4de4622555d976bd47a055ccb8891470b" |
| CROS_WORKON_TREE=("a43d41e33e05397ec712c89e31737358626cdb90" "2bc52ce1730c44285db5b93695f6f7b16e21a06d") |
| CROS_WORKON_PROJECT="chromiumos/third_party/rust_crates" |
| CROS_WORKON_EGIT_BRANCH="main" |
| CROS_WORKON_LOCALNAME="rust_crates" |
| CROS_WORKON_OUTOFTREE_BUILD=1 |
| CROS_WORKON_SUBTREE="vendor vendor_artifacts" |
| |
| PYTHON_COMPAT=( python3_{6..9} ) |
| |
| inherit cros-workon cros-rust python-single-r1 |
| |
| DESCRIPTION="Sources of third-party crates used by ChromeOS" |
| HOMEPAGE='https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/HEAD/' |
| KEYWORDS="*" |
| |
| EXPECTED_LICENSES=( |
| 0BSD |
| Apache-2.0 |
| BSD |
| BSD-2 |
| ISC |
| MIT |
| MPL-2.0 |
| ZLIB |
| unicode |
| ) |
| |
| LICENSE="${EXPECTED_LICENSES[*]}" |
| |
| # shellcheck disable=SC2154 # this is defined by cros-rust |
| CRATES_LISTING_INST_LOC="${CROS_RUST_REGISTRY_DIR}/third-party-crates-src-listing" |
| |
| # Some baremetal crates ship with prebuilt .o files that don't pass |
| # QA_EXECSTACK. This is intended, so silence those warnings. |
| _QA_EXECSTACK_ROOT="${CROS_RUST_REGISTRY_DIR:1}" |
| QA_EXECSTACK=" |
| ${_QA_EXECSTACK_ROOT}/cortex-m-rt-* |
| ${_QA_EXECSTACK_ROOT}/riscv-* |
| " |
| |
| pkg_setup() { |
| python-single-r1_pkg_setup |
| # This handles calling cros-workon_pkg_setup for us. |
| cros-rust_pkg_setup |
| } |
| |
| src_unpack() { |
| if use test; then |
| # For testing only we need a writable copy of ./projects |
| # It is not included in CROS_WORKON_SUBTREE because we do not want to |
| # trigger unnecessary uprevs which result rebuilding a lot dependent |
| # packages. |
| cp -R "${CROS_WORKON_SRCROOT}/src/third_party/${CROS_WORKON_LOCALNAME}/projects" "${WORKDIR}/projects" || die |
| fi |
| |
| # Do this so "${S}" is set up as early as possible. This also |
| # prevents cros-rust_src_unpack from modifying ${S}. |
| cros-workon_src_unpack |
| cros-rust_src_unpack |
| } |
| |
| src_prepare() { |
| [[ -n "${PATCHES[*]}" ]] && die "User patches are not supported in" \ |
| "this ebuild. Instead, add patches to" \ |
| "third_party/rust_crates; please see the README for details." |
| # Call eapply_user; otherwise, portage gets upset. |
| eapply_user |
| } |
| |
| src_configure() { |
| : |
| } |
| |
| src_compile() { |
| # For lack of a better place to put this (since we want it to run when |
| # FEATURES=test is not enabled), verify licenses here. |
| "${S}/vendor_artifacts/verify_licenses.py" \ |
| --license-file="${S}/vendor_artifacts/licenses_used.txt" \ |
| --expected-licenses="${EXPECTED_LICENSES[*]}" \ |
| || die |
| einfo "License verification complete." |
| |
| # If we're working on out-of-tree sources, mirror licenses to make |
| # license checks happy. This is a bit hacky, but cheap. |
| if [[ "${S}" != "${WORKDIR}"/* ]]; then |
| local targ="${WORKDIR}/licenses" |
| [[ -e "${targ}" ]] && die "${targ} shouldn't exist" |
| einfo "Mirroring licenses from ${S}/vendor to ${targ}..." |
| rsync -r --include='*/' --include='LICENSE*' --exclude='*' \ |
| --prune-empty-dirs "${S}/vendor" "${targ}" || die |
| fi |
| |
| (cd "${S}/vendor" && echo * > "${T}/third-party-crates-src-listing") || die |
| } |
| |
| src_test() { |
| # We need to point the cargo registry at the vendored crates |
| # shellcheck disable=SC2154 |
| sed -i -e 's~directory = .*~directory = "'"${S}/vendor"'"~' "${ECARGO_HOME}/config" || die |
| |
| ( |
| # This generates a lockfile which fails when dependencies are missing. |
| cd "${WORKDIR}/projects" || die |
| einfo testing at "'$(readlink -f .)'" |
| cros-rust_src_configure |
| ) |
| } |
| |
| # Shellcheck thinks CROS_RUST variables are never defined. |
| # shellcheck disable=SC2154 |
| src_install() { |
| insinto "${CROS_RUST_REGISTRY_DIR}" |
| |
| # Prebuilt .a files are installed by some packages, and should not be |
| # stripped. |
| dostrip -x "${CROS_RUST_REGISTRY_DIR}" |
| cd "${S}/vendor" || die |
| |
| local crates_listing="${T}/third-party-crates-src-listing" |
| local crate_versions |
| read -r -a crate_versions < "${crates_listing}" || die |
| doins "${crates_listing}" |
| |
| doins -r "${crate_versions[@]}" |
| } |
| |
| should_skip_registry_links() { |
| # build_image is set up so that nothing actually gets installed into |
| # "${ROOT}${CROS_RUST_REGISTRY_DIR}". Skip all pkg_* functionality if |
| # that DNE, in part for speed, and in part because we depend on e.g., |
| # our crates listing. |
| ! [[ -e "${ROOT}${CROS_RUST_REGISTRY_DIR}" ]] |
| } |
| |
| pkg_preinst() { |
| should_skip_registry_links && return |
| |
| local crate_versions |
| read -r -a crate_versions < "${D}${CRATES_LISTING_INST_LOC}" || die |
| cros-rust_cleanup_vendor_registry_links "${crate_versions[@]}" |
| } |
| |
| pkg_postinst() { |
| should_skip_registry_links && return |
| |
| local crate_versions |
| read -r -a crate_versions < "${ROOT}${CRATES_LISTING_INST_LOC}" || die |
| cros-rust_create_vendor_registry_links "${crate_versions[@]}" |
| } |
| |
| pkg_prerm() { |
| should_skip_registry_links && return |
| |
| local crate_versions |
| read -r -a crate_versions < "${ROOT}${CRATES_LISTING_INST_LOC}" || die |
| cros-rust_cleanup_vendor_registry_links "${crate_versions[@]}" |
| } |