Giter Site home page Giter Site logo

goreleaser-cross's Introduction

goreleaser-cross

Docker container to turn CGO cross-compilation pain into a pleasure. It tested on variety of platforms. Custom sysroots also can be used.

Tip! Should you wish to see working examples instead of reading

Credits

This project is rather a cookbook combining various projects into one. Special thanks to osxcross for an amazing cross-compile environment for OSX.

Docker

Docker images are available on both GitHub and Docker hub.

Images from version v1.17.4 are multi-arch. Supported hosts are listed in the table below. The compiler columns refer to what compiler arch you are using when you invoke the gcc and g++ binaries on the host.

Host Supported gcc compiler g++ compiler
amd64 x86_64-linux-gnu-gcc x86_64-linux-gnu-g++
arm64 (aka aarch64) aarch64-linux-gnu-gcc aarch64-linux-gnu-gcc

Below are additional environment variables to set when cross compiling with CGO.

Env variable Value Required Notes
CGO_ENABLED 1 Yes Instead of specifying it in each build it can be set globally during docker run -e CGO_ENABLED=1
CC see targets Optional
CXX see targets Optional
PKG_CONFIG_SYSROOT_DIR Required if sysroot is present
PKG_CONFIG_PATH Optional List of directories containing pkg-config files
  • PKG_CONFIG_SYSROOT_DIR modifies -I and -L to use the directories located in target's sysroot.
  • The value of PKG_CONFIG_SYSROOT_DIR is prefixed to -I and -L. For instance -I/usr/include/libfoo becomes -I/var/target/usr/include/libfoo with a PKG_CONFIG_SYSROOT_DIR set to /var/target (same rule apply to -L)
  • PKG_CONFIG_PATH - A colon-separated list of directories to search for .pc files.

Supported toolchains/platforms

Platform Arch CC CXX Verified
Darwin amd64 o64-clang o64-clang++
Darwin (M1) arm64 oa64-clang oa64-clang++
Linux amd64 x86_64-linux-gnu-gcc x86_64-linux-gnu-g++
Linux arm64 aarch64-linux-gnu-gcc aarch64-linux-gnu-g++
Linux armhf (GOARM=5) arm-linux-gnueabihf-gcc arm-linux-gnueabihf-g++ Verification required
Linux armhf (GOARM=6) arm-linux-gnueabihf-gcc arm-linux-gnueabihf-g++ Verification required
Linux armhf (GOARM=7) arm-linux-gnueabihf-gcc arm-linux-gnueabihf-g++
Windows amd64 x86_64-w64-mingw32-gcc x86_64-w64-mingw32-g++
Windows arm64 /llvm-mingw/llvm-mingw/bin/aarch64-w64-mingw32-gcc /llvm-mingw/llvm-mingw/bin/aarch64-w64-mingw32-g++

Docker

Environment variables

  • Goreleaser variables
  • GPG_KEY (optional) - defaults to /secrets/key.gpg. ignored if file not found
  • DOCKER_CREDS_FILE (optional) - path to JSON file with docker login credentials. Useful when push to multiple docker registries required
  • DOCKER_FAIL_ON_LOGIN_ERROR (optional) - fail on docker login error

Login to registry

Github Actions

Use docker login to auth to repos and mount docker config file. For example:

docker run -v $(HOME)/.docker/config.json:/root/.docker/config.json ...

Docker Creds file

To login from within goreleaser-cross container create creds file.

{
  "registries": [
    {
      "user": "<username>",
      "pass": "<password>",
      "registry": "<registry url>" // for example ghcr.io
    }
  ]
}

Sysroot howto

Most reasonable way to make a sysroot seem to be rsync and the example is using it. You may want to use the script to create sysroot for your desired setup. Lets consider creating sysroot for Raspberry Pi 4 running Debian Buster.

  • install all required dev packages. for this example we will install libftdi1-dev, libusb-1.0-0-dev and opencv4
    ./sysroot-rsync.sh pi@<ipaddress> <local destination>

sshfs

Though sshfs is a good way to test sysroot before running rsync it introduces cons. Some packages are creating absolute links and thus pointing to wrong files when mounted ( or appear as broken). For example RPI4 running Debian Buster the library /usr/lib/x86_x64-gnu-linux/libpthread.so is symlink to /lib/x86_x64-gnu-linux/libpthread.so instead of ../../../lib/x86_x64-gnu-linux/libpthread.so.

Contributing

Any contribution helping to make this project is welcome

Examples

Projects using

goreleaser-cross's People

Contributors

caarlos0 avatar climech avatar dependabot[bot] avatar gythialy avatar henrynguyen5 avatar maraino avatar troian avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.