项目作者: skyuplam

项目描述 :
Cross compilation environment fro rust targeting musl
高级语言: Makefile
项目地址: git://github.com/skyuplam/rust-musl.git
创建时间: 2018-09-06T08:38:08Z
项目社区:https://github.com/skyuplam/rust-musl

开源协议:MIT License

下载


Cross compilation environment for rust targeting musl inspired by rust-embedded/cross

Based on the official Debian
stretch
image and
musl-cross-make tool to build a
rust cross-compilation development environment.

Prebuilt images

Rust toolchain Cross Compiled Target Tag
stable arm-unknown-linux-musleabihf
stable armv7-unknown-linux-musleabihf
stable x86_64-unknown-linux-musl

Prebuilt libraries

  • musl-libc
  • zlib
  • OpenSSL

Usage

  1. Pull the docker image from docker hub with target tag, e.g.
    arm-unknown-linux-musleabihf
  1. $ docker pull skyuplam/rust-musl-armha:<target tag>
  1. Cross compile target tag, e.g. arm-unknown-linux-musleabihf using the
    docker image
  1. $ docker run --rm \
  2. --volume <path to your rust project>:/home/cross/project \
  3. --volume <path to your local cargo registry, e.g. ~/.cargo/registry>:/home/cross/.cargo/registry \ # optional, advoid cargo to update on every build
  4. skyuplam/rust-musl:<target tag> \
  5. <cargo command> # e.g. `cargo build --release`
  6. # e.g. to run cargo build --release in the current directory
  7. # with target x86_64-unknown-linux-musl
  8. $ docker run --rm \
  9. --volume $(pwd):/home/cross/project \
  10. --volume ~/.cargo/registry:/home/cross/.cargo/registry \
  11. skyuplam/rust-musl:x86_64-unknown-linux-musl \
  12. cargo build --release

Build your own docker image

Clone the project.

  1. # clone the project
  2. $ git clone --recurse-submodules -j8 git@github.com:skyuplam/rust-musl.git
  3. # change to the directory
  4. $ cd rust-musl
  5. # update submodules
  6. $ git submodule update --remote --recursive

Change the variables in the Makefile and prepare your own $TARGET-config.mak
file.

Here is a reference for SSL Arch which you can use to set SSL_ARCH to match
TARGET:

  1. BS2000-OSD BSD-generic32 BSD-generic64 BSD-ia64 BSD-sparc64 BSD-sparcv8
  2. BSD-x86 BSD-x86-elf BSD-x86_64 Cygwin Cygwin-i386 Cygwin-i486 Cygwin-i586
  3. Cygwin-i686 Cygwin-x86 Cygwin-x86_64 DJGPP MPE/iX-gcc UEFI UWIN VC-CE VC-WIN32
  4. VC-WIN32-ARM VC-WIN32-ONECORE VC-WIN64-ARM VC-WIN64A VC-WIN64A-ONECORE
  5. VC-WIN64A-masm VC-WIN64I aix-cc aix-gcc aix64-cc aix64-gcc android-arm
  6. android-arm64 android-armeabi android-mips android-mips64 android-x86
  7. android-x86_64 android64 android64-aarch64 android64-mips64 android64-x86_64
  8. bsdi-elf-gcc cc darwin-i386-cc darwin-ppc-cc darwin64-ppc-cc
  9. darwin64-x86_64-cc dist gcc haiku-x86 haiku-x86_64 hpux-ia64-cc hpux-ia64-gcc
  10. hpux-parisc-cc hpux-parisc-gcc hpux-parisc1_1-cc hpux-parisc1_1-gcc
  11. hpux64-ia64-cc hpux64-ia64-gcc hpux64-parisc2-cc hpux64-parisc2-gcc hurd-x86
  12. ios-cross ios-xcrun ios64-cross ios64-xcrun iossimulator-xcrun iphoneos-cross
  13. irix-mips3-cc irix-mips3-gcc irix64-mips4-cc irix64-mips4-gcc linux-aarch64
  14. linux-alpha-gcc linux-aout linux-arm64ilp32 linux-armv4 linux-c64xplus
  15. linux-elf linux-generic32 linux-generic64 linux-ia64 linux-mips32 linux-mips64
  16. linux-ppc linux-ppc64 linux-ppc64le linux-sparcv8 linux-sparcv9 linux-x32
  17. linux-x86 linux-x86-clang linux-x86_64 linux-x86_64-clang linux32-s390x
  18. linux64-mips64 linux64-s390x linux64-sparcv9 mingw mingw64 nextstep
  19. nextstep3.3 sco5-cc sco5-gcc solaris-sparcv7-cc solaris-sparcv7-gcc
  20. solaris-sparcv8-cc solaris-sparcv8-gcc solaris-sparcv9-cc solaris-sparcv9-gcc
  21. solaris-x86-gcc solaris64-sparcv9-cc solaris64-sparcv9-gcc solaris64-x86_64-cc
  22. solaris64-x86_64-gcc tru64-alpha-cc tru64-alpha-gcc uClinux-dist
  23. uClinux-dist64 unixware-2.0 unixware-2.1 unixware-7 unixware-7-gcc vms-alpha
  24. vms-alpha-p32 vms-alpha-p64 vms-ia64 vms-ia64-p32 vms-ia64-p64 vos-gcc
  25. vxworks-mips vxworks-ppc405 vxworks-ppc60x vxworks-ppc750 vxworks-ppc750-debug
  26. vxworks-ppc860 vxworks-ppcgen vxworks-simlinux

Make build:

  1. # e.g. to build x86_64-unknown-linux-musl # with x86_64-unknown-linux-musl-config.mak
  2. $ make TARGET=x86_64-unknown-linux-musl SSL_ARCH=SSL_ARCH=linux-x86_64 build

Supported TARGETs

You can get most musl target from rustup command as the following:

  1. $ rustup target list | grep musl
  2. aarch64-unknown-linux-musl
  3. arm-unknown-linux-musleabi
  4. arm-unknown-linux-musleabihf
  5. armv5te-unknown-linux-musleabi
  6. armv7-unknown-linux-musleabi
  7. armv7-unknown-linux-musleabihf
  8. i586-unknown-linux-musl
  9. i686-unknown-linux-musl
  10. mips-unknown-linux-musl
  11. mips64-unknown-linux-muslabi64
  12. mips64el-unknown-linux-muslabi64
  13. mipsel-unknown-linux-musl
  14. x86_64-unknown-linux-musl

See also musl-cross-make repo.

Working with OpenSSL

Use openssl-probe to find SSL
certificate locations on the system for OpenSSL.

  1. Add openssl-probe to your Cargo.toml file.
  1. # Cargo.toml
  2. [dependencies]
  3. openssl-probe = "0.1.2"
  1. Add the following snippet to your main as the following:
  1. extern crate openssl_probe;
  2. fn main() {
  3. openssl_probe::init_ssl_cert_env_vars();
  4. //... your code
  5. }