1- #! /bin/bash
1+ #! /usr/ bin/env bash
22
3- DEFAULT_DOCKCROSS_IMAGE=dockcross/linux-armv7
3+ DEFAULT_DOCKCROSS_IMAGE=dockcross/linux-armv7-lts:20230421-a0eaff4
44
55# ------------------------------------------------------------------------------
66# Helpers
77#
88err () {
9- echo -e >&2 ERROR: $@ \\ n
9+ echo -e >&2 " ERROR: $* \n "
1010}
1111
1212die () {
13- err $@
13+ err " $* "
1414 exit 1
1515}
1616
@@ -22,28 +22,39 @@ has() {
2222 type -t $kind :$name | grep -q function
2323}
2424
25+ # If OCI_EXE is not already set, search for a container executor (OCI stands for "Open Container Initiative")
26+ if [ -z " $OCI_EXE " ]; then
27+ if which podman > /dev/null 2> /dev/null; then
28+ OCI_EXE=podman
29+ elif which docker > /dev/null 2> /dev/null; then
30+ OCI_EXE=docker
31+ else
32+ die " Cannot find a container executor. Search for docker and podman."
33+ fi
34+ fi
35+
2536# ------------------------------------------------------------------------------
2637# Command handlers
2738#
2839command:update-image () {
29- docker pull $FINAL_IMAGE
40+ $OCI_EXE pull $FINAL_IMAGE
3041}
3142
3243help:update-image () {
33- echo Pull the latest $FINAL_IMAGE .
44+ echo " Pull the latest $FINAL_IMAGE ."
3445}
3546
3647command:update-script () {
37- if cmp -s <( docker run $FINAL_IMAGE ) $0 ; then
38- echo $0 is up to date
48+ if cmp -s <( $OCI_EXE run --rm $FINAL_IMAGE ) $0 ; then
49+ echo " $0 is up to date"
3950 else
40- echo -n Updating $0 ' ... '
41- docker run $FINAL_IMAGE > $0 && echo ok
51+ echo -n " Updating $0 ... "
52+ $OCI_EXE run --rm $FINAL_IMAGE > $0 && echo ok
4253 fi
4354}
4455
45- help:update-image () {
46- echo Update $0 from $FINAL_IMAGE .
56+ help:update-script () {
57+ echo " Update $0 from $FINAL_IMAGE ."
4758}
4859
4960command:update () {
@@ -52,7 +63,7 @@ command:update() {
5263}
5364
5465help:update () {
55- echo Pull the latest $FINAL_IMAGE , and then update $0 from that.
66+ echo " Pull the latest $FINAL_IMAGE , and then update $0 from that."
5667}
5768
5869command:help () {
@@ -98,6 +109,7 @@ while [[ $# != 0 ]]; do
98109 case $1 in
99110
100111 --)
112+ shift
101113 break
102114 ;;
103115
171183# Set the docker run extra args (if any)
172184FINAL_ARGS=${ARG_ARGS-${DOCKCROSS_ARGS} }
173185
174- # If we are not running via boot2docker
175- if [ -z $DOCKER_HOST ]; then
176- USER_IDS=" -e BUILDER_UID=$( id -u ) -e BUILDER_GID=$( id -g ) -e BUILDER_USER=$( id -un ) -e BUILDER_GROUP=$( id -gn ) "
186+ # Bash on Ubuntu on Windows
187+ UBUNTU_ON_WINDOWS=$( [ -e /proc/version ] && grep -l Microsoft /proc/version || echo " " )
188+ # MSYS, Git Bash, etc.
189+ MSYS=$( [ -e /proc/version ] && grep -l MINGW /proc/version || echo " " )
190+ # CYGWIN
191+ CYGWIN=$( [ -e /proc/version ] && grep -l CYGWIN /proc/version || echo " " )
192+
193+ if [ -z " $UBUNTU_ON_WINDOWS " -a -z " $MSYS " -a " $OCI_EXE " != " podman" ]; then
194+ USER_IDS=(-e BUILDER_UID=" $( id -u ) " -e BUILDER_GID=" $( id -g ) " -e BUILDER_USER=" $( id -un ) " -e BUILDER_GROUP=" $( id -gn ) " )
195+ fi
196+
197+ # Change the PWD when working in Docker on Windows
198+ if [ -n " $UBUNTU_ON_WINDOWS " ]; then
199+ WSL_ROOT=" /mnt/"
200+ CFG_FILE=/etc/wsl.conf
201+ if [ -f " $CFG_FILE " ]; then
202+ CFG_CONTENT=$( cat $CFG_FILE | sed -r ' /[^=]+=[^=]+/!d' | sed -r ' s/\s+=\s/=/g' )
203+ eval " $CFG_CONTENT "
204+ if [ -n " $root " ]; then
205+ WSL_ROOT=$root
206+ fi
207+ fi
208+ HOST_PWD=` pwd -P`
209+ HOST_PWD=${HOST_PWD/ $WSL_ROOT // }
210+ elif [ -n " $MSYS " ]; then
211+ HOST_PWD=$PWD
212+ HOST_PWD=${HOST_PWD/ \/ / }
213+ HOST_PWD=${HOST_PWD/ \/ /: \/ }
214+ elif [ -n " $CYGWIN " ]; then
215+ for f in pwd readlink cygpath ; do
216+ test -n " $( type " ${f} " ) " || { echo >&2 " Missing functionality (${f} ) (in cygwin)." ; exit 1 ; } ;
217+ done ;
218+ HOST_PWD=" $( cygpath -w " $( readlink -f " $( pwd ; ) " ; ) " ; ) " ;
219+ else
220+ HOST_PWD=$PWD
221+ [ -L $HOST_PWD ] && HOST_PWD=$( readlink $HOST_PWD )
222+ fi
223+
224+ # Mount Additional Volumes
225+ if [ -z " $SSH_DIR " ]; then
226+ SSH_DIR=" $HOME /.ssh"
227+ fi
228+
229+ HOST_VOLUMES=
230+ if [ -e " $SSH_DIR " -a -z " $MSYS " ]; then
231+ if test -n " ${CYGWIN} " ; then
232+ HOST_VOLUMES+=" -v $( cygpath -w ${SSH_DIR} ; ) :/home/$( id -un) /.ssh" ;
233+ else
234+ HOST_VOLUMES+=" -v $SSH_DIR :/home/$( id -un) /.ssh" ;
235+ fi ;
177236fi
178237
179238# ------------------------------------------------------------------------------
180239# Now, finally, run the command in a container
181240#
182- docker run --rm \
183- -v $PWD :/work \
184- $USER_IDS \
241+ TTY_ARGS=
242+ tty -s && [ -z " $MSYS " ] && TTY_ARGS=-ti
243+ CONTAINER_NAME=dockcross_$RANDOM
244+ $OCI_EXE run $TTY_ARGS --name $CONTAINER_NAME \
245+ -v " $HOST_PWD " :/work \
246+ $HOST_VOLUMES \
247+ " ${USER_IDS[@]} " \
185248 $FINAL_ARGS \
186249 $FINAL_IMAGE " $@ "
250+ run_exit_code=$?
251+
252+ # Attempt to delete container
253+ rm_output=$( $OCI_EXE rm -f $CONTAINER_NAME 2>&1 )
254+ rm_exit_code=$?
255+ if [[ $rm_exit_code != 0 ]]; then
256+ if [[ " $CIRCLECI " == " true" ]] && [[ $rm_output == * " Driver btrfs failed to remove" * ]]; then
257+ : # Ignore error because of https://circleci.com/docs/docker-btrfs-error/
258+ else
259+ echo " $rm_output "
260+ exit $rm_exit_code
261+ fi
262+ fi
263+
264+ exit $run_exit_code
187265
188266# ###############################################################################
189267#
190268# This image is not intended to be run manually.
191269#
192270# To create a dockcross helper script for the
193- # dockcross/linux-armv7 image, run:
271+ # dockcross/linux-armv7-lts:20230421-a0eaff4 image, run:
194272#
195- # docker run --rm dockcross/linux-armv7 > dockcross-linux-armv7
196- # chmod +x dockcross-linux-armv7
273+ # docker run --rm dockcross/linux-armv7-lts:20230421-a0eaff4 > dockcross-linux-armv7-lts-20230421-a0eaff4
274+ # chmod +x dockcross-linux-armv7-lts-20230421-a0eaff4
197275#
198276# You may then wish to move the dockcross script to your PATH.
199277#
0 commit comments