This folder contains a bunch of docker images used by the continuous integration (CI) of Rust. An script is accompanied (run.sh
) with these images to actually execute them. To test out an image execute:
./src/ci/docker/run.sh $image_name
for example:
./src/ci/docker/run.sh x86_64-gnu
Images will output artifacts in an obj
dir at the root of a repository.
To match conditions in rusts CI, also set the environment variable DEPLOY=1
, e.g.:
DEPLOY=1 ./src/ci/docker/run.sh x86_64-gnu
NOTE: Re-using the same obj
dir with different docker images with the same target triple (e.g. dist-x86_64-linux
and dist-various-1
) may result in strange linker errors, due shared library versions differing between platforms.
If you encounter any issues when using multiple Docker images, try deleting your obj
directory before running your command.
host-{arch}
directory, and those directories contain a subdirectory for each Docker image (plus the disabled
subdirectory).host-{arch}/disabled
contains images that are not built on CI.scripts
contains files shared by multiple Docker images.For Windows before Windows 10, the docker images can be run on Windows via Docker Toolbox. There are several preparation needs to be made before running a Docker image.
Stop the virtual machine from the terminal with docker-machine stop
If your Rust source is placed outside of C:\Users\**
, e.g. if you place the repository in the E:\rust
folder, please add a shared folder from VirtualBox by:
Select the “default” virtual machine inside VirtualBox, then click “Settings”
Go to “Shared Folders”, click “Add shared folder” (the folder icon with a plus sign), fill in the following information, then click “OK”:
E:\rust
e/rust
VirtualBox might not support creating symbolic links inside a shared folder by default. You can enable it manually by running these from cmd.exe
:
cd "C:\Program Files\Oracle\VirtualBox" VBoxManage setextradata default VBoxInternal2/SharedFoldersEnableSymlinksCreate/e/rust 1 :: ^~~~~~ :: folder name
Restart the virtual machine from terminal with docker-machine start
.
To run the image,
./src/ci/docker/run.sh $image_name
as explained at the beginning.A number of these images take quite a long time to compile as they‘re building whole gcc toolchains to do cross builds with. Much of this is relatively self-explanatory but some images use crosstool-ng which isn’t quite as self explanatory. Below is a description of where these *.config
files come form, how to generate them, and how the existing ones were generated.
.config
fileNOTE: Existing Dockerfiles can also be a good guide for the process and order of script execution.
If you have a linux-cross
image lying around you can use that and skip the next two steps.
# Note: We use ubuntu:16.04 because that's the "base" of linux-cross Docker # image, or simply run ./src/ci/docker/run.sh once, which will download the correct # one and you can check it out with `docker images` $ docker run -it ubuntu:16.04 bash # in another terminal: $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cfbec05ed730 ubuntu:16.04 "bash" 16 seconds ago Up 15 seconds drunk_murdock $ docker cp src/ci/docker/scripts drunk_murdock:/tmp/
$ cd /tmp/scripts # Download packages necessary for building $ bash ./cross-apt-packages.sh # Download and build crosstool-ng $ bash ./crosstool-ng.sh
crosstool-ng
will automatically load ./.config
if present. Otherwise one can use the TUI to load any config-file.$ docker cp arm-linux-gnueabi.config drunk_murdock:/tmp/.config
$ cd /tmp/ $ ct-ng menuconfig
.config
file from the container and give it a meaningful name. This is done outside the container.$ docker cp drunk_murdock:/tmp/.config arm-linux-gnueabi.config
.config
file.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
arm-linux-gnueabihf.config
For targets: arm-unknown-linux-gnueabihf
armv7-linux-gnueabihf.config
For targets: armv7-unknown-linux-gnueabihf
(*) 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(v7)-uknown-linux-gnueabi{,hf}.mk file in Rust's source code.
aarch64-linux-gnu.config
For targets: aarch64-unknown-linux-gnu
powerpc-linux-gnu.config
For targets: powerpc-unknown-linux-gnu
powerpc64-linux-gnu.config
For targets: powerpc64-unknown-linux-gnu
(+) These CPU options match the configuration of the toolchains in RHEL6.
s390x-linux-gnu.config
For targets: s390x-unknown-linux-gnu