mirror of
https://git.yoctoproject.org/poky
synced 2026-02-12 03:33:02 +01:00
As stated in our top level license files, the license is MIT unless otherwise stated. Add SPDX identifers accordingly. Replace older license statementa with the standardised syntax. Also drop "All Rights Reserved" expression as it isn't used now, doesn't mean anything and is confusing. (From OE-Core rev: 081a391fe09a21265881e39a2a496e4e10b4f80b) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
155 lines
4.4 KiB
Plaintext
155 lines
4.4 KiB
Plaintext
#
|
|
# Copyright OpenEmbedded Contributors
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
#
|
|
|
|
inherit rust
|
|
|
|
RDEPENDS:${PN}:append:class-target = " ${RUSTLIB_DEP}"
|
|
|
|
RUSTC_ARCHFLAGS += "-C opt-level=3 -g -L ${STAGING_DIR_HOST}/${rustlibdir} -C linker=${RUST_TARGET_CCLD}"
|
|
EXTRA_OEMAKE += 'RUSTC_ARCHFLAGS="${RUSTC_ARCHFLAGS}"'
|
|
|
|
# Some libraries alias with the standard library but libstd is configured to
|
|
# make it difficult or imposisble to use its version. Unfortunately libstd
|
|
# must be explicitly overridden using extern.
|
|
OVERLAP_LIBS = "\
|
|
libc \
|
|
log \
|
|
getopts \
|
|
rand \
|
|
"
|
|
def get_overlap_deps(d):
|
|
deps = d.getVar("DEPENDS").split()
|
|
overlap_deps = []
|
|
for o in d.getVar("OVERLAP_LIBS").split():
|
|
l = len([o for dep in deps if (o + '-rs' in dep)])
|
|
if l > 0:
|
|
overlap_deps.append(o)
|
|
return " ".join(overlap_deps)
|
|
OVERLAP_DEPS = "${@get_overlap_deps(d)}"
|
|
|
|
# Prevents multiple static copies of standard library modules
|
|
# See https://github.com/rust-lang/rust/issues/19680
|
|
RUSTC_PREFER_DYNAMIC = "-C prefer-dynamic"
|
|
RUSTC_FLAGS += "${RUSTC_PREFER_DYNAMIC}"
|
|
|
|
CRATE_NAME ?= "${@d.getVar('BPN').replace('-rs', '').replace('-', '_')}"
|
|
BINNAME ?= "${BPN}"
|
|
LIBNAME ?= "lib${CRATE_NAME}-rs"
|
|
CRATE_TYPE ?= "dylib"
|
|
BIN_SRC ?= "${S}/src/main.rs"
|
|
LIB_SRC ?= "${S}/src/lib.rs"
|
|
|
|
rustbindest ?= "${bindir}"
|
|
rustlibdest ?= "${rustlibdir}"
|
|
RUST_RPATH_ABS ?= "${rustlibdir}:${rustlib}"
|
|
|
|
def relative_rpaths(paths, base):
|
|
relpaths = set()
|
|
for p in paths.split(':'):
|
|
if p == base:
|
|
relpaths.add('$ORIGIN')
|
|
continue
|
|
relpaths.add(os.path.join('$ORIGIN', os.path.relpath(p, base)))
|
|
return '-rpath=' + ':'.join(relpaths) if len(relpaths) else ''
|
|
|
|
RUST_LIB_RPATH_FLAGS ?= "${@relative_rpaths(d.getVar('RUST_RPATH_ABS', True), d.getVar('rustlibdest', True))}"
|
|
RUST_BIN_RPATH_FLAGS ?= "${@relative_rpaths(d.getVar('RUST_RPATH_ABS', True), d.getVar('rustbindest', True))}"
|
|
|
|
def libfilename(d):
|
|
if d.getVar('CRATE_TYPE', True) == 'dylib':
|
|
return d.getVar('LIBNAME', True) + '.so'
|
|
else:
|
|
return d.getVar('LIBNAME', True) + '.rlib'
|
|
|
|
def link_args(d, bin):
|
|
linkargs = []
|
|
if bin:
|
|
rpaths = d.getVar('RUST_BIN_RPATH_FLAGS', False)
|
|
else:
|
|
rpaths = d.getVar('RUST_LIB_RPATH_FLAGS', False)
|
|
if d.getVar('CRATE_TYPE', True) == 'dylib':
|
|
linkargs.append('-soname')
|
|
linkargs.append(libfilename(d))
|
|
if len(rpaths):
|
|
linkargs.append(rpaths)
|
|
if len(linkargs):
|
|
return ' '.join(['-Wl,' + arg for arg in linkargs])
|
|
else:
|
|
return ''
|
|
|
|
get_overlap_externs () {
|
|
externs=
|
|
for dep in ${OVERLAP_DEPS}; do
|
|
extern=$(ls ${STAGING_DIR_HOST}/${rustlibdir}/lib$dep-rs.{so,rlib} 2>/dev/null \
|
|
| awk '{print $1}');
|
|
if [ -n "$extern" ]; then
|
|
externs="$externs --extern $dep=$extern"
|
|
else
|
|
echo "$dep in depends but no such library found in ${rustlibdir}!" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
echo "$externs"
|
|
}
|
|
|
|
do_configure () {
|
|
}
|
|
|
|
oe_runrustc () {
|
|
bbnote ${RUSTC} ${RUSTC_ARCHFLAGS} ${RUSTC_FLAGS} "$@"
|
|
"${RUSTC}" ${RUSTC_ARCHFLAGS} ${RUSTC_FLAGS} "$@"
|
|
}
|
|
|
|
oe_compile_rust_lib () {
|
|
rm -rf ${LIBNAME}.{rlib,so}
|
|
local -a link_args
|
|
if [ -n '${@link_args(d, False)}' ]; then
|
|
link_args[0]='-C'
|
|
link_args[1]='link-args=${@link_args(d, False)}'
|
|
fi
|
|
oe_runrustc $(get_overlap_externs) \
|
|
"${link_args[@]}" \
|
|
${LIB_SRC} \
|
|
-o ${@libfilename(d)} \
|
|
--crate-name=${CRATE_NAME} --crate-type=${CRATE_TYPE} \
|
|
"$@"
|
|
}
|
|
oe_compile_rust_lib[vardeps] += "get_overlap_externs"
|
|
|
|
oe_compile_rust_bin () {
|
|
rm -rf ${BINNAME}
|
|
local -a link_args
|
|
if [ -n '${@link_args(d, True)}' ]; then
|
|
link_args[0]='-C'
|
|
link_args[1]='link-args=${@link_args(d, True)}'
|
|
fi
|
|
oe_runrustc $(get_overlap_externs) \
|
|
"${link_args[@]}" \
|
|
${BIN_SRC} -o ${BINNAME} "$@"
|
|
}
|
|
oe_compile_rust_bin[vardeps] += "get_overlap_externs"
|
|
|
|
oe_install_rust_lib () {
|
|
for lib in $(ls ${LIBNAME}.{so,rlib} 2>/dev/null); do
|
|
echo Installing $lib
|
|
install -D -m 755 $lib ${D}/${rustlibdest}/$lib
|
|
done
|
|
}
|
|
|
|
oe_install_rust_bin () {
|
|
echo Installing ${BINNAME}
|
|
install -D -m 755 ${BINNAME} ${D}/${rustbindest}/${BINNAME}
|
|
}
|
|
|
|
do_rust_bin_fixups() {
|
|
for f in `find ${PKGD} -name '*.so*'`; do
|
|
echo "Strip rust note: $f"
|
|
${OBJCOPY} -R .note.rustc $f $f
|
|
done
|
|
}
|
|
PACKAGE_PREPROCESS_FUNCS += "do_rust_bin_fixups"
|
|
|