Beta Rust Compiler


ashcloud

-- BANNED! -- Lactose Intolerant Volcano
Joined
Jul 2, 2010
Messages
297
Location
guru.awakes.dormant
Hi,
finally I'm posting something in this section of the boards too :)

Anyway, here is a rust compiler that runs on the Pandora:
http://pandora.ditzydoo.de/rust/rust-1.16.0-dev.tar.gz (80MB)
sha256sum: ad13c8f03f83e033aed69ffe95cfb8291febf82a7ff79cefecfbe27c1ed40ad6

You will want to use this from inside the Code::Blocks environment, since the Rust compiler requires a C compiler for linking stuff (a little weird, don't ask me, I dunno why it doesn't use ld directly).

- Currently this build is compiling to armv6 code and doesn't use the fpu at all. I'll try to figure out how to change that.
- This build doesn't correspond to any version number, it's just build from what was in the git yesterday.

To install and compile the default hello world program, do this from inside of your Code::Blocks environment:
Code:
wget http://pandora.ditzydoo.de/rust/rust-1.16.0-dev.tar.gz
if [ "$(sha256sum rust-1.16.0-dev.tar.gz)" == "ad13c8f03f83e033aed69ffe95cfb8291febf82a7ff79cefecfbe27c1ed40ad6  rust-1.16.0-dev.tar.gz" ]; then
    tar -xvf rust-1.16.0-dev.tar.gz
else
    echo broken download
fi
export PATH="$(pwd)/rust-1.16.0-dev/bin/:$PATH"
cargo new helloworld --bin
cd helloworld/ && cargo run
 
ah.. I did some helloworld things in RUST to try it out... nice to have it on the Pandy. Thanks!
 
Hi all :)

@ashcloud : sorry for the late reply, and thanks for giving Rust a go on the Pandora !

I tried it today, and it works fine with @ptitSeb 's latest beta Code::Blocks.

Could you please give some pointers about how you managed to build Rust 1.16 for the Pandora ? I'm currently trying to build the latest stable version from source (1.17), but I'm failing miserably...

Cheers, Magic Sam
 
Hi all :)

@ashcloud : sorry for the late reply, and thanks for giving Rust a go on the Pandora !

I tried it today, and it works fine with @ptitSeb 's latest beta Code::Blocks.

Could you please give some pointers about how you managed to build Rust 1.16 for the Pandora ? I'm currently trying to build the latest stable version from source (1.17), but I'm failing miserably...

Cheers, Magic Sam

Hi!
Well, that was a little tricky. Here are some problems I remember and how I solved them:
1. The Pandora doesn't like to run the prebuild rust binaries - which are required to build the new ones - due to older versions of some libraries. (But you should be able to run the ones I compiled) What I did was to steal some libraries from debian, renamed the binaries (be sure to leave them in the same directory though) and put in their place a script that runs the binaries with LD_PRELOAD set to load the libraries.
2. The Pandora doesn't have enough memory to build the rust compiler. I copied over the complete rootfs of my Pandora (while the Code::Blocks pnd was mounted, so its contents are copied as well) to an external drive. I used the drive in my odroid-board which has 2GB of RAM and a few more cores. Any other ARM-board with sufficient memory and linux running on it should do the trick. Should even be possible on a rooted android device.
I mounted the filesystem there, mounted some important directories and then did chroot into the Pandora-filesystem.
Code:
cd /foo/pandora-root/
for i in sys class proc dev dev/pts; do mount --bind /$i ./$i; done
chroot . su -
To get the compiler from Code::Blocks running in the chroot, I just called env on my Pandora inside the Code::Blocks terminal. Be sure to set the same environment variables on the chroot and the compiler should work just fine:
Code:
env | sed -n 's/\([^=]*\)=\(.*\)/export \1='\''\2'\''/p'
(just a dirty way to quote the output of env, so you can just run it from bash.)

Yeah, it's a little bit of a dirty hack :D It would be nice to get this running using a cross-compiler instead. Maybe I'll try that again, but I don't have much time for that right now.

If you have any other questions, just ask. But a descriptions of what you did and some error messages would be nice.
 
Hi all !

@ashcloud : thanks for answering my post :)

I'm trying to compile Rust 1.17 on the Pandora with @ptitSeb's latest beta Code::Blocks, and with your rustc and cargo binaries to speed things up.

Here is my config.toml file:
# Sample TOML configuration file for building Rust.
#
# To configure rustbuild, copy this file to the directory from which you will be
# running the build, and name it config.toml.
#
# All options are commented out by default in this file, and they're commented
# out with their default values. The build system by default looks for
# `config.toml` in the current directory of a build for build configuration, but
# a custom configuration file can also be specified with `--config` to the build
# system.

# =============================================================================
# Tweaking how LLVM is compiled
# =============================================================================
[llvm]

# Indicates whether the LLVM build is a Release or Debug build
#optimize = true

# Indicates whether an LLVM Release build should include debug info
#release-debuginfo = false

# Indicates whether the LLVM assertions are enabled or not
#assertions = false

# Indicates whether ccache is used when building LLVM
#ccache = false
# or alternatively ...
#ccache = "/path/to/ccache"

# If an external LLVM root is specified, we automatically check the version by
# default to make sure it's within the range that we're expecting, but setting
# this flag will indicate that this version check should not be done.
#version-check = false

version-check = true

# Link libstdc++ statically into the librustc_llvm instead of relying on a
# dynamic version to be available.
#static-libstdcpp = false

# Tell the LLVM build system to use Ninja instead of the platform default for
# the generated build system. This can sometimes be faster than make, for
# example.
#ninja = false

# LLVM targets to build support for.
# Note: this is NOT related to Rust compilation targets. However, as Rust is
# dependent on LLVM for code generation, turning targets off here WILL lead to
# the resulting rustc being unable to compile for the disabled architectures.
# Also worth pointing out is that, in case support for new targets are added to
# LLVM, enabling them here doesn't mean Rust is automatically gaining said
# support. You'll need to write a target specification at least, and most
# likely, teach rustc about the C ABI of the target. Get in touch with the
# Rust team and file an issue if you need assistance in porting!
#targets = "X86;ARM;AArch64;Mips;PowerPC;SystemZ;JSBackend;MSP430;Sparc;NVPTX"

targets = "ARM"

# Cap the number of parallel linker invocations when compiling LLVM.
# This can be useful when building LLVM with debug info, which significantly
# increases the size of binaries and consequently the memory required by
# each linker process.
# If absent or 0, linker invocations are treated like any other job and
# controlled by rustbuild's -j parameter.
#link-jobs = 0

# Delete LLVM build directory on LLVM rebuild.
# This option defaults to `false` for local development, but CI may want to
# always perform clean full builds (possibly accelerated by (s)ccache).
#clean-rebuild = false

# =============================================================================
# General build configuration options
# =============================================================================
[build]

# Build triple for the original snapshot compiler. This must be a compiler that
# nightlies are already produced for. The current platform must be able to run
# binaries of this build triple and the nightly will be used to bootstrap the
# first compiler.
#build = "x86_64-unknown-linux-gnu" # defaults to your host platform

#build = "arm-unknown-linux-gnueabi"

# In addition to the build triple, other triples to produce full compiler
# toolchains for. Each of these triples will be bootstrapped from the build
# triple and then will continue to bootstrap themselves. This platform must
# currently be able to run all of the triples provided here.
#host = ["x86_64-unknown-linux-gnu"] # defaults to just the build triple

#host = ["arm-unknown-linux-gnueabi"]

# In addition to all host triples, other triples to produce the standard library
# for. Each host triple will be used to produce a copy of the standard library
# for each target triple.
#target = ["x86_64-unknown-linux-gnu"] # defaults to just the build triple

#target = ["arm-unknown-linux-gnueabi"]

# Instead of downloading the src/nightlies.txt version of Cargo specified, use
# this Cargo binary instead to build all Rust code
#cargo = "/path/to/bin/cargo"

cargo = "/media/Pandora1/dev/rust-dev/rust-1.16.0-dev/bin/cargo"

# Instead of downloading the src/nightlies.txt version of the compiler
# specified, use this rustc binary instead as the stage0 snapshot compiler.
#rustc = "/path/to/bin/rustc"

rustc = "/media/Pandora1/dev/rust-dev/rust-1.16.0-dev/bin/rustc"

# Flag to specify whether any documentation is built. If false, rustdoc and
# friends will still be compiled but they will not be used to generate any
# documentation.
#docs = true

# Indicate whether the compiler should be documented in addition to the standard
# library and facade crates.
#compiler-docs = false

# Indicate whether submodules are managed and updated automatically.
#submodules = true

# The path to (or name of) the GDB executable to use. This is only used for
# executing the debuginfo test suite.
#gdb = "gdb"

# The node.js executable to use. Note that this is only used for the emscripten
# target when running tests, otherwise this can be omitted.
#nodejs = "node"

# Python interpreter to use for various tasks throughout the build, notably
# rustdoc tests, the lldb python interpreter, and some dist bits and pieces.
# Note that Python 2 is currently required.
#python = "python2.7"

python = "/mnt/utmp/wxpython/bin/python2.7"

# Force Cargo to check that Cargo.lock describes the precise dependency
# set that all the Cargo.toml files create, instead of updating it.
#locked-deps = false

locked-deps = true

# Indicate whether the vendored sources are used for Rust dependencies or not
#vendor = false

# Typically the build system will build the rust compiler twice. The second
# compiler, however, will simply use its own libraries to link against. If you
# would rather to perform a full bootstrap, compiling the compiler three times,
# then you can set this option to true. You shouldn't ever need to set this
# option to true.
#full-bootstrap = false

# Enable a build of the and extended rust tool set which is not only the
# compiler but also tools such as Cargo. This will also produce "combined
# installers" which are used to install Rust and Cargo together. This is
# disabled by default.
#extended = false

# Verbosity level: 0 == not verbose, 1 == verbose, 2 == very verbose
#verbose = 0

verbosity = 2

# Build the sanitizer runtimes
#sanitizers = false

# Indicates whether the OpenSSL linked into Cargo will be statically linked or
# not. If static linkage is specified then the build system will download a
# known-good version of OpenSSL, compile it, and link it to Cargo.
#openssl-static = false

# =============================================================================
# General install configuration options
# =============================================================================
[install]

# Instead of installing to /usr/local, install to this path instead.
#prefix = "/usr/local"

prefix = "/mnt/utmp/codeblocks/usr/local"

# Where to install libraries in `prefix` above
#libdir = "lib"

# Where to install man pages in `prefix` above
#mandir = "share/man"

# Where to install documentation in `prefix` above
#docdir = "share/doc/rust"

# =============================================================================
# Options for compiling Rust code itself
# =============================================================================
[rust]

# Whether or not to optimize the compiler and standard library
#optimize = true

optimize = false

# Number of codegen units to use for each compiler invocation. A value of 0
# means "the number of cores on this machine", and 1+ is passed through to the
# compiler.
#codegen-units = 1

codegen-units = 0

# Whether or not debug assertions are enabled for the compiler and standard
# library
#debug-assertions = false

# Whether or not debuginfo is emitted
#debuginfo = false

# Whether or not line number debug information is emitted
#debuginfo-lines = false

# Whether or not to only build debuginfo for the standard library if enabled.
# If enabled, this will not compile the compiler with debuginfo, just the
# standard library.
#debuginfo-only-std = false

# Whether or not jemalloc is built and enabled
#use-jemalloc = true

# Whether or not jemalloc is built with its debug option set
#debug-jemalloc = false

# Whether or not `panic!`s generate backtraces (RUST_BACKTRACE)
#backtrace = true

# The default linker that will be used by the generated compiler. Note that this
# is not the linker used to link said compiler.
#default-linker = "cc"

default-linker = "/mnt/utmp/codeblocks/usr/bin/gcc"

# The default ar utility that will be used by the generated compiler if LLVM
# cannot be used. Note that this is not used to assemble said compiler.
#default-ar = "ar"

default-ar = "/mnt/utmp/codeblocks/usr/bin/ar"

# The "channel" for the Rust build to produce. The stable/beta channels only
# allow using stable features, whereas the nightly and dev channels allow using
# nightly features
#channel = "dev"

channel = "stable"

# By default the `rustc` executable is built with `-Wl,-rpath` flags on Unix
# platforms to ensure that the compiler is usable by default from the build
# directory (as it links to a number of dynamic libraries). This may not be
# desired in distributions, for example.
#rpath = true

# Flag indicating whether tests are compiled with optimizations (the -O flag) or
# with debuginfo (the -g flag)
#optimize-tests = true
#debuginfo-tests = true

# Flag indicating whether codegen tests will be run or not. If you get an error
# saying that the FileCheck executable is missing, you may want to disable this.
#codegen-tests = true

codegen-tests = false

# =============================================================================
# Options for specific targets
#
# Each of the following options is scoped to the specific target triple in
# question and is used for determining how to compile each target.
# =============================================================================
#[target.x86_64-unknown-linux-gnu]

[target.arm-unknown-linux-gnueabihf]

# C compiler to be used to compiler C code and link Rust code. Note that the
# default value is platform specific, and if not specified it may also depend on
# what platform is crossing to what platform.

cc = "/mnt/utmp/codeblocks/usr/bin/gcc"

# C++ compiler to be used to compiler C++ code (e.g. LLVM and our LLVM shims).
# This is only used for host targets.

cxx = "/mnt/utmp/codeblocks/usr/bin/c++"

# Path to the `llvm-config` binary of the installation of a custom LLVM to link
# against. Note that if this is specifed we don't compile LLVM at all for this
# target.
#llvm-config = "../path/to/llvm/root/bin/llvm-config"

llvm-config = "/mnt/utmp/codeblocks/usr/bin/llvm-config"

# Path to the custom jemalloc static library to link into the standard library
# by default. This is only used if jemalloc is still enabled above
#jemalloc = "/path/to/jemalloc/libjemalloc_pic.a"

jemalloc = "/mnt/utmp/codeblocks/usr/lib/libjemalloc_pic.a"

# If this target is for Android, this option will be required to specify where
# the NDK for the target lives. This is used to find the C compiler to link and
# build native code.
#android-ndk = "/path/to/ndk"

# The root location of the MUSL installation directory. The library directory
# will also need to contain libunwind.a for an unwinding implementation. Note
# that this option only makes sense for MUSL targets that produce statically
# linked binaries
#musl-root = "..."

# =============================================================================
# Distribution options
#
# These options are related to distribution, mostly for the Rust project itself.
# You probably won't need to concern yourself with any of these options
# =============================================================================
[dist]

# This is the folder of artifacts that the build system will sign. All files in
# this directory will be signed with the default gpg key using the system `gpg`
# binary. The `asc` and `sha256` files will all be output into the standard dist
# output folder (currently `build/dist`)
#
# This folder should be populated ahead of time before the build system is
# invoked.
#sign-folder = "path/to/folder/to/sign"

# This is a file which contains the password of the default gpg key. This will
# be passed to `gpg` down the road when signing all files in `sign-folder`
# above. This should be stored in plaintext.
#gpg-password-file = "path/to/gpg/password"

# The remote address that all artifacts will eventually be uploaded to. The
# build system generates manifests which will point to these urls, and for the
# manifests to be correct they'll have to have the right URLs encoded.
#
# Note that this address should not contain a trailing slash as file names will
# be appended to it.
#upload-addr = "https://example.com/folder"

Here is the error message:
Compiling core v0.0.0 (file:///media/Pandora1/dev/rust/rustc-1.17.0-src/src/libcore)
Running `/media/Pandora1/dev/rust/rustc-1.17.0-src/build/bootstrap/debug/rustc --crate-name core src/libcore/lib.rs --crate-type lib --emit=dep-info,link -C debug-assertions=off -C metadata=0c27a50f3e84aa6e -C extra-filename=-0c27a50f3e84aa6e --out-dir /media/Pandora1/dev/rust/rustc-1.17.0-src/build/arm-unknown-linux-gnueabihf/stage0-std/arm-unknown-linux-gnueabihf/debug/deps --target arm-unknown-linux-gnueabihf -L dependency=/media/Pandora1/dev/rust/rustc-1.17.0-src/build/arm-unknown-linux-gnueabihf/stage0-std/arm-unknown-linux-gnueabihf/debug/deps -L dependency=/media/Pandora1/dev/rust/rustc-1.17.0-src/build/arm-unknown-linux-gnueabihf/stage0-std/debug/deps`
error: literal out of range for f32
--> src/libcore/num/dec2flt/table.rs:1252:5
|
1252 | 1e8,
| ^^^
|
note: lint level defined here
--> src/libcore/lib.rs:68:9
|
68 | #![deny(warnings)]
| ^^^^^^^^

error: literal out of range for f32
--> src/libcore/num/dec2flt/table.rs:1253:5
|
1253 | 1e9,
| ^^^

error: literal out of range for f32
--> src/libcore/num/dec2flt/table.rs:1254:5
|
1254 | 1e10,
| ^^^^

error: aborting due to 3 previous errors

error: Could not compile `core`.

Caused by:
process didn't exit successfully: `/media/Pandora1/dev/rust/rustc-1.17.0-src/build/bootstrap/debug/rustc --crate-name core src/libcore/lib.rs --crate-type lib --emit=dep-info,link -C debug-assertions=off -C metadata=0c27a50f3e84aa6e -C extra-filename=-0c27a50f3e84aa6e --out-dir /media/Pandora1/dev/rust/rustc-1.17.0-src/build/arm-unknown-linux-gnueabihf/stage0-std/arm-unknown-linux-gnueabihf/debug/deps --target arm-unknown-linux-gnueabihf -L dependency=/media/Pandora1/dev/rust/rustc-1.17.0-src/build/arm-unknown-linux-gnueabihf/stage0-std/arm-unknown-linux-gnueabihf/debug/deps -L dependency=/media/Pandora1/dev/rust/rustc-1.17.0-src/build/arm-unknown-linux-gnueabihf/stage0-std/debug/deps` (exit code: 101)


command did not execute successfully: "/media/Pandora1/dev/rust-dev/rust-1.16.0-dev/bin/cargo" "build" "-j" "1" "--target" "arm-unknown-linux-gnueabihf" "-v" "--locked" "--features" "panic-unwind jemalloc backtrace" "--manifest-path" "/media/Pandora1/dev/rust/rustc-1.17.0-src/src/libstd/Cargo.toml"
expected success, got: exit code: 101


Build completed unsuccessfully in 0:03:39

The configuration process auto-detects the Pandora as an arm-unknown-linux-gnueabihf platform, is it correct ?

Cheers, Magic Sam
 
Oh, right, I totally forgot about that 'error: literal out of range for f32' error, now I remember. That's when I gave up on the whole thing. I couldn't get the compiler to recompile itself. I think its broken.
I managed to compile a compiler using the prebuilt binaries.
That compiler was able to build itself again, which is the one I published in the first post.
But it turned out that compiler wasn't able to build itself, I changed nothing in the configuration but got the same error you did, which I found out after I posted this thread, but I didn't come back here, because nobody seemed interested (until now).
The whole thing is quite bizarre, since I *think* rust already bootstrapped itself, at least in part. So that was when I gave up.
That's exactly the thing that isn't tested for the platforms that are listed under 'Tier 2'. So take a guess why arm-unknown-linux-gnueabi is under Tier 2 ;)
So, yes, sorry, the binaries are broken, don't use them.
And, yes, the autodetection is wrong. Seems it only looks at what processor it's running on and ignores the ABI of the system. I edited the configuration files before compiling to compile for arm-unknown-linux-gnueabi instead.
 
Last edited:
Back
Top