nativesdk: Implement cross canadian support
This addition closes #236 requesting the SDK support. The implementation consists on a yet minimum set of worky functionality; - Includes rustc, rustdoc and cargo. - Includes libstd and accompanying lib archives for host and for target. - Integrates with the standard environment setup script. - Integrates configurations automatically build for target. The supported build host is still AMD64 only. Note that there's no need on introducing crosssdk package as the official snapshot package serves same way as a non SDK build. Possible future directions: - Offline build: - Support pre-cached set of crates that can be vendored. - Support pre-filled cargo registry. - Support further tools like cargo-fmt, cargo-clippy, GDB support and so on. Signed-off-by: Anatol Belski <anbelski@linux.microsoft.com>
This commit is contained in:
@@ -28,6 +28,7 @@ CARGO_DISABLE_BITBAKE_VENDORING ?= "0"
|
||||
# Used by libstd-rs to point to the vendor dir included in rustc src
|
||||
CARGO_VENDORING_DIRECTORY ?= "${CARGO_HOME}/bitbake"
|
||||
|
||||
CARGO_RUST_TARGET_CCLD ?= "${RUST_TARGET_CCLD}"
|
||||
cargo_common_do_configure () {
|
||||
mkdir -p ${CARGO_HOME}/bitbake
|
||||
|
||||
@@ -74,7 +75,7 @@ cargo_common_do_configure () {
|
||||
|
||||
# HOST_SYS
|
||||
[target.${HOST_SYS}]
|
||||
linker = "${RUST_TARGET_CCLD}"
|
||||
linker = "${CARGO_RUST_TARGET_CCLD}"
|
||||
EOF
|
||||
|
||||
if [ "${HOST_SYS}" != "${BUILD_SYS}" ]; then
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
SUMMARY = "Host SDK package for Rust cross canadian toolchain"
|
||||
PN = "packagegroup-rust-cross-canadian-${MACHINE}"
|
||||
|
||||
inherit cross-canadian packagegroup
|
||||
|
||||
PACKAGEGROUP_DISABLE_COMPLEMENTARY = "1"
|
||||
|
||||
RUST="rust-cross-canadian-${TRANSLATED_TARGET_ARCH}"
|
||||
CARGO="cargo-cross-canadian-${TRANSLATED_TARGET_ARCH}"
|
||||
|
||||
RDEPENDS_${PN} = " \
|
||||
${@all_multilib_tune_values(d, 'RUST')} \
|
||||
${@all_multilib_tune_values(d, 'CARGO')} \
|
||||
"
|
||||
|
||||
74
recipes-devtools/cargo/cargo-cross-canadian.inc
Normal file
74
recipes-devtools/cargo/cargo-cross-canadian.inc
Normal file
@@ -0,0 +1,74 @@
|
||||
SUMMARY = "Cargo, a package manager for Rust cross canadian flavor."
|
||||
|
||||
RUST_ALTERNATE_EXE_PATH = "${STAGING_LIBDIR_NATIVE}/llvm-rust/bin/llvm-config"
|
||||
|
||||
HOST_SYS = "${HOST_ARCH}-unknown-linux-gnu"
|
||||
CARGO_RUST_TARGET_CCLD = "${RUST_BUILD_CCLD}"
|
||||
|
||||
require recipes-devtools/rust/rust-common.inc
|
||||
require cargo.inc
|
||||
|
||||
CARGO = "${WORKDIR}/${CARGO_SNAPSHOT}/bin/cargo"
|
||||
BASEDEPENDS_remove = "cargo-native"
|
||||
|
||||
export RUST_TARGET_PATH="${WORKDIR}/targets/"
|
||||
|
||||
RUSTLIB = " \
|
||||
-L ${STAGING_DIR_NATIVE}/${SDKPATHNATIVE}/usr/lib/${TARGET_SYS}/rustlib/${HOST_SYS}/lib \
|
||||
"
|
||||
|
||||
DEPENDS += "rust-native \
|
||||
rust-cross-canadian-${TRANSLATED_TARGET_ARCH} \
|
||||
virtual/nativesdk-${HOST_PREFIX}compilerlibs \
|
||||
nativesdk-openssl nativesdk-zlib \
|
||||
virtual/nativesdk-libc \
|
||||
"
|
||||
|
||||
inherit cross-canadian
|
||||
|
||||
PN = "cargo-cross-canadian-${TRANSLATED_TARGET_ARCH}"
|
||||
|
||||
LLVM_TARGET[x86_64] = "${RUST_HOST_SYS}"
|
||||
|
||||
python do_rust_gen_targets () {
|
||||
wd = d.getVar('WORKDIR') + '/targets/'
|
||||
|
||||
rust_gen_target(d, 'BUILD', wd, "", "generic", d.getVar('BUILD_ARCH'))
|
||||
rust_gen_target(d, 'HOST', wd, "", "generic", d.getVar('HOST_ARCH'))
|
||||
}
|
||||
|
||||
do_compile_prepend () {
|
||||
PKG_CONFIG_PATH="${RECIPE_SYSROOT_NATIVE}/usr/lib/pkgconfig:${PKG_CONFIG_PATH}"
|
||||
}
|
||||
|
||||
do_install () {
|
||||
SYS_BINDIR=$(dirname ${D}${bindir})
|
||||
install -d "${SYS_BINDIR}"
|
||||
install -m 755 "${B}/target/${CARGO_TARGET_SUBDIR}/cargo" "${SYS_BINDIR}"
|
||||
for i in ${SYS_BINDIR}/*; do
|
||||
chrpath -r "\$ORIGIN/../lib" ${i}
|
||||
done
|
||||
|
||||
ENV_SETUP_DIR=${D}${base_prefix}/environment-setup.d
|
||||
mkdir "${ENV_SETUP_DIR}"
|
||||
ENV_SETUP_SH="${ENV_SETUP_DIR}/cargo.sh"
|
||||
cat <<- EOF > "${ENV_SETUP_SH}"
|
||||
export CARGO_HOME="\$OECORE_TARGET_SYSROOT/home/cargo"
|
||||
mkdir -p "\$CARGO_HOME"
|
||||
# Init the default target once, it might be otherwise user modified.
|
||||
if [ ! -f "\$CARGO_HOME/config" ]; then
|
||||
touch "\$CARGO_HOME/config"
|
||||
echo "[build]" >> "\$CARGO_HOME/config"
|
||||
echo 'target = "'${TARGET_SYS}'"' >> "\$CARGO_HOME/config"
|
||||
fi
|
||||
|
||||
# Keep the below off as long as HTTP/2 is disabled.
|
||||
export CARGO_HTTP_MULTIPLEXING=false
|
||||
|
||||
export CARGO_HTTP_CAINFO="\$OECORE_NATIVE_SYSROOT/etc/ssl/certs/ca-certificates.crt"
|
||||
EOF
|
||||
}
|
||||
|
||||
PKG_SYS_BINDIR = "${SDKPATHNATIVE}/usr/bin"
|
||||
FILES_${PN} += "${base_prefix}/environment-setup.d ${PKG_SYS_BINDIR}"
|
||||
|
||||
6
recipes-devtools/cargo/cargo-cross-canadian_1.49.0.bb
Normal file
6
recipes-devtools/cargo/cargo-cross-canadian_1.49.0.bb
Normal file
@@ -0,0 +1,6 @@
|
||||
require recipes-devtools/rust/rust-source-${PV}.inc
|
||||
require recipes-devtools/rust/rust-snapshot-${PV}.inc
|
||||
|
||||
FILESEXTRAPATHS_prepend := "${THISDIR}/cargo-${PV}:"
|
||||
|
||||
require cargo-cross-canadian.inc
|
||||
@@ -1,4 +1,4 @@
|
||||
SUMMARY = "Cargo, a package manager for Rust."
|
||||
SUMMARY ?= "Cargo, a package manager for Rust."
|
||||
HOMEPAGE = "https://crates.io"
|
||||
LICENSE = "MIT | Apache-2.0"
|
||||
SECTION = "devel"
|
||||
@@ -43,7 +43,7 @@ do_install () {
|
||||
# Needed for pkg-config to be used
|
||||
export LIBSSH2_SYS_USE_PKG_CONFIG = "1"
|
||||
|
||||
BBCLASSEXTEND = "native"
|
||||
BBCLASSEXTEND = "native nativesdk"
|
||||
|
||||
# When building cargo-native we don't have cargo-native to use and depend on,
|
||||
# so we must use the locally set up snapshot to bootstrap the build.
|
||||
|
||||
337
recipes-devtools/rust/rust-common.inc
Normal file
337
recipes-devtools/rust/rust-common.inc
Normal file
@@ -0,0 +1,337 @@
|
||||
|
||||
# Right now this is focused on arm-specific tune features.
|
||||
# We get away with this for now as one can only use x86-64 as the build host
|
||||
# (not arm).
|
||||
# Note that TUNE_FEATURES is _always_ refering to the target, so we really
|
||||
# don't want to use this for the host/build.
|
||||
def llvm_features_from_tune(d):
|
||||
f = []
|
||||
feat = d.getVar('TUNE_FEATURES')
|
||||
if not feat:
|
||||
return []
|
||||
feat = frozenset(feat.split())
|
||||
|
||||
mach_overrides = d.getVar('MACHINEOVERRIDES')
|
||||
mach_overrides = frozenset(mach_overrides.split(':'))
|
||||
|
||||
if 'vfpv4' in feat:
|
||||
f.append("+vfp4")
|
||||
if 'vfpv3' in feat:
|
||||
f.append("+vfp3")
|
||||
if 'vfpv3d16' in feat:
|
||||
f.append("+d16")
|
||||
|
||||
if 'vfpv2' in feat or 'vfp' in feat:
|
||||
f.append("+vfp2")
|
||||
|
||||
if 'neon' in feat:
|
||||
f.append("+neon")
|
||||
|
||||
if 'mips32' in feat:
|
||||
f.append("+mips32")
|
||||
|
||||
if 'mips32r2' in feat:
|
||||
f.append("+mips32r2")
|
||||
|
||||
if target_is_armv7(d):
|
||||
f.append('+v7')
|
||||
|
||||
if ('armv6' in mach_overrides) or ('armv6' in feat):
|
||||
f.append("+v6")
|
||||
|
||||
if 'dsp' in feat:
|
||||
f.append("+dsp")
|
||||
|
||||
if 'thumb' in feat:
|
||||
if d.getVar('ARM_THUMB_OPT') is "thumb":
|
||||
if target_is_armv7(d):
|
||||
f.append('+thumb2')
|
||||
f.append("+thumb-mode")
|
||||
|
||||
if 'cortexa5' in feat:
|
||||
f.append("+a5")
|
||||
if 'cortexa7' in feat:
|
||||
f.append("+a7")
|
||||
if 'cortexa9' in feat:
|
||||
f.append("+a9")
|
||||
if 'cortexa15' in feat:
|
||||
f.append("+a15")
|
||||
if 'cortexa17' in feat:
|
||||
f.append("+a17")
|
||||
if ('riscv64' in feat) or ('riscv32' in feat):
|
||||
f.append("+a,+c,+d,+f,+m")
|
||||
return f
|
||||
|
||||
# TARGET_CC_ARCH changes from build/cross/target so it'll do the right thing
|
||||
# this should go away when https://github.com/rust-lang/rust/pull/31709 is
|
||||
# stable (1.9.0?)
|
||||
def llvm_features_from_cc_arch(d):
|
||||
f = []
|
||||
feat = d.getVar('TARGET_CC_ARCH')
|
||||
if not feat:
|
||||
return []
|
||||
feat = frozenset(feat.split())
|
||||
|
||||
if '-mmmx' in feat:
|
||||
f.append("+mmx")
|
||||
if '-msse' in feat:
|
||||
f.append("+sse")
|
||||
if '-msse2' in feat:
|
||||
f.append("+sse2")
|
||||
if '-msse3' in feat:
|
||||
f.append("+sse3")
|
||||
if '-mssse3' in feat:
|
||||
f.append("+ssse3")
|
||||
if '-msse4.1' in feat:
|
||||
f.append("+sse4.1")
|
||||
if '-msse4.2' in feat:
|
||||
f.append("+sse4.2")
|
||||
if '-msse4a' in feat:
|
||||
f.append("+sse4a")
|
||||
if '-mavx' in feat:
|
||||
f.append("+avx")
|
||||
if '-mavx2' in feat:
|
||||
f.append("+avx2")
|
||||
|
||||
return f
|
||||
|
||||
def llvm_features_from_target_fpu(d):
|
||||
# TARGET_FPU can be hard or soft. +soft-float tell llvm to use soft float
|
||||
# ABI. There is no option for hard.
|
||||
|
||||
fpu = d.getVar('TARGET_FPU', True)
|
||||
return ["+soft-float"] if fpu == "soft" else []
|
||||
|
||||
def llvm_features(d):
|
||||
return ','.join(llvm_features_from_tune(d) +
|
||||
llvm_features_from_cc_arch(d) +
|
||||
llvm_features_from_target_fpu(d))
|
||||
|
||||
|
||||
## arm-unknown-linux-gnueabihf
|
||||
DATA_LAYOUT[arm] = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
|
||||
LLVM_TARGET[arm] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[arm] = "little"
|
||||
TARGET_POINTER_WIDTH[arm] = "32"
|
||||
TARGET_C_INT_WIDTH[arm] = "32"
|
||||
MAX_ATOMIC_WIDTH[arm] = "64"
|
||||
FEATURES[arm] = "+v6,+vfp2"
|
||||
|
||||
## armv7-unknown-linux-gnueabihf
|
||||
DATA_LAYOUT[armv7] = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
|
||||
LLVM_TARGET[armv7] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[armv7] = "little"
|
||||
TARGET_POINTER_WIDTH[armv7] = "32"
|
||||
TARGET_C_INT_WIDTH[armv7] = "32"
|
||||
MAX_ATOMIC_WIDTH[armv7] = "64"
|
||||
FEATURES[armv7] = "+v7,+vfp2,+thumb2"
|
||||
|
||||
## aarch64-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[aarch64] = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
|
||||
LLVM_TARGET[aarch64] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[aarch64] = "little"
|
||||
TARGET_POINTER_WIDTH[aarch64] = "64"
|
||||
TARGET_C_INT_WIDTH[aarch64] = "32"
|
||||
MAX_ATOMIC_WIDTH[aarch64] = "128"
|
||||
|
||||
## x86_64-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[x86_64] = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
LLVM_TARGET[x86_64] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[x86_64] = "little"
|
||||
TARGET_POINTER_WIDTH[x86_64] = "64"
|
||||
TARGET_C_INT_WIDTH[x86_64] = "32"
|
||||
MAX_ATOMIC_WIDTH[x86_64] = "64"
|
||||
|
||||
## i686-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[i686] = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
|
||||
LLVM_TARGET[i686] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[i686] = "little"
|
||||
TARGET_POINTER_WIDTH[i686] = "32"
|
||||
TARGET_C_INT_WIDTH[i686] = "32"
|
||||
MAX_ATOMIC_WIDTH[i686] = "64"
|
||||
|
||||
## XXX: a bit of a hack so qemux86 builds, clone of i686-unknown-linux-{gnu, musl} above
|
||||
DATA_LAYOUT[i586] = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
|
||||
LLVM_TARGET[i586] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[i586] = "little"
|
||||
TARGET_POINTER_WIDTH[i586] = "32"
|
||||
TARGET_C_INT_WIDTH[i586] = "32"
|
||||
MAX_ATOMIC_WIDTH[i586] = "64"
|
||||
|
||||
## mips-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[mips] = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"
|
||||
LLVM_TARGET[mips] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[mips] = "big"
|
||||
TARGET_POINTER_WIDTH[mips] = "32"
|
||||
TARGET_C_INT_WIDTH[mips] = "32"
|
||||
MAX_ATOMIC_WIDTH[mips] = "32"
|
||||
|
||||
## mipsel-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[mipsel] = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"
|
||||
LLVM_TARGET[mipsel] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[mipsel] = "little"
|
||||
TARGET_POINTER_WIDTH[mipsel] = "32"
|
||||
TARGET_C_INT_WIDTH[mipsel] = "32"
|
||||
MAX_ATOMIC_WIDTH[mipsel] = "32"
|
||||
|
||||
## mips64-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[mips64] = "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128"
|
||||
LLVM_TARGET[mips64] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[mips64] = "big"
|
||||
TARGET_POINTER_WIDTH[mips64] = "64"
|
||||
TARGET_C_INT_WIDTH[mips64] = "64"
|
||||
MAX_ATOMIC_WIDTH[mips64] = "64"
|
||||
|
||||
## mips64el-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[mips64el] = "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128"
|
||||
LLVM_TARGET[mips64el] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[mips64el] = "little"
|
||||
TARGET_POINTER_WIDTH[mips64el] = "64"
|
||||
TARGET_C_INT_WIDTH[mips64el] = "64"
|
||||
MAX_ATOMIC_WIDTH[mips64el] = "64"
|
||||
|
||||
## powerpc-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[powerpc] = "E-m:e-p:32:32-i64:64-n32"
|
||||
LLVM_TARGET[powerpc] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[powerpc] = "big"
|
||||
TARGET_POINTER_WIDTH[powerpc] = "32"
|
||||
TARGET_C_INT_WIDTH[powerpc] = "32"
|
||||
MAX_ATOMIC_WIDTH[powerpc] = "32"
|
||||
|
||||
## powerpc64le-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[powerpc64le] = "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512"
|
||||
LLVM_TARGET[powerpc64le] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[powerpc64le] = "little"
|
||||
TARGET_POINTER_WIDTH[powerpc64le] = "64"
|
||||
TARGET_C_INT_WIDTH[powerpc64le] = "64"
|
||||
MAX_ATOMIC_WIDTH[powerpc64le] = "64"
|
||||
|
||||
## riscv32-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[riscv32] = "e-m:e-p:32:32-i64:64-n32-S128"
|
||||
LLVM_TARGET[riscv32] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[riscv32] = "little"
|
||||
TARGET_POINTER_WIDTH[riscv32] = "32"
|
||||
TARGET_C_INT_WIDTH[riscv32] = "32"
|
||||
MAX_ATOMIC_WIDTH[riscv32] = "32"
|
||||
|
||||
## riscv64-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[riscv64] = "e-m:e-p:64:64-i64:64-i128:128-n64-S128"
|
||||
LLVM_TARGET[riscv64] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[riscv64] = "little"
|
||||
TARGET_POINTER_WIDTH[riscv64] = "64"
|
||||
TARGET_C_INT_WIDTH[riscv64] = "64"
|
||||
MAX_ATOMIC_WIDTH[riscv64] = "64"
|
||||
|
||||
def sys_for(d, thing):
|
||||
return d.getVar('{}_SYS'.format(thing))
|
||||
|
||||
def prefix_for(d, thing):
|
||||
return d.getVar('{}_PREFIX'.format(thing))
|
||||
|
||||
# Convert a normal arch (HOST_ARCH, TARGET_ARCH, BUILD_ARCH, etc) to something
|
||||
# rust's internals won't choke on.
|
||||
def arch_to_rust_target_arch(arch):
|
||||
if arch == "i586" or arch == "i686":
|
||||
return "x86"
|
||||
elif arch == "mipsel":
|
||||
return "mips"
|
||||
elif arch == "mip64sel":
|
||||
return "mips64"
|
||||
elif arch == "armv7":
|
||||
return "arm"
|
||||
else:
|
||||
return arch
|
||||
|
||||
# generates our target CPU value
|
||||
def llvm_cpu(d):
|
||||
cpu = d.getVar('PACKAGE_ARCH')
|
||||
target = d.getVar('TRANSLATED_TARGET_ARCH')
|
||||
|
||||
trans = {}
|
||||
trans['corei7-64'] = "corei7"
|
||||
trans['core2-32'] = "core2"
|
||||
trans['x86-64'] = "x86-64"
|
||||
trans['i686'] = "i686"
|
||||
trans['i586'] = "i586"
|
||||
trans['powerpc'] = "powerpc"
|
||||
trans['mips64'] = "mips64"
|
||||
trans['mips64el'] = "mips64"
|
||||
trans['riscv64'] = "generic-rv64"
|
||||
trans['riscv32'] = "generic-rv32"
|
||||
|
||||
if target in ["mips", "mipsel"]:
|
||||
feat = frozenset(d.getVar('TUNE_FEATURES').split())
|
||||
if "mips32r2" in feat:
|
||||
trans['mipsel'] = "mips32r2"
|
||||
trans['mips'] = "mips32r2"
|
||||
elif "mips32" in feat:
|
||||
trans['mipsel'] = "mips32"
|
||||
trans['mips'] = "mips32"
|
||||
|
||||
try:
|
||||
return trans[cpu]
|
||||
except:
|
||||
return trans.get(target, "generic")
|
||||
|
||||
TARGET_LLVM_CPU="${@llvm_cpu(d)}"
|
||||
TARGET_LLVM_FEATURES = "${@llvm_features(d)}"
|
||||
|
||||
# class-native implies TARGET=HOST, and TUNE_FEATURES only describes the real
|
||||
# (original) target.
|
||||
TARGET_LLVM_FEATURES_class-native = "${@','.join(llvm_features_from_cc_arch(d))}"
|
||||
|
||||
def rust_gen_target(d, thing, wd, features, cpu, arch):
|
||||
import json
|
||||
sys = sys_for(d, thing)
|
||||
prefix = prefix_for(d, thing)
|
||||
|
||||
features = features or d.getVarFlag('FEATURES', arch) or ""
|
||||
features = features.strip()
|
||||
|
||||
# build tspec
|
||||
tspec = {}
|
||||
tspec['llvm-target'] = d.getVarFlag('LLVM_TARGET', arch)
|
||||
tspec['data-layout'] = d.getVarFlag('DATA_LAYOUT', arch)
|
||||
tspec['max-atomic-width'] = int(d.getVarFlag('MAX_ATOMIC_WIDTH', arch))
|
||||
tspec['target-pointer-width'] = d.getVarFlag('TARGET_POINTER_WIDTH', arch)
|
||||
tspec['target-c-int-width'] = d.getVarFlag('TARGET_C_INT_WIDTH', arch)
|
||||
tspec['target-endian'] = d.getVarFlag('TARGET_ENDIAN', arch)
|
||||
tspec['arch'] = arch_to_rust_target_arch(arch)
|
||||
tspec['os'] = "linux"
|
||||
if "musl" in tspec['llvm-target']:
|
||||
tspec['env'] = "musl"
|
||||
else:
|
||||
tspec['env'] = "gnu"
|
||||
if "riscv64" in tspec['llvm-target']:
|
||||
tspec['llvm-abiname'] = "lp64d"
|
||||
if "riscv32" in tspec['llvm-target']:
|
||||
tspec['llvm-abiname'] = "ilp32d"
|
||||
tspec['vendor'] = "unknown"
|
||||
tspec['target-family'] = "unix"
|
||||
tspec['linker'] = "{}{}gcc".format(d.getVar('CCACHE'), prefix)
|
||||
tspec['ar'] = "{}ar".format(prefix)
|
||||
tspec['cpu'] = cpu
|
||||
if features is not "":
|
||||
tspec['features'] = features
|
||||
tspec['dynamic-linking'] = True
|
||||
tspec['executables'] = True
|
||||
tspec['linker-is-gnu'] = True
|
||||
tspec['linker-flavor'] = "gcc"
|
||||
tspec['has-rpath'] = True
|
||||
tspec['has-elf-tls'] = True
|
||||
tspec['position-independent-executables'] = True
|
||||
tspec['panic-strategy'] = d.getVar("RUST_PANIC_STRATEGY")
|
||||
|
||||
# write out the target spec json file
|
||||
with open(wd + sys + '.json', 'w') as f:
|
||||
json.dump(tspec, f, indent=4)
|
||||
|
||||
python do_rust_gen_targets () {
|
||||
wd = d.getVar('WORKDIR') + '/targets/'
|
||||
build_arch = d.getVar('BUILD_ARCH')
|
||||
rust_gen_target(d, 'BUILD', wd, "", "generic", build_arch)
|
||||
}
|
||||
|
||||
addtask rust_gen_targets after do_patch before do_compile
|
||||
do_rust_gen_targets[dirs] += "${WORKDIR}/targets"
|
||||
|
||||
225
recipes-devtools/rust/rust-cross-canadian.inc
Normal file
225
recipes-devtools/rust/rust-cross-canadian.inc
Normal file
@@ -0,0 +1,225 @@
|
||||
|
||||
RUST_ALTERNATE_EXE_PATH = "${STAGING_LIBDIR_NATIVE}/llvm-rust/bin/llvm-config"
|
||||
|
||||
require rust-target.inc
|
||||
|
||||
inherit cross-canadian
|
||||
|
||||
DEPENDS += " \
|
||||
virtual/${HOST_PREFIX}gcc-crosssdk \
|
||||
virtual/nativesdk-libc rust-llvm-native \
|
||||
virtual/${TARGET_PREFIX}compilerlibs \
|
||||
virtual/nativesdk-${HOST_PREFIX}compilerlibs \
|
||||
gcc-cross-${TARGET_ARCH} \
|
||||
"
|
||||
RUSTLIB_TARGET_PN = "rust-cross-canadian-rustlib-target-${TRANSLATED_TARGET_ARCH}"
|
||||
RUSTLIB_HOST_PN = "rust-cross-canadian-rustlib-host-${TRANSLATED_TARGET_ARCH}"
|
||||
RUSTLIB_PKGS = "${RUSTLIB_TARGET_PN} ${RUSTLIB_HOST_PN}"
|
||||
PN = "rust-cross-canadian-${TRANSLATED_TARGET_ARCH}"
|
||||
|
||||
PACKAGES = "${RUSTLIB_PKGS} ${PN}"
|
||||
RDEPENDS_${PN} += "${RUSTLIB_PKGS}"
|
||||
|
||||
# The host tools are likely not to be able to do the necessary operation on
|
||||
# the target architecturea. Alternatively one could check compatibility
|
||||
# between host/target.
|
||||
EXCLUDE_FROM_SHLIBS_${RUSTLIB_TARGET_PN} = "1"
|
||||
|
||||
DEBUG_PREFIX_MAP = "-fdebug-prefix-map=${WORKDIR}=/usr/src/debug/${PN}/${EXTENDPE}${PV}-${PR} \
|
||||
-fdebug-prefix-map=${STAGING_DIR_HOST}= \
|
||||
-fdebug-prefix-map=${STAGING_DIR_NATIVE}= \
|
||||
"
|
||||
|
||||
LLVM_TARGET[x86_64] = "${RUST_HOST_SYS}"
|
||||
python do_rust_gen_targets () {
|
||||
wd = d.getVar('WORKDIR') + '/targets/'
|
||||
rust_gen_target(d, 'TARGET', wd, d.getVar('TARGET_LLVM_FEATURES') or "", d.getVar('TARGET_LLVM_CPU'), d.getVar('TARGET_ARCH'))
|
||||
rust_gen_target(d, 'HOST', wd, "", "generic", d.getVar('HOST_ARCH'))
|
||||
rust_gen_target(d, 'BUILD', wd, "", "generic", d.getVar('BUILD_ARCH'))
|
||||
}
|
||||
|
||||
INHIBIT_DEFAULT_RUST_DEPS = "1"
|
||||
|
||||
# The default behaviour of x.py changed in 1.47+ so now we need to
|
||||
# explicitly ask for the stage 2 compiler to be assembled.
|
||||
do_compile () {
|
||||
rust_runx build --stage 2
|
||||
}
|
||||
|
||||
export TARGET_CC = "${CCACHE}${TARGET_PREFIX}gcc --sysroot=${STAGING_DIR_TARGET} ${TARGET_CC_ARCH} ${SECURITY_NOPIE_CFLAGS}"
|
||||
export TARGET_CXX = "${CCACHE}${TARGET_PREFIX}g++ --sysroot=${STAGING_DIR_TARGET} ${TARGET_CC_ARCH} ${SECURITY_NOPIE_CFLAGS}"
|
||||
export TARGET_CCLD = "${TARGET_PREFIX}gcc --sysroot=${STAGING_DIR_TARGET} ${TARGET_CC_ARCH} ${SECURITY_NOPIE_CFLAGS}"
|
||||
export TARGET_AR = "${TARGET_PREFIX}ar"
|
||||
|
||||
do_rust_create_wrappers () {
|
||||
mkdir -p "${WRAPPER_DIR}"
|
||||
|
||||
# Yocto Build / Rust Host C compiler
|
||||
create_wrapper "${RUST_BUILD_CC}" "${BUILD_CC}"
|
||||
# Yocto Build / Rust Host C++ compiler
|
||||
create_wrapper "${RUST_BUILD_CXX}" "${BUILD_CXX}"
|
||||
# Yocto Build / Rust Host linker
|
||||
create_wrapper "${RUST_BUILD_CCLD}" "${BUILD_CCLD}" "${BUILD_LDFLAGS}"
|
||||
# Yocto Build / Rust Host archiver
|
||||
create_wrapper "${RUST_BUILD_AR}" "${BUILD_AR}"
|
||||
|
||||
# Yocto Target / Rust Target C compiler
|
||||
create_wrapper "${RUST_TARGET_CC}" "${TARGET_CC}"
|
||||
# Yocto Target / Rust Target C++ compiler
|
||||
create_wrapper "${RUST_TARGET_CXX}" "${TARGET_CXX}"
|
||||
# Yocto Target / Rust Target linker
|
||||
create_wrapper "${RUST_TARGET_CCLD}" "${TARGET_CCLD}" "${TARGET_LDFLAGS}"
|
||||
# Yocto Target / Rust Target archiver
|
||||
create_wrapper "${RUST_TARGET_AR}" "${TARGET_AR}"
|
||||
}
|
||||
|
||||
python do_configure() {
|
||||
import json
|
||||
from distutils.version import LooseVersion
|
||||
try:
|
||||
import configparser
|
||||
except ImportError:
|
||||
import ConfigParser as configparser
|
||||
|
||||
# toml is rather similar to standard ini like format except it likes values
|
||||
# that look more JSON like. So for our purposes simply escaping all values
|
||||
# as JSON seem to work fine.
|
||||
|
||||
e = lambda s: json.dumps(s)
|
||||
|
||||
config = configparser.RawConfigParser()
|
||||
|
||||
# [target.ARCH-poky-linux]
|
||||
target_section = "target.{}".format(d.getVar('TARGET_SYS', True))
|
||||
config.add_section(target_section)
|
||||
|
||||
llvm_config = d.expand("${YOCTO_ALTERNATE_EXE_PATH}")
|
||||
config.set(target_section, "llvm-config", e(llvm_config))
|
||||
|
||||
config.set(target_section, "cxx", e(d.expand("${RUST_TARGET_CXX}")))
|
||||
config.set(target_section, "cc", e(d.expand("${RUST_TARGET_CC}")))
|
||||
config.set(target_section, "ar", e(d.expand("${RUST_TARGET_AR}")))
|
||||
|
||||
# If we don't do this rust-native will compile it's own llvm for BUILD.
|
||||
# [target.${BUILD_ARCH}-unknown-linux-gnu]
|
||||
target_section = "target.{}".format(d.getVar('SNAPSHOT_BUILD_SYS', True))
|
||||
config.add_section(target_section)
|
||||
|
||||
config.set(target_section, "llvm-config", e(llvm_config))
|
||||
|
||||
config.set(target_section, "cxx", e(d.expand("${RUST_BUILD_CXX}")))
|
||||
config.set(target_section, "cc", e(d.expand("${RUST_BUILD_CC}")))
|
||||
config.set(target_section, "ar", e(d.expand("${RUST_BUILD_AR}")))
|
||||
|
||||
# [rust]
|
||||
config.add_section("rust")
|
||||
config.set("rust", "rpath", e(True))
|
||||
config.set("rust", "channel", e("stable"))
|
||||
|
||||
if LooseVersion(d.getVar("PV")) < LooseVersion("1.32.0"):
|
||||
config.set("rust", "use-jemalloc", e(False))
|
||||
|
||||
# Whether or not to optimize the compiler and standard library
|
||||
config.set("rust", "optimize", e(True))
|
||||
|
||||
# [build]
|
||||
config.add_section("build")
|
||||
config.set("build", "submodules", e(False))
|
||||
config.set("build", "docs", e(False))
|
||||
|
||||
rustc = d.expand("${WORKDIR}/rust-snapshot/bin/rustc")
|
||||
config.set("build", "rustc", e(rustc))
|
||||
|
||||
cargo = d.expand("${WORKDIR}/rust-snapshot/bin/cargo")
|
||||
config.set("build", "cargo", e(cargo))
|
||||
|
||||
config.set("build", "vendor", e(True))
|
||||
|
||||
targets = [d.getVar("TARGET_SYS", True), "{}-unknown-linux-gnu".format(d.getVar("HOST_ARCH", True))]
|
||||
config.set("build", "target", e(targets))
|
||||
|
||||
hosts = ["{}-unknown-linux-gnu".format(d.getVar("HOST_ARCH", True))]
|
||||
config.set("build", "host", e(hosts))
|
||||
|
||||
# We can't use BUILD_SYS since that is something the rust snapshot knows
|
||||
# nothing about when trying to build some stage0 tools (like fabricate)
|
||||
config.set("build", "build", e(d.getVar("SNAPSHOT_BUILD_SYS", True)))
|
||||
|
||||
# [install]
|
||||
config.add_section("install")
|
||||
# ./x.py install doesn't have any notion of "destdir"
|
||||
# but we can prepend ${D} to all the directories instead
|
||||
config.set("install", "prefix", e(d.getVar("D", True) + d.getVar("prefix", True)))
|
||||
config.set("install", "bindir", e(d.getVar("D", True) + d.getVar("bindir", True)))
|
||||
config.set("install", "libdir", e(d.getVar("D", True) + d.getVar("libdir", True)))
|
||||
config.set("install", "datadir", e(d.getVar("D", True) + d.getVar("datadir", True)))
|
||||
config.set("install", "mandir", e(d.getVar("D", True) + d.getVar("mandir", True)))
|
||||
|
||||
with open("config.toml", "w") as f:
|
||||
f.write('changelog-seen = 2\n\n')
|
||||
config.write(f)
|
||||
|
||||
# set up ${WORKDIR}/cargo_home
|
||||
bb.build.exec_func("setup_cargo_environment", d)
|
||||
}
|
||||
|
||||
do_install () {
|
||||
# Rust requires /usr/lib to contain the libs.
|
||||
# Similar story is with /usr/bin ruquiring `lib` to be at the same level.
|
||||
# The required structure is retained for simplicity.
|
||||
SYS_LIBDIR=$(dirname ${D}${libdir})
|
||||
SYS_BINDIR=$(dirname ${D}${bindir})
|
||||
RUSTLIB_DIR=${SYS_LIBDIR}/${TARGET_SYS}/rustlib
|
||||
|
||||
install -d "${SYS_BINDIR}"
|
||||
cp build/${SNAPSHOT_BUILD_SYS}/stage2/bin/* ${SYS_BINDIR}
|
||||
for i in ${SYS_BINDIR}/*; do
|
||||
chrpath -r "\$ORIGIN/../lib" ${i}
|
||||
done
|
||||
|
||||
install -d "${D}${libdir}"
|
||||
cp -pRd build/${SNAPSHOT_BUILD_SYS}/stage2/lib/${TARGET_SYS}/*.so ${SYS_LIBDIR}
|
||||
cp -pRd build/${SNAPSHOT_BUILD_SYS}/stage2/lib/${TARGET_SYS}/rustlib ${RUSTLIB_DIR}
|
||||
|
||||
for i in ${SYS_LIBDIR}/*.so; do
|
||||
chrpath -r "\$ORIGIN/../lib" ${i}
|
||||
done
|
||||
for i in ${RUSTLIB_DIR}/*/lib/*.so; do
|
||||
chrpath -d ${i}
|
||||
done
|
||||
|
||||
install -m 0644 "${WORKDIR}/targets/${TARGET_SYS}.json" "${RUSTLIB_DIR}"
|
||||
|
||||
# TODO package the sources.
|
||||
|
||||
ENV_SETUP_DIR=${D}${base_prefix}/environment-setup.d
|
||||
mkdir "${ENV_SETUP_DIR}"
|
||||
ENV_SETUP_SH="${ENV_SETUP_DIR}/rust.sh"
|
||||
|
||||
cat <<- EOF > "${ENV_SETUP_SH}"
|
||||
export RUSTFLAGS="--sysroot=\$OECORE_NATIVE_SYSROOT/usr -C link-arg=--sysroot=\$OECORE_TARGET_SYSROOT -L\$OECORE_NATIVE_SYSROOT/usr/lib/${TARGET_SYS}/rustlib/${TARGET_SYS}/lib"
|
||||
export RUST_TARGET_PATH="\$OECORE_NATIVE_SYSROOT/usr/lib/${TARGET_SYS}/rustlib"
|
||||
EOF
|
||||
|
||||
chown -R root.root ${D}
|
||||
}
|
||||
|
||||
INSANE_SKIP_${RUSTLIB_TARGET_PN} = "file-rdeps arch ldflags"
|
||||
SKIP_FILEDEPS_${RUSTLIB_TARGET_PN} = "1"
|
||||
|
||||
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
|
||||
INHIBIT_PACKAGE_STRIP = "1"
|
||||
INHIBIT_SYSROOT_STRIP = "1"
|
||||
|
||||
PKG_SYS_LIBDIR = "${SDKPATHNATIVE}/usr/lib"
|
||||
PKG_SYS_BINDIR = "${SDKPATHNATIVE}/usr/bin"
|
||||
PKG_RUSTLIB_DIR = "${PKG_SYS_LIBDIR}/${TARGET_SYS}/rustlib"
|
||||
FILES_${PN} = "${PKG_SYS_LIBDIR}/*.so ${PKG_SYS_BINDIR} ${base_prefix}/environment-setup.d"
|
||||
FILES_${RUSTLIB_TARGET_PN} = "${PKG_RUSTLIB_DIR}/${TARGET_SYS} ${PKG_RUSTLIB_DIR}/${TARGET_SYS}.json"
|
||||
# Check more regarding the rustlib symlink, it might not work everywhere.
|
||||
FILES_${RUSTLIB_HOST_PN} = "${PKG_RUSTLIB_DIR}/${BUILD_ARCH}-unknown-linux-gnu"
|
||||
|
||||
SUMMARY_${RUSTLIB_TARGET_PN} = "Rust cross canadian libaries for ${TARGET_SYS}"
|
||||
SUMMARY_${RUSTLIB_HOST_PN} = "Rust cross canadian libaries for ${HOST_SYS}"
|
||||
SUMMARY_${PN} = "Rust crost canadian compiler"
|
||||
|
||||
9
recipes-devtools/rust/rust-cross-canadian_1.49.0.bb
Normal file
9
recipes-devtools/rust/rust-cross-canadian_1.49.0.bb
Normal file
@@ -0,0 +1,9 @@
|
||||
require rust-cross-canadian.inc
|
||||
require rust-source-${PV}.inc
|
||||
require rust-snapshot-${PV}.inc
|
||||
|
||||
FILESEXTRAPATHS_prepend := "${THISDIR}/rust:"
|
||||
|
||||
SRC_URI += "\
|
||||
file://0001-rustc_target-Fix-dash-vs-underscore-mismatches-in-op.patch \
|
||||
"
|
||||
@@ -20,7 +20,8 @@ export RUST_TARGET_PATH="${WORKDIR}/targets/"
|
||||
|
||||
export FORCE_CRATE_HASH="${BB_TASKHASH}"
|
||||
|
||||
export YOCTO_ALTERNATE_EXE_PATH = "${STAGING_LIBDIR}/llvm-rust/bin/llvm-config"
|
||||
RUST_ALTERNATE_EXE_PATH ?= "${STAGING_LIBDIR}/llvm-rust/bin/llvm-config"
|
||||
export YOCTO_ALTERNATE_EXE_PATH = "${RUST_ALTERNATE_EXE_PATH}"
|
||||
export YOCTO_ALTERNATE_MULTILIB_NAME = "/${BASELIB}"
|
||||
|
||||
# We don't want to use bitbakes vendoring because the rust sources do their
|
||||
@@ -41,350 +42,7 @@ setup_cargo_environment () {
|
||||
printf "linker = '%s'\n" "${RUST_BUILD_CCLD}" >> ${CARGO_HOME}/config
|
||||
}
|
||||
|
||||
# Right now this is focused on arm-specific tune features.
|
||||
# We get away with this for now as one can only use x86-64 as the build host
|
||||
# (not arm).
|
||||
# Note that TUNE_FEATURES is _always_ refering to the target, so we really
|
||||
# don't want to use this for the host/build.
|
||||
def llvm_features_from_tune(d):
|
||||
f = []
|
||||
feat = d.getVar('TUNE_FEATURES')
|
||||
if not feat:
|
||||
return []
|
||||
feat = frozenset(feat.split())
|
||||
|
||||
mach_overrides = d.getVar('MACHINEOVERRIDES')
|
||||
mach_overrides = frozenset(mach_overrides.split(':'))
|
||||
|
||||
if 'vfpv4' in feat:
|
||||
f.append("+vfp4")
|
||||
if 'vfpv3' in feat:
|
||||
f.append("+vfp3")
|
||||
if 'vfpv3d16' in feat:
|
||||
f.append("+d16")
|
||||
|
||||
if 'vfpv2' in feat or 'vfp' in feat:
|
||||
f.append("+vfp2")
|
||||
|
||||
if 'neon' in feat:
|
||||
f.append("+neon")
|
||||
|
||||
if 'mips32' in feat:
|
||||
f.append("+mips32")
|
||||
|
||||
if 'mips32r2' in feat:
|
||||
f.append("+mips32r2")
|
||||
|
||||
if target_is_armv7(d):
|
||||
f.append('+v7')
|
||||
|
||||
if ('armv6' in mach_overrides) or ('armv6' in feat):
|
||||
f.append("+v6")
|
||||
|
||||
if 'dsp' in feat:
|
||||
f.append("+dsp")
|
||||
|
||||
if 'thumb' in feat:
|
||||
if d.getVar('ARM_THUMB_OPT') is "thumb":
|
||||
if target_is_armv7(d):
|
||||
f.append('+thumb2')
|
||||
f.append("+thumb-mode")
|
||||
|
||||
if 'cortexa5' in feat:
|
||||
f.append("+a5")
|
||||
if 'cortexa7' in feat:
|
||||
f.append("+a7")
|
||||
if 'cortexa9' in feat:
|
||||
f.append("+a9")
|
||||
if 'cortexa15' in feat:
|
||||
f.append("+a15")
|
||||
if 'cortexa17' in feat:
|
||||
f.append("+a17")
|
||||
if ('riscv64' in feat) or ('riscv32' in feat):
|
||||
f.append("+a,+c,+d,+f,+m")
|
||||
return f
|
||||
|
||||
# TARGET_CC_ARCH changes from build/cross/target so it'll do the right thing
|
||||
# this should go away when https://github.com/rust-lang/rust/pull/31709 is
|
||||
# stable (1.9.0?)
|
||||
def llvm_features_from_cc_arch(d):
|
||||
f = []
|
||||
feat = d.getVar('TARGET_CC_ARCH')
|
||||
if not feat:
|
||||
return []
|
||||
feat = frozenset(feat.split())
|
||||
|
||||
if '-mmmx' in feat:
|
||||
f.append("+mmx")
|
||||
if '-msse' in feat:
|
||||
f.append("+sse")
|
||||
if '-msse2' in feat:
|
||||
f.append("+sse2")
|
||||
if '-msse3' in feat:
|
||||
f.append("+sse3")
|
||||
if '-mssse3' in feat:
|
||||
f.append("+ssse3")
|
||||
if '-msse4.1' in feat:
|
||||
f.append("+sse4.1")
|
||||
if '-msse4.2' in feat:
|
||||
f.append("+sse4.2")
|
||||
if '-msse4a' in feat:
|
||||
f.append("+sse4a")
|
||||
if '-mavx' in feat:
|
||||
f.append("+avx")
|
||||
if '-mavx2' in feat:
|
||||
f.append("+avx2")
|
||||
|
||||
return f
|
||||
|
||||
def llvm_features_from_target_fpu(d):
|
||||
# TARGET_FPU can be hard or soft. +soft-float tell llvm to use soft float
|
||||
# ABI. There is no option for hard.
|
||||
|
||||
fpu = d.getVar('TARGET_FPU', True)
|
||||
return ["+soft-float"] if fpu == "soft" else []
|
||||
|
||||
def llvm_features(d):
|
||||
return ','.join(llvm_features_from_tune(d) +
|
||||
llvm_features_from_cc_arch(d) +
|
||||
llvm_features_from_target_fpu(d))
|
||||
|
||||
## arm-unknown-linux-gnueabihf
|
||||
DATA_LAYOUT[arm] = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
|
||||
LLVM_TARGET[arm] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[arm] = "little"
|
||||
TARGET_POINTER_WIDTH[arm] = "32"
|
||||
TARGET_C_INT_WIDTH[arm] = "32"
|
||||
MAX_ATOMIC_WIDTH[arm] = "64"
|
||||
FEATURES[arm] = "+v6,+vfp2"
|
||||
|
||||
## armv7-unknown-linux-gnueabihf
|
||||
DATA_LAYOUT[armv7] = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
|
||||
LLVM_TARGET[armv7] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[armv7] = "little"
|
||||
TARGET_POINTER_WIDTH[armv7] = "32"
|
||||
TARGET_C_INT_WIDTH[armv7] = "32"
|
||||
MAX_ATOMIC_WIDTH[armv7] = "64"
|
||||
FEATURES[armv7] = "+v7,+vfp2,+thumb2"
|
||||
|
||||
## aarch64-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[aarch64] = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
|
||||
LLVM_TARGET[aarch64] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[aarch64] = "little"
|
||||
TARGET_POINTER_WIDTH[aarch64] = "64"
|
||||
TARGET_C_INT_WIDTH[aarch64] = "32"
|
||||
MAX_ATOMIC_WIDTH[aarch64] = "128"
|
||||
|
||||
## x86_64-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[x86_64] = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
LLVM_TARGET[x86_64] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[x86_64] = "little"
|
||||
TARGET_POINTER_WIDTH[x86_64] = "64"
|
||||
TARGET_C_INT_WIDTH[x86_64] = "32"
|
||||
MAX_ATOMIC_WIDTH[x86_64] = "64"
|
||||
|
||||
## i686-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[i686] = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
|
||||
LLVM_TARGET[i686] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[i686] = "little"
|
||||
TARGET_POINTER_WIDTH[i686] = "32"
|
||||
TARGET_C_INT_WIDTH[i686] = "32"
|
||||
MAX_ATOMIC_WIDTH[i686] = "64"
|
||||
|
||||
## XXX: a bit of a hack so qemux86 builds, clone of i686-unknown-linux-{gnu, musl} above
|
||||
DATA_LAYOUT[i586] = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
|
||||
LLVM_TARGET[i586] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[i586] = "little"
|
||||
TARGET_POINTER_WIDTH[i586] = "32"
|
||||
TARGET_C_INT_WIDTH[i586] = "32"
|
||||
MAX_ATOMIC_WIDTH[i586] = "64"
|
||||
|
||||
## mips-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[mips] = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"
|
||||
LLVM_TARGET[mips] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[mips] = "big"
|
||||
TARGET_POINTER_WIDTH[mips] = "32"
|
||||
TARGET_C_INT_WIDTH[mips] = "32"
|
||||
MAX_ATOMIC_WIDTH[mips] = "32"
|
||||
|
||||
## mipsel-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[mipsel] = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"
|
||||
LLVM_TARGET[mipsel] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[mipsel] = "little"
|
||||
TARGET_POINTER_WIDTH[mipsel] = "32"
|
||||
TARGET_C_INT_WIDTH[mipsel] = "32"
|
||||
MAX_ATOMIC_WIDTH[mipsel] = "32"
|
||||
|
||||
## mips64-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[mips64] = "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128"
|
||||
LLVM_TARGET[mips64] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[mips64] = "big"
|
||||
TARGET_POINTER_WIDTH[mips64] = "64"
|
||||
TARGET_C_INT_WIDTH[mips64] = "64"
|
||||
MAX_ATOMIC_WIDTH[mips64] = "64"
|
||||
|
||||
## mips64el-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[mips64el] = "e-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128"
|
||||
LLVM_TARGET[mips64el] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[mips64el] = "little"
|
||||
TARGET_POINTER_WIDTH[mips64el] = "64"
|
||||
TARGET_C_INT_WIDTH[mips64el] = "64"
|
||||
MAX_ATOMIC_WIDTH[mips64el] = "64"
|
||||
|
||||
## powerpc-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[powerpc] = "E-m:e-p:32:32-i64:64-n32"
|
||||
LLVM_TARGET[powerpc] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[powerpc] = "big"
|
||||
TARGET_POINTER_WIDTH[powerpc] = "32"
|
||||
TARGET_C_INT_WIDTH[powerpc] = "32"
|
||||
MAX_ATOMIC_WIDTH[powerpc] = "32"
|
||||
|
||||
## powerpc64le-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[powerpc64le] = "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512"
|
||||
LLVM_TARGET[powerpc64le] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[powerpc64le] = "little"
|
||||
TARGET_POINTER_WIDTH[powerpc64le] = "64"
|
||||
TARGET_C_INT_WIDTH[powerpc64le] = "64"
|
||||
MAX_ATOMIC_WIDTH[powerpc64le] = "64"
|
||||
|
||||
## riscv32-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[riscv32] = "e-m:e-p:32:32-i64:64-n32-S128"
|
||||
LLVM_TARGET[riscv32] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[riscv32] = "little"
|
||||
TARGET_POINTER_WIDTH[riscv32] = "32"
|
||||
TARGET_C_INT_WIDTH[riscv32] = "32"
|
||||
MAX_ATOMIC_WIDTH[riscv32] = "32"
|
||||
|
||||
## riscv64-unknown-linux-{gnu, musl}
|
||||
DATA_LAYOUT[riscv64] = "e-m:e-p:64:64-i64:64-i128:128-n64-S128"
|
||||
LLVM_TARGET[riscv64] = "${RUST_TARGET_SYS}"
|
||||
TARGET_ENDIAN[riscv64] = "little"
|
||||
TARGET_POINTER_WIDTH[riscv64] = "64"
|
||||
TARGET_C_INT_WIDTH[riscv64] = "64"
|
||||
MAX_ATOMIC_WIDTH[riscv64] = "64"
|
||||
|
||||
def sys_for(d, thing):
|
||||
return d.getVar('{}_SYS'.format(thing))
|
||||
|
||||
def prefix_for(d, thing):
|
||||
return d.getVar('{}_PREFIX'.format(thing))
|
||||
|
||||
# Convert a normal arch (HOST_ARCH, TARGET_ARCH, BUILD_ARCH, etc) to something
|
||||
# rust's internals won't choke on.
|
||||
def arch_to_rust_target_arch(arch):
|
||||
if arch == "i586" or arch == "i686":
|
||||
return "x86"
|
||||
elif arch == "mipsel":
|
||||
return "mips"
|
||||
elif arch == "mip64sel":
|
||||
return "mips64"
|
||||
elif arch == "armv7":
|
||||
return "arm"
|
||||
else:
|
||||
return arch
|
||||
|
||||
# generates our target CPU value
|
||||
def llvm_cpu(d):
|
||||
# First check if TUNE_CCARGS gives us a specific CPU to build for (via -march).
|
||||
# Translate that GCC -march flag to a Rust/LLVM CPU.
|
||||
trans = {}
|
||||
trans['btver2'] = "btver2"
|
||||
trans['core2'] = "core2"
|
||||
trans['mips32'] = "mips32"
|
||||
trans['mips32r2'] = "mips32r2"
|
||||
trans['nehalem'] = "nehalem"
|
||||
trans['skylake'] = "skylake"
|
||||
|
||||
for arg in (d.getVar('TUNE_CCARGS') or '').split():
|
||||
if arg.startswith('-march='):
|
||||
march = arg[7:]
|
||||
cpu = trans.get(march)
|
||||
if cpu:
|
||||
return cpu
|
||||
|
||||
# If we don't have -march in TUNE_CCARGS, check TRANSLATED_TARGET_ARCH.
|
||||
# This must also be translated into a Rust/LLVM CPU.
|
||||
trans = {}
|
||||
trans['i586'] = "i586"
|
||||
trans['i686'] = "i686"
|
||||
trans['mips64'] = "mips64"
|
||||
trans['mips64el'] = "mips64"
|
||||
trans['powerpc'] = "ppc"
|
||||
trans['powerpc64'] = "ppc64"
|
||||
trans['riscv32'] = "generic-rv32"
|
||||
trans['riscv64'] = "generic-rv64"
|
||||
trans['x86-64'] = "x86-64"
|
||||
|
||||
target = d.getVar('TRANSLATED_TARGET_ARCH')
|
||||
cpu = trans.get(target)
|
||||
if cpu:
|
||||
return cpu
|
||||
|
||||
# If we still didn't get a target CPU, choose "generic".
|
||||
# Further optimization can still happen via llvm_features.
|
||||
return "generic"
|
||||
|
||||
TARGET_LLVM_CPU="${@llvm_cpu(d)}"
|
||||
TARGET_LLVM_FEATURES = "${@llvm_features(d)}"
|
||||
|
||||
# class-native implies TARGET=HOST, and TUNE_FEATURES only describes the real
|
||||
# (original) target.
|
||||
TARGET_LLVM_FEATURES_class-native = "${@','.join(llvm_features_from_cc_arch(d))}"
|
||||
|
||||
def rust_gen_target(d, thing, wd, features, cpu, arch):
|
||||
import json
|
||||
sys = sys_for(d, thing)
|
||||
prefix = prefix_for(d, thing)
|
||||
|
||||
features = features or d.getVarFlag('FEATURES', arch) or ""
|
||||
features = features.strip()
|
||||
|
||||
# build tspec
|
||||
tspec = {}
|
||||
tspec['llvm-target'] = d.getVarFlag('LLVM_TARGET', arch)
|
||||
tspec['data-layout'] = d.getVarFlag('DATA_LAYOUT', arch)
|
||||
tspec['max-atomic-width'] = int(d.getVarFlag('MAX_ATOMIC_WIDTH', arch))
|
||||
tspec['target-pointer-width'] = d.getVarFlag('TARGET_POINTER_WIDTH', arch)
|
||||
tspec['target-c-int-width'] = d.getVarFlag('TARGET_C_INT_WIDTH', arch)
|
||||
tspec['target-endian'] = d.getVarFlag('TARGET_ENDIAN', arch)
|
||||
tspec['arch'] = arch_to_rust_target_arch(arch)
|
||||
tspec['os'] = "linux"
|
||||
if "musl" in tspec['llvm-target']:
|
||||
tspec['env'] = "musl"
|
||||
else:
|
||||
tspec['env'] = "gnu"
|
||||
if "riscv64" in tspec['llvm-target']:
|
||||
tspec['llvm-abiname'] = "lp64d"
|
||||
if "riscv32" in tspec['llvm-target']:
|
||||
tspec['llvm-abiname'] = "ilp32d"
|
||||
tspec['vendor'] = "unknown"
|
||||
tspec['target-family'] = "unix"
|
||||
tspec['linker'] = "{}{}gcc".format(d.getVar('CCACHE'), prefix)
|
||||
tspec['ar'] = "{}ar".format(prefix)
|
||||
tspec['cpu'] = cpu
|
||||
if features is not "":
|
||||
tspec['features'] = features
|
||||
tspec['dynamic-linking'] = True
|
||||
tspec['executables'] = True
|
||||
tspec['linker-is-gnu'] = True
|
||||
tspec['linker-flavor'] = "gcc"
|
||||
tspec['has-rpath'] = True
|
||||
tspec['has-elf-tls'] = True
|
||||
tspec['position-independent-executables'] = True
|
||||
tspec['panic-strategy'] = d.getVar("RUST_PANIC_STRATEGY")
|
||||
|
||||
# write out the target spec json file
|
||||
with open(wd + sys + '.json', 'w') as f:
|
||||
json.dump(tspec, f, indent=4)
|
||||
|
||||
python do_rust_gen_targets () {
|
||||
wd = d.getVar('WORKDIR') + '/targets/'
|
||||
build_arch = d.getVar('BUILD_ARCH')
|
||||
rust_gen_target(d, 'BUILD', wd, "", "generic", build_arch)
|
||||
}
|
||||
|
||||
addtask rust_gen_targets after do_patch before do_compile
|
||||
do_rust_gen_targets[dirs] += "${WORKDIR}/targets"
|
||||
include rust-common.inc
|
||||
|
||||
do_rust_setup_snapshot () {
|
||||
for installer in "${WORKDIR}/rust-snapshot-components/"*"/install.sh"; do
|
||||
@@ -399,7 +57,6 @@ do_rust_setup_snapshot () {
|
||||
addtask rust_setup_snapshot after do_unpack before do_configure
|
||||
do_rust_setup_snapshot[dirs] += "${WORKDIR}/rust-snapshot"
|
||||
|
||||
|
||||
python do_configure() {
|
||||
import json
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user