#!/bin/bash DEFAULT_DOCKCROSS_IMAGE=dockcross/linux-riscv64 #------------------------------------------------------------------------------ # 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}} # If we are not running via boot2docker if [ -z $DOCKER_HOST ]; then USER_IDS="-e BUILDER_UID=$( id -u ) -e BUILDER_GID=$( id -g ) -e BUILDER_USER=$( id -un ) -e BUILDER_GROUP=$( id -gn )" fi #------------------------------------------------------------------------------ # Now, finally, run the command in a container # docker run --rm \ -v $PWD:/work \ $USER_IDS \ $FINAL_ARGS \ $FINAL_IMAGE "$@" ################################################################################ # # 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. # ################################################################################