xref: /OK3568_Linux_fs/yocto/poky/meta/classes/cargo.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun##
2*4882a593Smuzhiyun## Purpose:
3*4882a593Smuzhiyun## This class is used by any recipes that are built using
4*4882a593Smuzhiyun## Cargo.
5*4882a593Smuzhiyun
6*4882a593Smuzhiyuninherit cargo_common
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun# the binary we will use
9*4882a593SmuzhiyunCARGO = "cargo"
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun# We need cargo to compile for the target
12*4882a593SmuzhiyunBASEDEPENDS:append = " cargo-native"
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun# Ensure we get the right rust variant
15*4882a593SmuzhiyunDEPENDS:append:class-target = " virtual/${TARGET_PREFIX}rust ${RUSTLIB_DEP}"
16*4882a593SmuzhiyunDEPENDS:append:class-nativesdk = " virtual/${TARGET_PREFIX}rust ${RUSTLIB_DEP}"
17*4882a593SmuzhiyunDEPENDS:append:class-native = " rust-native"
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun# Enable build separation
20*4882a593SmuzhiyunB = "${WORKDIR}/build"
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun# In case something fails in the build process, give a bit more feedback on
23*4882a593Smuzhiyun# where the issue occured
24*4882a593Smuzhiyunexport RUST_BACKTRACE = "1"
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun# The directory of the Cargo.toml relative to the root directory, per default
27*4882a593Smuzhiyun# assume there's a Cargo.toml directly in the root directory
28*4882a593SmuzhiyunCARGO_SRC_DIR ??= ""
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun# The actual path to the Cargo.toml
31*4882a593SmuzhiyunMANIFEST_PATH ??= "${S}/${CARGO_SRC_DIR}/Cargo.toml"
32*4882a593Smuzhiyun
33*4882a593SmuzhiyunRUSTFLAGS ??= ""
34*4882a593SmuzhiyunBUILD_MODE = "${@['--release', ''][d.getVar('DEBUG_BUILD') == '1']}"
35*4882a593SmuzhiyunCARGO_BUILD_FLAGS = "-v --target ${HOST_SYS} ${BUILD_MODE} --manifest-path=${MANIFEST_PATH}"
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun# This is based on the content of CARGO_BUILD_FLAGS and generally will need to
38*4882a593Smuzhiyun# change if CARGO_BUILD_FLAGS changes.
39*4882a593SmuzhiyunBUILD_DIR = "${@['release', 'debug'][d.getVar('DEBUG_BUILD') == '1']}"
40*4882a593SmuzhiyunCARGO_TARGET_SUBDIR="${HOST_SYS}/${BUILD_DIR}"
41*4882a593Smuzhiyunoe_cargo_build () {
42*4882a593Smuzhiyun	export RUSTFLAGS="${RUSTFLAGS}"
43*4882a593Smuzhiyun	export RUST_TARGET_PATH="${RUST_TARGET_PATH}"
44*4882a593Smuzhiyun	bbnote "cargo = $(which ${CARGO})"
45*4882a593Smuzhiyun	bbnote "rustc = $(which ${RUSTC})"
46*4882a593Smuzhiyun	bbnote "${CARGO} build ${CARGO_BUILD_FLAGS} $@"
47*4882a593Smuzhiyun	"${CARGO}" build ${CARGO_BUILD_FLAGS} "$@"
48*4882a593Smuzhiyun}
49*4882a593Smuzhiyun
50*4882a593Smuzhiyundo_compile[progress] = "outof:\s+(\d+)/(\d+)"
51*4882a593Smuzhiyuncargo_do_compile () {
52*4882a593Smuzhiyun	oe_cargo_fix_env
53*4882a593Smuzhiyun	oe_cargo_build
54*4882a593Smuzhiyun}
55*4882a593Smuzhiyun
56*4882a593Smuzhiyuncargo_do_install () {
57*4882a593Smuzhiyun	local have_installed=false
58*4882a593Smuzhiyun	for tgt in "${B}/target/${CARGO_TARGET_SUBDIR}/"*; do
59*4882a593Smuzhiyun		case $tgt in
60*4882a593Smuzhiyun		*.so|*.rlib)
61*4882a593Smuzhiyun			install -d "${D}${rustlibdir}"
62*4882a593Smuzhiyun			install -m755 "$tgt" "${D}${rustlibdir}"
63*4882a593Smuzhiyun			have_installed=true
64*4882a593Smuzhiyun			;;
65*4882a593Smuzhiyun		*examples)
66*4882a593Smuzhiyun			if [ -d "$tgt" ]; then
67*4882a593Smuzhiyun				for example in "$tgt/"*; do
68*4882a593Smuzhiyun					if [ -f "$example" ] && [ -x "$example" ]; then
69*4882a593Smuzhiyun						install -d "${D}${bindir}"
70*4882a593Smuzhiyun						install -m755 "$example" "${D}${bindir}"
71*4882a593Smuzhiyun						have_installed=true
72*4882a593Smuzhiyun					fi
73*4882a593Smuzhiyun				done
74*4882a593Smuzhiyun			fi
75*4882a593Smuzhiyun			;;
76*4882a593Smuzhiyun		*)
77*4882a593Smuzhiyun			if [ -f "$tgt" ] && [ -x "$tgt" ]; then
78*4882a593Smuzhiyun				install -d "${D}${bindir}"
79*4882a593Smuzhiyun				install -m755 "$tgt" "${D}${bindir}"
80*4882a593Smuzhiyun				have_installed=true
81*4882a593Smuzhiyun			fi
82*4882a593Smuzhiyun			;;
83*4882a593Smuzhiyun		esac
84*4882a593Smuzhiyun	done
85*4882a593Smuzhiyun	if ! $have_installed; then
86*4882a593Smuzhiyun		die "Did not find anything to install"
87*4882a593Smuzhiyun	fi
88*4882a593Smuzhiyun}
89*4882a593Smuzhiyun
90*4882a593SmuzhiyunEXPORT_FUNCTIONS do_compile do_install
91