You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

241 lines
5.5 KiB

#!/bin/sh
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This file is part of dobuild.
# Copyright (c) 2019 Contributors as noted in the AUTHORS file.
#
# SPDX-License-Identifier: MPL-2.0
set -e
physical_pwd() {
pwd -P 2>/dev/null || pwd
}
try_canonicalize() {
readlink -f "$@" 2>/dev/null || realpath "$@"
}
canonicalize() {
if ! try_canonicalize "$1" 2>/dev/null; then
echo "$(cd "$(dirname "$1")" && physical_pwd)/$(basename "$1")"
fi
}
scriptdir() {
dirname "$(canonicalize "${BASH_SOURCE:-$1}")"
}
template_subst() {
sed \
-e "s!%MARCH%!${MARCH}!g" \
-e "s!%DISTRIB%!${DISTRIB}!g" \
-e "s!%REGISTRY_PREFIX%!${REGISTRY_PREFIX}!g"
}
mktemp_dockerfile() {
mkdir -p "$1"
echo "$1/dobuild_generated.dockerfile"
}
findonly_file() {
workingdir="$1"
name="$2"
filter="$3"
find "$workingdir" -maxdepth 1 -type f -name "$name" \
| grep "^${workingdir}/${filter}" \
| {
firstfound=
lastfound=
while IFS= read -r line; do
firstfound="${firstfound:-$line}"
lastfound="$line"
done
if [ "$firstfound" != "$lastfound" ]; then
printf 'error: more than one match found for %s in %s using filter %s\n' "$name" "$workingdir" "$filter" 1>&2
return 3
fi
echo "$firstfound"
}
}
export LANG=C
export LC_ALL=C
DOBUILDDIR="${DOBUILDDIR:-"$(dirname "$(scriptdir "$0")")"}"
MAKE="${MAKE:-$(command -v make)}"
PATH="$DOBUILDDIR/bin:$PATH"
set -- "$@" --
FILTER="$DOBUILD_FILTER"
WORKINGDIR=
MAKEFILE=
DISTRIB=
MARCH=
IMAGE=
while :; do
case $1 in
-f|--file|--makefile)
if [ "$2" != '--' ]; then
MAKEFILE="${MAKEFILE:-$2}"
set -- "$@" "$1" "$2"
shift
else
printf 'error: "%s" requires a non-empty option argument.\n' "$1" >&2
exit 3
fi
;;
--file=|--makefile=)
printf 'error: "%s" requires a non-empty option argument.\n' "$1" >&2
exit 3
;;
--file=?*|--makefile=?*)
MAKEFILE="${MAKEFILE:-${1#*=}}"
set -- "$@" "$1"
;;
-C|--directory)
if [ "$2" != '--' ]; then
WORKINGDIR="$2"
shift
else
printf 'error: "%s" requires a non-empty option argument.\n' "$1" >&2
exit 3
fi
;;
--directory=)
printf 'error: "%s" requires a non-empty option argument.\n' "$1" >&2
exit 3
;;
--directory=?*)
WORKINGDIR="${1#*=}"
;;
--dockerfile)
if [ "$2" != '--' ]; then
DOCKERFILE="$2"
shift
else
printf 'warning: "%s" ignored, requires a non-empty option argument.\n' "$1" >&2
fi
;;
--dockerfile=)
printf 'warning: "%s" ignored, requires a non-empty option argument.\n' "$1" >&2
;;
--dockerfile=?*|DOCKERFILE=?*)
DOCKERFILE="${1#*=}"
;;
--image)
if [ "$2" != '--' ]; then
IMAGE="$2"
shift
else
printf 'error: "%s" requires a non-empty option argument.\n' "$1" >&2
exit 3
fi
;;
--image=)
printf 'error: "%s" requires a non-empty option argument.\n' "$1" >&2
exit 3
;;
--image=?*|IMAGE=?*)
IMAGE="${1#*=}"
;;
--filter)
if [ "$2" != '--' ]; then
FILTER="$2"
set -- "$@" "FILTER=$FILTER"
shift
else
printf 'warning: "%s" ignored, requires a non-empty option argument.\n' "$1" >&2
fi
;;
--filter=)
printf 'warning: "%s" ignored, requires a non-empty option argument.\n' "$1" >&2
;;
--filter=?*|FILTER=?*)
FILTER="${1#*=}"
set -- "$@" "FILTER=$FILTER"
;;
MARCH=?*)
MARCH="${1#*=}"
;;
DISTRIB=?*)
DISTRIB="${1#*=}"
;;
PROJECTDIR=?*)
PROJECTDIR="${1#*=}"
;;
--)
shift
break
;;
*)
set -- "$@" "$1"
;;
esac
shift
done
if [ -n "$WORKINGDIR" ]; then
cd "$WORKINGDIR"
fi
PROJECTDIR="${DOBUILD_PROJECTDIR:-.}"
OUTDIR="${DOBUILD_OUTDIR:-$PROJECTDIR/.build}"
DISTRIB_SUFFIX="${DISTRIB:+-${DISTRIB}}"
MARCH_DISTRIB="${MARCH:-[^-]*}${DISTRIB_SUFFIX}"
FILTER="${FILTER:-${MARCH_DISTRIB:+${MARCH_DISTRIB}-}[^.]*}"
BUILD_DOCKERFILE="${DOCKERFILE:-$(findonly_file "$PROJECTDIR" '*.dockerfile' "$FILTER")}"
BUILD_DOCKERFILE="${BUILD_DOCKERFILE:-$(find "$PROJECTDIR" -maxdepth 1 -type f -name 'Dockerfile')}" || true
if [ -z "$MAKEFILE" ]; then
if [ -f "$PROJECTDIR/CMakeLists.txt" ]; then
set -- --file="$DOBUILDDIR/examples/cmake-gtest-example/Makefile" "$@"
elif [ -f "$PROJECTDIR/Makefile" ] || [ -f "$PROJECTDIR/makefile" ] || [ -f "$PROJECTDIR/GNUmakefile" ]; then
printf 'error: makefile project support not implemented.\n' >&2
exit 3
else
printf 'error: unknown project kind.\n' >&2
exit 3
fi
fi
set -- "$@" "PROJECTDIR=$PROJECTDIR" "DOBUILDDIR=$DOBUILDDIR" "OUTDIR=$OUTDIR"
if [ -n "$IMAGE" ]; then
BUILD_DOCKERFILE="$(mktemp_dockerfile "$OUTDIR")"
{ \
echo "FROM %REGISTRY_PREFIX%${IMAGE}"; \
echo; \
} | template_subst > "$BUILD_DOCKERFILE"
fi
if [ -n "$BUILD_DOCKERFILE" ]; then
if [ "$BUILD_DOCKERFILE" = '-' ]; then
BUILD_DOCKERFILE="$(mktemp_dockerfile "$OUTDIR")"
template_subst > "$BUILD_DOCKERFILE"
fi
set -- "$@" "DOCKERFILE=$BUILD_DOCKERFILE"
fi
if [ -n "$MARCH" ]; then
set -- "$@" "MARCH=$MARCH"
fi
if [ -n "$DISTRIB" ]; then
set -- "$@" "DISTRIB=$DISTRIB"
fi
exec "$MAKE" "$@"