#!/bin/bash DEFAULT_DOCKCROSS_IMAGE=dockcross/base # DO NOT MOVE THIS LINE (see entrypoint.sh) #------------------------------------------------------------------------------ # Helpers # err() { echo -e >&2 ERROR: $@\\n } die() { err $@ exit 1 } has() { # eg. has command update local kind=$1 local name=$2 type -t $kind:$name | grep -q function } #------------------------------------------------------------------------------ # Command handlers # command:update-image() { docker pull $FINAL_IMAGE } help:update-image() { echo Pull the latest $FINAL_IMAGE . } command:update-script() { if cmp -s <( docker run $FINAL_IMAGE ) $0; then echo $0 is up to date else echo -n Updating $0 '... ' docker run $FINAL_IMAGE > $0 && echo ok fi } help:update-image() { echo Update $0 from $FINAL_IMAGE . } command:update() { command:update-image command:update-script } help:update() { echo Pull the latest $FINAL_IMAGE, and then update $0 from that. } command:help() { if [[ $# != 0 ]]; then if ! has command $1; then err \"$1\" is not an dockcross command command:help elif ! has help $1; then err No help found for \"$1\" else help:$1 fi else cat >&2 < ENDHELP exit 1 fi } #------------------------------------------------------------------------------ # Option processing # special_update_command='' while [[ $# != 0 ]]; do case $1 in --) break ;; --args|-a) ARG_ARGS="$2" shift 2 ;; --config|-c) ARG_CONFIG="$2" shift 2 ;; --image|-i) ARG_IMAGE="$2" shift 2 ;; update|update-image|update-script) special_update_command=$1 break ;; -*) err Unknown option \"$1\" command:help exit ;; *) break ;; esac done # The precedence for options is: # 1. command-line arguments # 2. environment variables # 3. defaults # Source the config file if it exists DEFAULT_DOCKCROSS_CONFIG=~/.dockcross FINAL_CONFIG=${ARG_CONFIG-${DOCKCROSS_CONFIG-$DEFAULT_DOCKCROSS_CONFIG}} [[ -f "$FINAL_CONFIG" ]] && source "$FINAL_CONFIG" # Set the docker image FINAL_IMAGE=${ARG_IMAGE-${DOCKCROSS_IMAGE-$DEFAULT_DOCKCROSS_IMAGE}} # Handle special update command if [ "$special_update_command" != "" ]; then case $special_update_command in update) command:update exit $? ;; update-image) command:update-image exit $? ;; update-script) command:update-script exit $? ;; esac fi # Set the docker run extra args (if any) FINAL_ARGS=${ARG_ARGS-${DOCKCROSS_ARGS}} # Bash on Ubuntu on Windows UBUNTU_ON_WINDOWS=$(grep -l Microsoft /proc/version) # MSYS, Git Bash, etc. MSYS=$(grep -l MINGW /proc/version) if [ -z "$UBUNTU_ON_WINDOWS" -a -z "$MSYS" ]; then USER_IDS="-e BUILDER_UID=$( id -u ) -e BUILDER_GID=$( id -g ) -e BUILDER_USER=$( id -un ) -e BUILDER_GROUP=$( id -gn )" fi # Change the PWD when working in Docker on Windows if [ -n "$UBUNTU_ON_WINDOWS" ]; then HOST_PWD=$PWD HOST_PWD=${HOST_PWD/\/mnt\//} HOST_PWD=${HOST_PWD/\//:\/} elif [ -n "$MSYS" ]; then HOST_PWD=$PWD HOST_PWD=${HOST_PWD/\//} HOST_PWD=${HOST_PWD/\//:\/} else HOST_PWD=$PWD fi #------------------------------------------------------------------------------ # Now, finally, run the command in a container # tty -s && TTY_ARGS=-ti || TTY_ARGS= CONTAINER_NAME=dockcross_$RANDOM docker run $TTY_ARGS --name $CONTAINER_NAME \ -v "$HOST_PWD":/work \ $USER_IDS \ $FINAL_ARGS \ $FINAL_IMAGE "$@" run_exit_code=$? # Deleting the container while ignoring error is required because of # https://circleci.com/docs/docker-btrfs-error/. # See issue dockcross/dockcross#50 for more details. docker rm -f $CONTAINER_NAME > /dev/null || true exit $run_exit_code ################################################################################ # # This image is not intended to be run manually. # # To create a dockcross helper script for the # dockcross/linux-armv7 image, run: # # docker run --rm dockcross/linux-armv7 > dockcross-linux-armv7 # chmod +x dockcross-linux-armv7 # # You may then wish to move the dockcross script to your PATH. # ################################################################################