xref: /OK3568_Linux_fs/yocto/poky/meta/classes/cargo_common.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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