-
-
Save mrvcoder/16cdac143ce01ad14733ca3fcbee8d0d to your computer and use it in GitHub Desktop.
Cross compile for all possible Golang targets. This script will always be updated, because it uses the `go` command to see what can be built.
This file contains hidden or 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
| #!/usr/bin/env bash | |
| # Based on https://gist.github.com/eduncan911/68775dba9d3c028181e4 | |
| # but improved to use the `go` command so it never goes out of date. | |
| type setopt >/dev/null 2>&1 | |
| contains() { | |
| # Source: https://stackoverflow.com/a/8063398/7361270 | |
| [[ $1 =~ (^|[[:space:]])$2($|[[:space:]]) ]] | |
| } | |
| SOURCE_FILE=$(echo "$@" | sed 's/\.go//') | |
| CURRENT_DIRECTORY="${PWD##*/}" | |
| OUTPUT=${SOURCE_FILE:-$CURRENT_DIRECTORY} # if no src file given, use current dir name | |
| FAILURES="" | |
| # CHANGE THIS! It's a list of OSes to not build for, space-separated | |
| NOT_ALLOWED_OS="windows js android ios" | |
| # Get all targets | |
| while IFS= read -r target; do | |
| GOOS=${target%/*} | |
| GOARCH=${target#*/} | |
| BIN_FILENAME="${OUTPUT}-${GOOS}-${GOARCH}" | |
| if contains "$NOT_ALLOWED_OS" "$GOOS" ; then | |
| continue | |
| fi | |
| # Check for arm and set arm version | |
| if [[ $GOARCH == "arm" ]]; then | |
| # Set what arm versions each platform supports | |
| if [[ $GOOS == "darwin" ]]; then | |
| arms="7" | |
| elif [[ $GOOS == "windows" ]]; then | |
| # This is a guess, it's not clear what Windows supports from the docs | |
| # But I was able to build all these on my machine | |
| arms="5 6 7" | |
| elif [[ $GOOS == *"bsd" ]]; then | |
| arms="6 7" | |
| else | |
| # Linux goes here | |
| arms="5 6 7" | |
| fi | |
| # Now do the arm build | |
| for GOARM in $arms; do | |
| BIN_FILENAME="${OUTPUT}-${GOOS}-${GOARCH}${GOARM}" | |
| if [[ "${GOOS}" == "windows" ]]; then BIN_FILENAME="${BIN_FILENAME}.exe"; fi | |
| CMD="GOARM=${GOARM} GOOS=${GOOS} GOARCH=${GOARCH} go build -o ${BIN_FILENAME} $@" | |
| echo "${CMD}" | |
| eval "${CMD}" || FAILURES="${FAILURES} ${GOOS}/${GOARCH}${GOARM}" | |
| done | |
| else | |
| # Build non-arm here | |
| if [[ "${GOOS}" == "windows" ]]; then BIN_FILENAME="${BIN_FILENAME}.exe"; fi | |
| CMD="GOOS=${GOOS} GOARCH=${GOARCH} go build -o ${BIN_FILENAME} $@" | |
| echo "${CMD}" | |
| eval "${CMD}" || FAILURES="${FAILURES} ${GOOS}/${GOARCH}" | |
| fi | |
| done <<< "$(go tool dist list)" | |
| if [[ "${FAILURES}" != "" ]]; then | |
| echo "" | |
| echo "${SCRIPT_NAME} failed on: ${FAILURES}" | |
| exit 1 | |
| fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment