-
Notifications
You must be signed in to change notification settings - Fork 66
/
cargo_bin.bbclass
174 lines (145 loc) · 6.1 KB
/
cargo_bin.bbclass
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
inherit rust_bin-common
# Many crates rely on pkg-config to find native versions of their libraries for
# linking - do the simple thing and make it generally available.
DEPENDS:append = "\
${@ "cargo-bin-cross-${TARGET_ARCH}" if d.getVar('TARGET_ARCH') != "${BUILD_ARCH}" else "cargo-bin-native" } \
pkgconfig-native \
"
# Move CARGO_HOME from default of ~/.cargo
export CARGO_HOME = "${WORKDIR}/cargo_home"
# If something fails while building, this might give useful information
export RUST_BACKTRACE = "1"
# Do build out-of-tree
B = "${WORKDIR}/target"
export CARGO_TARGET_DIR = "${B}"
RUST_TARGET = "${@rust_target(d, 'TARGET')}"
RUST_BUILD = "${@rust_target(d, 'BUILD')}"
# Additional flags passed directly to the "cargo build" invocation
EXTRA_CARGO_FLAGS ??= ""
EXTRA_RUSTFLAGS ??= ""
RUSTFLAGS += "${EXTRA_RUSTFLAGS}"
# Space-separated list of features to enable
CARGO_FEATURES ??= ""
# Control the Cargo build type (debug or release)
CARGO_BUILD_PROFILE ?= "release"
CARGO_INSTALL_DIR ?= "${D}${bindir}"
def cargo_profile_to_builddir(profile):
# See https://doc.rust-lang.org/cargo/guide/build-cache.html
# for the special cases mapped here.
return {
'dev': 'debug',
'test': 'debug',
'release': 'release',
'bench': 'release',
}.get(profile, profile)
CARGO_BINDIR = "${B}/${RUST_TARGET}/${@cargo_profile_to_builddir(d.getVar('CARGO_BUILD_PROFILE'))}"
WRAPPER_DIR = "${WORKDIR}/wrappers"
# Set the Cargo manifest path to the typical location
CARGO_MANIFEST_PATH ?= "${S}/Cargo.toml"
FILES:${PN}-dev += "${libdir}/*.rlib"
CARGO_BUILD_FLAGS = "\
--verbose \
--manifest-path ${CARGO_MANIFEST_PATH} \
--target=${RUST_TARGET} \
--profile=${CARGO_BUILD_PROFILE} \
${@oe.utils.conditional('CARGO_FEATURES', '', '', '--features "${CARGO_FEATURES}"', d)} \
${EXTRA_CARGO_FLAGS} \
"
cargo_bin_do_configure() {
mkdir -p "${B}"
mkdir -p "${CARGO_HOME}"
mkdir -p "${WRAPPER_DIR}"
# Yocto provides the C compiler in ${CC} but that includes options beyond
# the compiler binary. cargo/rustc expect a single binary, so we put ${CC}
# in a wrapper script.
echo "#!/bin/sh" >"${WRAPPER_DIR}/cc-wrapper.sh"
echo "${CC} \"\$@\"" >>"${WRAPPER_DIR}/cc-wrapper.sh"
chmod +x "${WRAPPER_DIR}/cc-wrapper.sh"
echo "#!/bin/sh" >"${WRAPPER_DIR}/cxx-wrapper.sh"
echo "${CXX} \"\$@\"" >>"${WRAPPER_DIR}/cxx-wrapper.sh"
chmod +x "${WRAPPER_DIR}/cxx-wrapper.sh"
echo "#!/bin/sh" >"${WRAPPER_DIR}/cc-native-wrapper.sh"
echo "${BUILD_CC} \"\$@\"" >>"${WRAPPER_DIR}/cc-native-wrapper.sh"
chmod +x "${WRAPPER_DIR}/cc-native-wrapper.sh"
echo "#!/bin/sh" >"${WRAPPER_DIR}/cxx-native-wrapper.sh"
echo "${BUILD_CXX} \"\$@\"" >>"${WRAPPER_DIR}/cxx-native-wrapper.sh"
chmod +x "${WRAPPER_DIR}/cxx-native-wrapper.sh"
echo "#!/bin/sh" >"${WRAPPER_DIR}/linker-wrapper.sh"
echo "${CC} ${LDFLAGS} \"\$@\"" >>"${WRAPPER_DIR}/linker-wrapper.sh"
chmod +x "${WRAPPER_DIR}/linker-wrapper.sh"
echo "#!/bin/sh" >"${WRAPPER_DIR}/linker-native-wrapper.sh"
echo "${BUILD_CC} ${BUILD_LDFLAGS} \"\$@\"" >>"${WRAPPER_DIR}/linker-native-wrapper.sh"
chmod +x "${WRAPPER_DIR}/linker-native-wrapper.sh"
}
cargo_bin_do_compile() {
export TARGET_CC="${WRAPPER_DIR}/cc-wrapper.sh"
export TARGET_CXX="${WRAPPER_DIR}/cxx-wrapper.sh"
export CC="${WRAPPER_DIR}/cc-native-wrapper.sh"
export CXX="${WRAPPER_DIR}/cxx-native-wrapper.sh"
export TARGET_LD="${WRAPPER_DIR}/linker-wrapper.sh"
export LD="${WRAPPER_DIR}/linker-native-wrapper.sh"
export PKG_CONFIG_ALLOW_CROSS="1"
export LDFLAGS=""
export RUSTFLAGS="${RUSTFLAGS}"
export SSH_AUTH_SOCK="${SSH_AUTH_SOCK}"
# This "DO_NOT_USE_THIS" option of cargo is currently the only way to
# configure a different linker for host and target builds when RUST_BUILD ==
# RUST_TARGET.
export __CARGO_TEST_CHANNEL_OVERRIDE_DO_NOT_USE_THIS="nightly"
export CARGO_UNSTABLE_TARGET_APPLIES_TO_HOST="true"
export CARGO_UNSTABLE_HOST_CONFIG="true"
export CARGO_TARGET_APPLIES_TO_HOST="false"
export CARGO_TARGET_${@rust_target(d, 'TARGET').replace('-','_').upper()}_LINKER="${WRAPPER_DIR}/linker-wrapper.sh"
export CARGO_HOST_LINKER="${WRAPPER_DIR}/linker-native-wrapper.sh"
export CARGO_BUILD_FLAGS="-C rpath"
export CARGO_PROFILE_RELEASE_DEBUG="true"
# The CC crate defaults to using CFLAGS when compiling everything. We can
# give it custom flags for compiling on the host.
export HOST_CXXFLAGS=""
export HOST_CFLAGS=""
bbnote "which rustc:" `which rustc`
bbnote "rustc --version" `rustc --version`
bbnote "which cargo:" `which cargo`
bbnote "cargo --version" `cargo --version`
bbnote cargo build ${CARGO_BUILD_FLAGS}
cargo build ${CARGO_BUILD_FLAGS}
}
cargo_bin_do_install() {
local files_installed=""
for tgt in "${CARGO_BINDIR}"/*; do
case $tgt in
*.so|*.rlib)
install -d "${D}${libdir}"
install -m755 "$tgt" "${D}${libdir}"
files_installed="$files_installed $tgt"
;;
*examples)
if [ -d "$tgt" ]; then
for example in "$tgt/"*; do
if [ -f "$example" ] && [ -x "$example" ]; then
install -d "${CARGO_INSTALL_DIR}"
install -m755 "$example" "${CARGO_INSTALL_DIR}"
files_installed="$files_installed $example"
fi
done
fi
;;
*)
if [ -f "$tgt" ] && [ -x "$tgt" ]; then
install -d "${CARGO_INSTALL_DIR}"
install -m755 "$tgt" "${CARGO_INSTALL_DIR}"
files_installed="$files_installed $tgt"
fi
;;
esac
done
if [ -z "$files_installed" ]; then
bbfatal "Cargo found no files to install"
else
bbnote "Installed the following files:"
for f in $files_installed; do
bbnote " " `basename $f`
done
fi
}
EXPORT_FUNCTIONS do_configure do_compile do_install