#!/bin/sh
set -e
# Paths
dir_build="$PWD/build"
dir_source="$PWD/source"
dir_install="$PWD/install"
# Some printing functions
show_help() {
echo "This astronaut will help you build some satellites.
Just describe what he's got to do in a satellite file.
Usage: $0 [-s
] [-b ] [-i ]
-s Set source directory
-b Set build directory [WARNING: Will be deleted before build]
-i Set install directory"
}
msg() {
echo "=> $@"
}
exiterr() {
echo "===> Houston, we've got a problem: $@" 1>&2
exit 1
}
# Gather info
while getopts "h?s:b:i:" opt; do
case "$opt" in
h|\?)
show_help
exit 0
;;
s)
dir_source="$(realpath "$OPTARG")"
;;
b)
dir_build="$(realpath "$OPTARG")"
;;
i)
dir_install="$(realpath "$OPTARG")"
;;
esac
done
shift $((OPTIND-1))
[ "$1" = "--" ] && shift
if [ ! "$1" ]; then
show_help
exit 1
fi
satellite="$(realpath "$1")"
if [ ! -f "$satellite" ]; then
exiterr "Can't find satellite file"
fi
# Configuration
cmd_download="curl -#L -o {dst} {src}"
cmd_extract="tar xf {src}"
# Tools for the astronaut
mksum() {
echo $(md5sum "$@" 2> /dev/null | cut -d' ' -f1)
}
download() {
local name="$(basename "$1")"
local path="$dir_source/$name"
local checksum=""
if [ "$2" -a -f "$path" ]; then
checksum="$(mksum "$path")"
fi
if [ ! -f "$path" -o "$checksum" != "$2" ]; then
msg "Downloading $name"
if [ "$3" ]; then
local cmd="$3"
else
local cmd="$cmd_download"
fi
$(echo "$cmd" | sed -e 's@{dst}@'"$path"'@g' -e 's@{src}@'"$1"'@g')
checksum="$(mksum "$path")"
if [ "$2" -a "$checksum" != "$2" ]; then
msg "Checksum: $checksum"
exiterr "Checksum failed"
fi
fi
}
extract() {
msg "Extracting $1"
if [ "$2" ]; then
local cmd="$2"
else
local cmd="$cmd_extract"
fi
$(echo "$cmd" | sed -e 's@{src}@'"$dir_source/$1"'@g')
}
dlextract() {
download "$1" "$2"
extract "$(basename "$1")"
}
extrafile() {
cp "$(dirname "$satellite")/$1" "$dir_build/$1"
}
# Create the satellite
rm -rf "$dir_build"
mkdir -p "$dir_source"
mkdir -p "$dir_build"
mkdir -p "$dir_install"
cd "$dir_build"
. "$satellite"