Shell Dockerfile CMake Python Makefile C++ C
Switch branches/tags
Nothing to show
Clone or download
Pull request Compare This branch is 525 commits ahead of steeve:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.circleci linux-armv5,linux-armv7: Reenable deployment Aug 19, 2018
android-arm Added fortran compiler May 25, 2018
android-arm64 android=arm64: Fix image build removing "debian-security" from source… Jul 9, 2018
browser-asmjs browser-asmjs: Bump Emscripten to 1.37.37 Apr 24, 2018
imagefiles common: Fix bash shell script invocation Aug 20, 2018
linux-arm64 Sync arm64 wtih other crosstool-ng targets Jun 14, 2018
linux-armv5 Crosstool-ng'd armv5 Jul 15, 2018
linux-armv6 Added fortran compiler May 25, 2018
linux-armv7 Crosstool-ng'd armv7 Jul 11, 2018
linux-mips Sync arm64 wtih other crosstool-ng targets Jun 14, 2018
linux-mipsel Added fortran compiler May 25, 2018
linux-ppc64le Added fortran compiler May 25, 2018
linux-s390x Sync arm64 wtih other crosstool-ng targets Jun 14, 2018
linux-x64 Added fortran compiler May 25, 2018
linux-x86 common: Fix bash shell script invocation Aug 20, 2018
manylinux-common common: Fix bash shell script invocation Aug 20, 2018
manylinux-x64 Added fortran compiler May 25, 2018
manylinux-x86 Added fortran compiler May 25, 2018
test base: Add cmake wrapper scripts for CMAKE_TOOLCHAIN_FILE Jul 22, 2016
windows-x64-posix [windows_x64_posix] Added windows-x64-posix/Dockerfile.in Jun 12, 2018
windows-x64 [windows_x64_posix] Declared MXE_TARGET_THREAD empty parameter in win… Jun 12, 2018
windows-x86 [windows_x64_posix] Declared MXE_TARGET_THREAD empty parameter in win… Jun 12, 2018
.gitattributes git: Ensure we use lf endings Aug 20, 2018
.gitignore browser-asmjs: Update to depend on existing image from "trzeci/emscri… Nov 25, 2016
Dockerfile.in common: Introduce "common.debian" Nov 25, 2016
LICENSE Update LICENSE copyright dates and add @jcfr Mar 19, 2018
Makefile Crosstool-ng'd armv5 Jul 15, 2018
README.rst common: Fix bash shell script invocation Aug 20, 2018
common.crosstool Sync arm64 wtih other crosstool-ng targets Jun 14, 2018
common.debian Sync arm64 wtih other crosstool-ng targets Jun 14, 2018
common.docker common.docker: Speed-up manylinux-x86 image build downloading CMake b… Jun 9, 2018
common.manylinux manylinux: Install wget Aug 19, 2018
common.windows do not delete mxe's .git directory Jul 23, 2018

README.rst

dockcross

Cross compiling toolchains in Docker images.

https://circleci.com/gh/dockcross/dockcross/tree/master.svg?style=svg

Features

  • Pre-built and configured toolchains for cross compiling.
  • Most images also contain an emulator for the target system.
  • Clean separation of build tools, source code, and build artifacts.
  • Commands in the container are run as the calling user, so that any created files have the expected ownership, (i.e. not root).
  • Make variables (CC, LD etc) are set to point to the appropriate tools in the container.
  • Recent CMake and ninja are precompiled.
  • Conan.io can be used as a package manager.
  • Toolchain files configured for CMake.
  • Current directory is mounted as the container's workdir, /work.
  • Works with the Docker for Mac and Docker for Windows.

Examples

  1. dockcross make: Build the Makefile in the current directory.
  2. dockcross cmake -Bbuild -H. -GNinja: Run CMake with a build directory ./build for a CMakeLists.txt file in the current directory and generate ninja build configuration files.
  3. dockcross ninja -Cbuild: Run ninja in the ./build directory.
  4. dockcross bash -c '$CC test/C/hello.c -o hello': Build the hello.c file with the compiler identified with the CC environmental variable in the build environment.
  5. dockcross bash: Run an interactive shell in the build environment.

Note that commands are executed verbatim. If any shell processing for environment variable expansion or redirection is required, please use bash -c 'command args...'.

Installation

This image does not need to be run manually. Instead, there is a helper script to execute build commands on source code existing on the local host filesystem. This script is bundled with the image.

To install the helper script, run one of the images with no arguments, and redirect the output to a file:

docker run --rm CROSS_COMPILER_IMAGE_NAME > ./dockcross
chmod +x ./dockcross
mv ./dockcross ~/bin/

Where CROSS_COMPILER_IMAGE_NAME is the name of the cross-compiler toolchain Docker instance, e.g. dockcross/linux-armv7.

Only 64-bit x86_64 images are provided; a 64-bit x86_64 host system is required.

Usage

For the impatient, here's how to compile a hello world for armv7:

cd ~/src/dockcross
docker run --rm dockcross/linux-armv7 > ./dockcross-linux-armv7
chmod +x ./dockcross-linux-armv7
./dockcross-linux-armv7 bash -c '$CC test/C/hello.c -o hello_arm'

Note how invoking any toolchain command (make, gcc, etc.) is just a matter of prepending the dockcross script on the commandline:

./dockcross-linux-armv7 [command] [args...]

The dockcross script will execute the given command-line inside the container, along with all arguments passed after the command. Commands that evaluate environmental variables in the image, like $CC above, should be executed in bash -c. The present working directory is mounted within the image, which can be used to make source code available in the Docker container.

Cross compilers

dockcross/base
base-images Base image for other toolchain images. From Debian Jessie with GCC, make, autotools, CMake, Ninja, Git, and Python.
dockcross/android-arm
android-arm-images The Android NDK standalone toolchain for the arm architecture.
dockcross/android-arm64
android-arm64-images The Android NDK standalone toolchain for the arm64 architecture.
dockcross/browser-asmjs
browser-asmjs-images The Emscripten JavaScript cross compiler.
dockcross/linux-arm64
linux-arm64-images Cross compiler for the 64-bit ARM platform on Linux, also known as AArch64.
dockcross/linux-armv5
linux-armv5-images Linux armv5 cross compiler toolchain for legacy devices like the Parrot AR Drone.
dockcross/linux-armv6
linux-armv6-images Linux ARMv6 cross compiler toolchain for the Raspberry Pi, etc.
dockcross/linux-armv7
linux-armv7-images Generic Linux armv7 cross compiler toolchain.
dockcross/linux-mipsel
linux-mipsel-images Linux mipsel cross compiler toolchain for little endian MIPS GNU systems.
dockcross/linux-mips
linux-mips-images Linux mips cross compiler toolchain for big endian 32-bit hard float MIPS GNU systems.
dockcross/linux-s390x
linux-s390x-images Linux s390x cross compiler toolchain for S390X GNU systems.
dockcross/linux-ppc64le
linux-ppc64le-images Linux PowerPC 64 little endian cross compiler toolchain for the POWER8, etc.
dockcross/linux-x64
linux-x64-images Linux x86_64 / amd64 compiler. Since the Docker image is natively x86_64, this is not actually a cross compiler.
dockcross/linux-x86
linux-x86-images Linux i686 cross compiler.
dockcross/manylinux-x64
manylinux-x64-images Docker manylinux image for building Linux x86_64 / amd64 Python wheel packages. It includes Python 2.7, 3.4, 3.5, 3.6 and 3.7. Also has support for the dockcross script, and it has installations of CMake, Ninja, and scikit-build
dockcross/manylinux-x86
manylinux-x86-images Docker manylinux image for building Linux i686 Python wheel packages. It includes Python 2.7, 3.4, 3.5, 3.6 and 3.7. Also has support for the dockcross script, and it has installations of CMake, Ninja, and scikit-build
dockcross/windows-x64
windows-x64-images 64-bit Windows cross-compiler based on MXE/MinGW-w64 with win32 threads.
dockcross/windows-x64-posix
windows-x64-posix-images 64-bit Windows cross-compiler based on MXE/MinGW-w64 with posix threads.
dockcross/windows-x86
windows-x86-images 32-bit Windows cross-compiler based on MXE/MinGW-w64 with win32 threads.

Articles

Built-in update commands

A special update command can be executed that will update the source cross-compiler Docker image or the dockcross script itself.

  • dockcross [--] command [args...]: Forces a command to run inside the container (in case of a name clash with a built-in command), use -- before the command.
  • dockcross update-image: Fetch the latest version of the docker image.
  • dockcross update-script: Update the installed dockcross script with the one bundled in the image.
  • dockcross update: Update both the docker image, and the dockcross script.

Download all images

To easily download all images, the convenience target display_images could be used:

curl https://raw.githubusercontent.com/dockcross/dockcross/master/Makefile -o dockcross-Makefile
for image in $(make -f dockcross-Makefile display_images); do
  echo "Pulling dockcross/$image"
  docker pull dockcross/$image
done

Install all dockcross scripts

To automatically install in ~/bin the dockcross scripts for each images already downloaded, the convenience target display_images could be used:

curl https://raw.githubusercontent.com/dockcross/dockcross/master/Makefile -o dockcross-Makefile
for image in $(make -f dockcross-Makefile display_images); do
  if [[ $(docker images -q dockcross/$image) == "" ]]; then
    echo "~/bin/dockcross-$image skipping: image not found locally"
    continue
  fi
  echo "~/bin/dockcross-$image ok"
  docker run dockcross/$image > ~/bin/dockcross-$image && \
  chmod u+x  ~/bin/dockcross-$image
done

Dockcross configuration

The following environmental variables and command-line options are used. In all cases, the command-line option overrides the environment variable.

DOCKCROSS_CONFIG / --config|-c <path-to-config-file>

This file is sourced, if it exists, before executing the rest of the dockcross script.

Default: ~/.dockcross

DOCKCROSS_IMAGE / --image|-i <docker-image-name>

The Docker cross-compiler image to run.

Default: Image with which the script was created.

DOCKCROSS_ARGS / --args|-a <docker-run-args>

Extra arguments to pass to the docker run command. Quote the entire set of args if they contain spaces.

Per-project dockcross configuration

If a shell script named .dockcross is found in the current directory where the dockcross script is started, it is executed before the dockcross script command argument. The shell script is expected to have a shebang like #!/usr/bin/env bash.

For example, commands like git config --global advice.detachedHead false can be added to this script.

How to extend Dockcross images

In order to extend Dockcross images with your own commands, one must:

  1. Use FROM dockcross/<name_of_image>.
  2. Set DEFAULT_DOCKCROSS_IMAGE to a name of the tag you're planning to use for the image. This tag must then be used during the build phase, unless you mean to pass the resulting helper script the DOCKCROSS_IMAGE argument.

An example Dockerfile would be:

FROM dockcross/linux-armv7

ENV DEFAULT_DOCKCROSS_IMAGE my_cool_image
RUN apt-get install nano

And then in the shell:

docker build -t my_cool_image .                                       # Builds the dockcross image.
docker run my_cool_image > linux-armv7                                # Creates a helper script named linux-armv7.
chmod +x linux-armv7                                                  # Gives the script execution permission.
./linux-armv7 bash                                                    # Runs the helper script with the argument "bash", which starts an interactive container using your extended image.

What is the difference between dockcross and dockbuild ?

The key difference is that dockbuild images use the same method to conveniently isolate the build environment as dockcross but they do NOT provide a toolchain file.

---

Credits go to sdt/docker-raspberry-pi-cross-compiler, who invented the base of the dockcross script.