# # Copyright OpenEmbedded Contributors # # SPDX-License-Identifier: MIT # ## ## Purpose: ## This class is used by any recipes that are built using ## Cargo. inherit cargo_common inherit rust-target-config # the binary we will use CARGO = "cargo" # We need cargo to compile for the target BASEDEPENDS:append = " cargo-native" # Ensure we get the right rust variant DEPENDS:append:class-target = " rust-native ${RUSTLIB_DEP}" DEPENDS:append:class-nativesdk = " rust-native ${RUSTLIB_DEP}" DEPENDS:append:class-native = " rust-native" # Enable build separation B = "${WORKDIR}/build" # In case something fails in the build process, give a bit more feedback on # where the issue occured export RUST_BACKTRACE = "1" RUSTFLAGS ??= "" BUILD_MODE = "${@['--release', ''][d.getVar('DEBUG_BUILD') == '1']}" # --frozen flag will prevent network access (which is required since only # the do_fetch step is authorized to access network) # and will require an up to date Cargo.lock file. # This force the package being built to already ship a Cargo.lock, in the end # this is what we want, at least, for reproducibility of the build. CARGO_BUILD_FLAGS = "-v --frozen --target ${RUST_HOST_SYS} ${BUILD_MODE} --manifest-path=${CARGO_MANIFEST_PATH}" # This is based on the content of CARGO_BUILD_FLAGS and generally will need to # change if CARGO_BUILD_FLAGS changes. BUILD_DIR = "${@['release', 'debug'][d.getVar('DEBUG_BUILD') == '1']}" CARGO_TARGET_SUBDIR="${RUST_HOST_SYS}/${BUILD_DIR}" oe_cargo_build () { export RUSTFLAGS="${RUSTFLAGS}" bbnote "Using rust targets from ${RUST_TARGET_PATH}" bbnote "cargo = $(which ${CARGO})" bbnote "${CARGO} build ${CARGO_BUILD_FLAGS} $@" "${CARGO}" build ${CARGO_BUILD_FLAGS} "$@" } do_compile[progress] = "outof:\s+(\d+)/(\d+)" cargo_do_compile () { oe_cargo_build } cargo_do_install () { local have_installed=false for tgt in "${B}/target/${CARGO_TARGET_SUBDIR}/"*; do case $tgt in *.so|*.rlib) install -d "${D}${rustlibdir}" install -m755 "$tgt" "${D}${rustlibdir}" have_installed=true ;; *examples) if [ -d "$tgt" ]; then for example in "$tgt/"*; do if [ -f "$example" ] && [ -x "$example" ]; then install -d "${D}${bindir}" install -m755 "$example" "${D}${bindir}" have_installed=true fi done fi ;; *) if [ -f "$tgt" ] && [ -x "$tgt" ]; then install -d "${D}${bindir}" install -m755 "$tgt" "${D}${bindir}" have_installed=true fi ;; esac done if ! $have_installed; then die "Did not find anything to install" fi } EXPORT_FUNCTIONS do_compile do_install