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