This repository was archived by the owner on Nov 21, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 26
linux-cross: use glibc-2.14/gcc-4.8 for the arm toolchain #69
Merged
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
2a8a424
linux-cross: use glibc-2.14/gcc-4.8 for the arm toolchain
2004de6
rename build_arm_compiler to build_compiler
3b19b3a
merge some commands
65cdb54
add docs and bump arm gcc to 4.9
c12d174
change armv6 as the default arch level for both toolchains
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
# `linux-cross` | ||
|
||
This image is used to cross compile libstd/rustc to targets that run linux but are not the | ||
`x86_64-unknown-linux-gnu` triple which is the "host" triple. | ||
|
||
To cross compile libstd/rustc we need a C cross toolchain: a cross gcc and a cross compiled libc. | ||
For some targets, we use crosstool-ng to build these toolchains ourselves instead of using the ones | ||
packaged for Ubuntu because: | ||
|
||
- We can control the glibc version of the toolchain. In particular, we can lower its version as much | ||
as possible, this lets us generate libstd/rustc binaries that run in systems with old glibcs. | ||
- We can create toolchains for targets that don't have an equivalent package available in Ubuntu. | ||
|
||
crosstool-ng uses a `.config` file, generated via a menuconfig interface, to specify the target, | ||
glibc version, etc. of the toolchain to build. Because this menuconfig interface requires user | ||
intervention we store pre-generated `.config` files in this repository to keep the `docker build` | ||
command free of user intervention. | ||
|
||
The next section explains how to generate a `.config` file for a new target, and the one after that | ||
contains the changes, on top of the default toolchain configuration, used to generate the `.config` | ||
files stored in this repository. | ||
|
||
## Generating a `.config` file | ||
|
||
If you have a `linux-cross` image lying around you can use that and skip the next two steps. | ||
|
||
- First we spin up a container and copy `build_toolchain_root.sh` into it. All these steps are | ||
outside the container: | ||
|
||
``` | ||
# Note: We use ubuntu:15.10 because that's the "base" of linux-cross Docker image | ||
$ docker run -it ubuntu:15.10 bash | ||
$ docker ps | ||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES | ||
cfbec05ed730 ubuntu:15.10 "bash" 16 seconds ago Up 15 seconds drunk_murdock | ||
$ docker cp build_toolchain_root.sh drunk_murdock:/ | ||
``` | ||
|
||
- Then inside the container we build crosstool-ng by simply calling the bash script we copied in the | ||
previous step: | ||
|
||
``` | ||
$ bash build_toolchain_root.sh | ||
``` | ||
|
||
- Now, inside the container run the following command to configure the toolchain. To get a clue of | ||
which options need to be changed check the next section and come back. | ||
|
||
``` | ||
$ ct-ng menuconfig | ||
``` | ||
|
||
- Finally, we retrieve the `.config` file from the container and give it a meaningful name. This is | ||
done outside the container. | ||
|
||
``` | ||
$ docker drunk_murdock:/.config arm-linux-gnueabi.config | ||
``` | ||
|
||
- Now you can shutdown the container or repeat the two last steps to generate a new `.config` file. | ||
|
||
## Toolchain configuration | ||
|
||
Changes on top of the default toolchain configuration used to generate the `.config` files in this | ||
directory. The changes are formatted as follows: | ||
|
||
``` | ||
$category > $option = $value -- $comment | ||
``` | ||
|
||
## `arm-linux-gnueabi.config` | ||
|
||
For targets: `arm-unknown-linux-gnueabi` | ||
|
||
- Path and misc options > Prefix directory = /x-tools/${CT_TARGET} | ||
- Target options > Target Architecture = arm | ||
- Target options > Architecture level = armv6 -- (+) | ||
- Target options > Floating point = software (no FPU) -- (*) | ||
- Operating System > Target OS = linux | ||
- Operating System > Linux kernel version = 3.2.72 -- Precise kernel | ||
- C-library > glibc version = 2.14.1 | ||
- C compiler > gcc version = 4.9.3 | ||
- C compiler > C++ = ENABLE -- to cross compile LLVM | ||
|
||
## `arm-linux-gnueabihf.config` | ||
|
||
For targets: `arm-unknown-linux-gnueabihf`, `armv7-unknown-linux-gnueabihf` | ||
|
||
- Path and misc options > Prefix directory = /x-tools/${CT_TARGET} | ||
- Target options > Target Architecture = arm | ||
- Target options > Architecture level = armv6 -- (+) | ||
- Target options > Use specific FPU = vfpv3-d16 -- (*) | ||
- Target options > Floating point = hardware (FPU) -- (*) | ||
- Target options > Default instruction set mode (thumb) -- (*) | ||
- Operating System > Target OS = linux | ||
- Operating System > Linux kernel version = 3.2.72 -- Precise kernel | ||
- C-library > glibc version = 2.14.1 | ||
- C compiler > gcc version = 4.9.3 | ||
- C compiler > C++ = ENABLE -- to cross compile LLVM | ||
|
||
(*) These options have been selected to match the configuration of the arm toolchains shipped with | ||
Ubuntu 15.10 | ||
(+) These options have been selected to match the gcc flags we use to compile C libraries like | ||
jemalloc. See the mk/cfg/arm-uknown-linux-gnueabi{,hf}.mk file in Rust's source code. |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've found that not having a bunch of intermediate artifacts can hugely reduce the size of docker containers, could this be done as part of each step? Some examples I've done in the past are:
(or something like that)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great tip! I'll try to condense these commands as much as possible.