mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-18 20:37:56 +00:00
5411e69b91
To avoid proliferation of versions, I suggest the following policy: the oldest LTS release still receiving maintenance updates + the most recent release for distributions that offer LTS releases. For CentOS, this means CentOS7 and CentOS Stream 9 (since CentOS are all "long-term support", this is just the oldest and the newest among currently supported). For Ubuntu, this means Ubuntu 18.04 (previous LTS are in "security fixes only" mode) and Ubuntu 21.10. Recent Ubuntu attempts to be interactive during the configuration of tzdata, required some additional setup. In the common installation script, the logic for handling a configured/built local directory breaks if `gmake` is detected as the make binary; `make distclean` then fails inside the container because not all systems have `gmake` symlink. Remove that attempt of a workaround completely, just require that the host directory is clean. Signed-off-by: Alexey Neyman <stilor@att.net>
190 lines
4.0 KiB
Bash
Executable File
190 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Run from the directory containing this script
|
|
cd `dirname $0`
|
|
|
|
# Global return code (flags an error if any of the actions fail)
|
|
global_rc=0
|
|
|
|
msg()
|
|
{
|
|
echo "INFO :: $*" >&2
|
|
}
|
|
|
|
warn()
|
|
{
|
|
echo "WARN :: $*" >&2
|
|
}
|
|
|
|
error()
|
|
{
|
|
echo "ERROR :: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
usage()
|
|
{
|
|
cat >&2 <<EOF
|
|
${1:+ERROR :: $1
|
|
|
|
}Usage: $0 [action] [containter] [args...]
|
|
|
|
Action is one of:
|
|
|
|
build Build or rebuild the specified containers.
|
|
install Install crosstool-NG in specified containers.
|
|
sample Build a sample or if no sample name specified, all.
|
|
enter Spawn a shell in the specified container.
|
|
root Spawn a root shell in the specified container.
|
|
clean Clean up in the specified container.
|
|
distclean Same as clean but also remove installed versions of
|
|
Crosstool-NG and the previously built toolchains.
|
|
|
|
If a special container name 'all' is used, the action is performed
|
|
on all the containers.
|
|
EOF
|
|
exit 1
|
|
}
|
|
|
|
do_cleanup()
|
|
{
|
|
local d
|
|
|
|
for d in "$@"; do
|
|
[ -d "$d" ] || continue
|
|
chmod -R a+w "$d"
|
|
rm -rf "$d"
|
|
done
|
|
}
|
|
|
|
# Build a docker container, store its ID.
|
|
action_build()
|
|
{
|
|
local cntr=$1
|
|
|
|
msg "Cleaning up previous runs for ${cntr}"
|
|
do_cleanup ${cntr}/{build,install,xtools}
|
|
msg "Building Docker container for ${cntr}"
|
|
set -x
|
|
docker build --no-cache -t "ctng-${cntr}" --build-arg CTNG_GID=`id -g` --build-arg CTNG_UID=`id -u` "${cntr}"
|
|
}
|
|
|
|
# Common backend for enter/test
|
|
_dckr()
|
|
{
|
|
local topdir=`cd ../.. && pwd`
|
|
local cntr=$1
|
|
local scmd prefix
|
|
shift
|
|
|
|
mkdir -p ${cntr}/{build,install,xtools}
|
|
prefix="docker run --rm -i -t \
|
|
-v `pwd`/common-scripts:/common-scripts:ro \
|
|
-v ${topdir}:/crosstool-ng:ro \
|
|
-v `pwd`/${cntr}/build:/home/ctng/work \
|
|
-v `pwd`/${cntr}/install:/opt/ctng \
|
|
-v `pwd`/${cntr}/xtools:/home/ctng/x-tools \
|
|
-v $HOME/src:/home/ctng/src:ro \
|
|
ctng-${cntr}"
|
|
if [ -n "${AS_ROOT}" ]; then
|
|
$prefix "$@"
|
|
elif [ -n "$*" ]; then
|
|
$prefix su -l ctng -c "$*"
|
|
else
|
|
$prefix su -l ctng
|
|
fi
|
|
if [ $? != 0 ]; then
|
|
global_rc=1
|
|
fi
|
|
return $global_rc
|
|
}
|
|
|
|
# Run the test
|
|
action_install()
|
|
{
|
|
local cntr=$1
|
|
|
|
# The test assumes the top directory is bootstrapped, but clean.
|
|
msg "Setting up crosstool-NG in ${cntr}"
|
|
do_cleanup ${cntr}/build
|
|
if ! _dckr "${cntr}" /common-scripts/ctng-install; then
|
|
warn "Installation failed"
|
|
elif ! _dckr "${cntr}" /common-scripts/ctng-test-basic; then
|
|
warn "Basic tests failed"
|
|
fi
|
|
}
|
|
|
|
# Run the test
|
|
action_sample()
|
|
{
|
|
local cntr=$1
|
|
shift
|
|
|
|
msg "Building samples in ${cntr} [$@]"
|
|
do_cleanup ${cntr}/build
|
|
_dckr "${cntr}" /common-scripts/ctng-build-sample "$@"
|
|
}
|
|
|
|
# Enter the container using the same user account/environment as for testing.
|
|
action_enter()
|
|
{
|
|
local cntr=$1
|
|
shift
|
|
|
|
msg "Entering ${cntr}"
|
|
_dckr "${cntr}" "$@"
|
|
}
|
|
|
|
# Enter the container using the same user account/environment as for testing.
|
|
action_root()
|
|
{
|
|
local cntr=$1
|
|
|
|
msg "Entering ${cntr} as root"
|
|
AS_ROOT=y _dckr "${cntr}" /bin/bash
|
|
}
|
|
|
|
# Clean up after test suite run
|
|
action_clean()
|
|
{
|
|
local cntr=$1
|
|
|
|
msg "Cleaning up after ${cntr}"
|
|
do_cleanup ${cntr}/build
|
|
}
|
|
|
|
# Clean up after test suite run
|
|
action_distclean()
|
|
{
|
|
local cntr=$1
|
|
|
|
msg "Dist cleaning ${cntr}"
|
|
do_cleanup ${cntr}/{build,install,xtools}
|
|
}
|
|
|
|
all_containers=`ls */Dockerfile | sed 's,/Dockerfile,,'`
|
|
action=$1
|
|
selected_containers=$2
|
|
shift 2
|
|
if [ "${selected_containers}" = "all" ]; then
|
|
selected_containers="${all_containers}"
|
|
fi
|
|
|
|
case "${action}" in
|
|
build|install|sample|enter|root|clean|distclean)
|
|
for c in ${selected_containers}; do
|
|
eval "action_${action} ${c%/} \"$@\""
|
|
done
|
|
;;
|
|
"")
|
|
usage "No action specified."
|
|
;;
|
|
*)
|
|
usage "Unknown action ${action}."
|
|
;;
|
|
esac
|
|
if [ "${global_rc}" != 0 ]; then
|
|
error "Some of the actions failed, see warnings above"
|
|
fi
|
|
exit ${global_rc}
|