1*4882a593Smuzhiyun## 2*4882a593Smuzhiyun## Purpose: 3*4882a593Smuzhiyun## This class is to support building with cargo. It 4*4882a593Smuzhiyun## must be different than cargo.bbclass because Rust 5*4882a593Smuzhiyun## now builds with Cargo but cannot use cargo.bbclass 6*4882a593Smuzhiyun## due to dependencies and assumptions in cargo.bbclass 7*4882a593Smuzhiyun## that Rust & Cargo are already installed. So this 8*4882a593Smuzhiyun## is used by cargo.bbclass and Rust 9*4882a593Smuzhiyun## 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun# add crate fetch support 12*4882a593Smuzhiyuninherit rust-common 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun# Where we download our registry and dependencies to 15*4882a593Smuzhiyunexport CARGO_HOME = "${WORKDIR}/cargo_home" 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun# The pkg-config-rs library used by cargo build scripts disables itself when 18*4882a593Smuzhiyun# cross compiling unless this is defined. We set up pkg-config appropriately 19*4882a593Smuzhiyun# for cross compilation, so tell it we know better than it. 20*4882a593Smuzhiyunexport PKG_CONFIG_ALLOW_CROSS = "1" 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun# Don't instruct cargo to use crates downloaded by bitbake. Some rust packages, 23*4882a593Smuzhiyun# for example the rust compiler itself, come with their own vendored sources. 24*4882a593Smuzhiyun# Specifying two [source.crates-io] will not work. 25*4882a593SmuzhiyunCARGO_DISABLE_BITBAKE_VENDORING ?= "0" 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun# Used by libstd-rs to point to the vendor dir included in rustc src 28*4882a593SmuzhiyunCARGO_VENDORING_DIRECTORY ?= "${CARGO_HOME}/bitbake" 29*4882a593Smuzhiyun 30*4882a593SmuzhiyunCARGO_RUST_TARGET_CCLD ?= "${RUST_TARGET_CCLD}" 31*4882a593Smuzhiyuncargo_common_do_configure () { 32*4882a593Smuzhiyun mkdir -p ${CARGO_HOME}/bitbake 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun cat <<- EOF > ${CARGO_HOME}/config 35*4882a593Smuzhiyun # EXTRA_OECARGO_PATHS 36*4882a593Smuzhiyun paths = [ 37*4882a593Smuzhiyun $(for p in ${EXTRA_OECARGO_PATHS}; do echo \"$p\",; done) 38*4882a593Smuzhiyun ] 39*4882a593Smuzhiyun EOF 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun cat <<- EOF >> ${CARGO_HOME}/config 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun # Local mirror vendored by bitbake 44*4882a593Smuzhiyun [source.bitbake] 45*4882a593Smuzhiyun directory = "${CARGO_VENDORING_DIRECTORY}" 46*4882a593Smuzhiyun EOF 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun if [ ${CARGO_DISABLE_BITBAKE_VENDORING} = "0" ]; then 49*4882a593Smuzhiyun cat <<- EOF >> ${CARGO_HOME}/config 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun [source.crates-io] 52*4882a593Smuzhiyun replace-with = "bitbake" 53*4882a593Smuzhiyun local-registry = "/nonexistent" 54*4882a593Smuzhiyun EOF 55*4882a593Smuzhiyun fi 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun cat <<- EOF >> ${CARGO_HOME}/config 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun [http] 60*4882a593Smuzhiyun # Multiplexing can't be enabled because http2 can't be enabled 61*4882a593Smuzhiyun # in curl-native without dependency loops 62*4882a593Smuzhiyun multiplexing = false 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun # Ignore the hard coded and incorrect path to certificates 65*4882a593Smuzhiyun cainfo = "${STAGING_ETCDIR_NATIVE}/ssl/certs/ca-certificates.crt" 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun EOF 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun cat <<- EOF >> ${CARGO_HOME}/config 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun # HOST_SYS 72*4882a593Smuzhiyun [target.${HOST_SYS}] 73*4882a593Smuzhiyun linker = "${CARGO_RUST_TARGET_CCLD}" 74*4882a593Smuzhiyun EOF 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun if [ "${HOST_SYS}" != "${BUILD_SYS}" ]; then 77*4882a593Smuzhiyun cat <<- EOF >> ${CARGO_HOME}/config 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun # BUILD_SYS 80*4882a593Smuzhiyun [target.${BUILD_SYS}] 81*4882a593Smuzhiyun linker = "${RUST_BUILD_CCLD}" 82*4882a593Smuzhiyun EOF 83*4882a593Smuzhiyun fi 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun # Put build output in build directory preferred by bitbake instead of 86*4882a593Smuzhiyun # inside source directory unless they are the same 87*4882a593Smuzhiyun if [ "${B}" != "${S}" ]; then 88*4882a593Smuzhiyun cat <<- EOF >> ${CARGO_HOME}/config 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun [build] 91*4882a593Smuzhiyun # Use out of tree build destination to avoid polluting the source tree 92*4882a593Smuzhiyun target-dir = "${B}/target" 93*4882a593Smuzhiyun EOF 94*4882a593Smuzhiyun fi 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun cat <<- EOF >> ${CARGO_HOME}/config 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun [term] 99*4882a593Smuzhiyun progress.when = 'always' 100*4882a593Smuzhiyun progress.width = 80 101*4882a593Smuzhiyun EOF 102*4882a593Smuzhiyun} 103*4882a593Smuzhiyun 104*4882a593Smuzhiyunoe_cargo_fix_env () { 105*4882a593Smuzhiyun export CC="${RUST_TARGET_CC}" 106*4882a593Smuzhiyun export CXX="${RUST_TARGET_CXX}" 107*4882a593Smuzhiyun export CFLAGS="${CFLAGS}" 108*4882a593Smuzhiyun export CXXFLAGS="${CXXFLAGS}" 109*4882a593Smuzhiyun export AR="${AR}" 110*4882a593Smuzhiyun export TARGET_CC="${RUST_TARGET_CC}" 111*4882a593Smuzhiyun export TARGET_CXX="${RUST_TARGET_CXX}" 112*4882a593Smuzhiyun export TARGET_CFLAGS="${CFLAGS}" 113*4882a593Smuzhiyun export TARGET_CXXFLAGS="${CXXFLAGS}" 114*4882a593Smuzhiyun export TARGET_AR="${AR}" 115*4882a593Smuzhiyun export HOST_CC="${RUST_BUILD_CC}" 116*4882a593Smuzhiyun export HOST_CXX="${RUST_BUILD_CXX}" 117*4882a593Smuzhiyun export HOST_CFLAGS="${BUILD_CFLAGS}" 118*4882a593Smuzhiyun export HOST_CXXFLAGS="${BUILD_CXXFLAGS}" 119*4882a593Smuzhiyun export HOST_AR="${BUILD_AR}" 120*4882a593Smuzhiyun} 121*4882a593Smuzhiyun 122*4882a593SmuzhiyunEXTRA_OECARGO_PATHS ??= "" 123*4882a593Smuzhiyun 124*4882a593SmuzhiyunEXPORT_FUNCTIONS do_configure 125