c55fb403f8
There was a bbnote that showed the path to the rustc and cargo binaries being used but this was not necessarily correct since it didn't use the exact variables used.
114 lines
3.2 KiB
Plaintext
114 lines
3.2 KiB
Plaintext
# add crate fetch support
|
|
inherit crate-fetch
|
|
inherit rust-common
|
|
|
|
# the binary we will use
|
|
CARGO = "cargo"
|
|
|
|
# Where we download our registry and dependencies to
|
|
export CARGO_HOME = "${WORKDIR}/cargo_home"
|
|
|
|
# We need cargo to compile for the target
|
|
BASEDEPENDS_append = " cargo-native"
|
|
|
|
# Ensure we get the right rust variant
|
|
DEPENDS_append_class-target = " virtual/${TARGET_PREFIX}rust ${RUSTLIB_DEP}"
|
|
DEPENDS_append_class-native = " rust-native"
|
|
|
|
# Cargo only supports in-tree builds at the moment
|
|
B = "${S}"
|
|
|
|
# In case something fails in the build process, give a bit more feedback on
|
|
# where the issue occured
|
|
export RUST_BACKTRACE = "1"
|
|
|
|
# The pkg-config-rs library used by cargo build scripts disables itself when
|
|
# cross compiling unless this is defined. We set up pkg-config appropriately
|
|
# for cross compilation, so tell it we know better than it.
|
|
export PKG_CONFIG_ALLOW_CROSS = "1"
|
|
|
|
cargo_do_configure () {
|
|
mkdir -p ${CARGO_HOME}
|
|
echo "paths = [" > ${CARGO_HOME}/config
|
|
|
|
for p in ${EXTRA_OECARGO_PATHS}; do
|
|
printf "\"%s\"\n" "$p"
|
|
done | sed -e 's/$/,/' >> ${CARGO_HOME}/config
|
|
echo "]" >> ${CARGO_HOME}/config
|
|
|
|
# Point cargo at our local mirror of the registry
|
|
cat <<- EOF >> ${CARGO_HOME}/config
|
|
[source.bitbake]
|
|
directory = "${CARGO_HOME}/bitbake"
|
|
|
|
[source.crates-io]
|
|
replace-with = "bitbake"
|
|
local-registry = "/nonexistant"
|
|
EOF
|
|
|
|
echo "[target.${HOST_SYS}]" >> ${CARGO_HOME}/config
|
|
echo "linker = '${RUST_TARGET_CCLD}'" >> ${CARGO_HOME}/config
|
|
if [ "${HOST_SYS}" != "${BUILD_SYS}" ]; then
|
|
echo "[target.${BUILD_SYS}]" >> ${CARGO_HOME}/config
|
|
echo "linker = '${RUST_BUILD_CCLD}'" >> ${CARGO_HOME}/config
|
|
fi
|
|
}
|
|
|
|
RUSTFLAGS ??= ""
|
|
CARGO_BUILD_FLAGS = "-v --target ${HOST_SYS} --release"
|
|
RUST_TARGET_PATH = "${STAGING_LIBDIR_NATIVE}/rustlib"
|
|
|
|
# This is based on the content of CARGO_BUILD_FLAGS and generally will need to
|
|
# change if CARGO_BUILD_FLAGS changes.
|
|
CARGO_TARGET_SUBDIR="${HOST_SYS}/release"
|
|
oe_cargo_build () {
|
|
export RUSTFLAGS="${RUSTFLAGS}"
|
|
export RUST_TARGET_PATH="${RUST_TARGET_PATH}"
|
|
bbnote "cargo = $(which ${CARGO})"
|
|
bbnote "rustc = $(which ${RUSTC})"
|
|
bbnote "${CARGO} build ${CARGO_BUILD_FLAGS} $@"
|
|
"${CARGO}" build ${CARGO_BUILD_FLAGS} "$@"
|
|
}
|
|
|
|
oe_cargo_fix_env () {
|
|
export CC="${RUST_TARGET_CC}"
|
|
export CXX="${RUST_TARGET_CXX}"
|
|
export CFLAGS="${CFLAGS}"
|
|
export AR="${AR}"
|
|
export TARGET_CC="${RUST_TARGET_CC}"
|
|
export TARGET_CXX="${RUST_TARGET_CXX}"
|
|
export TARGET_CFLAGS="${CFLAGS}"
|
|
export TARGET_AR="${AR}"
|
|
export HOST_CC="${RUST_BUILD_CC}"
|
|
export HOST_CXX="${RUST_BUILD_CXX}"
|
|
export HOST_CFLAGS="${BUILD_CFLAGS}"
|
|
export HOST_AR="${BUILD_AR}"
|
|
}
|
|
|
|
EXTRA_OECARGO_PATHS ??= ""
|
|
|
|
cargo_do_compile () {
|
|
oe_cargo_fix_env
|
|
oe_cargo_build
|
|
}
|
|
|
|
cargo_do_install () {
|
|
local have_installed=false
|
|
for tgt in "${B}/target/${CARGO_TARGET_SUBDIR}/"*; do
|
|
if [[ $tgt == *.so || $tgt == *.rlib ]]; then
|
|
install -d "${D}${rustlibdir}"
|
|
install -m755 "$tgt" "${D}${rustlibdir}"
|
|
have_installed=true
|
|
elif [ -f "$tgt" ] && [ -x "$tgt" ]; then
|
|
install -d "${D}${bindir}"
|
|
install -m755 "$tgt" "${D}${bindir}"
|
|
have_installed=true
|
|
fi
|
|
done
|
|
if ! $have_installed; then
|
|
die "Did not find anything to install"
|
|
fi
|
|
}
|
|
|
|
EXPORT_FUNCTIONS do_configure do_compile do_install
|