From 1d983e9f934bf6aeb9333c763fe1a603b8d8e5c4 Mon Sep 17 00:00:00 2001 From: Patrick Spek Date: Sun, 22 Mar 2020 11:48:23 +0100 Subject: Initial commit --- lib/actions/clean.bash | 11 ++++ lib/actions/dist.bash | 48 ++++++++++++++++++ lib/actions/fetch.bash | 98 ++++++++++++++++++++++++++++++++++++ lib/actions/install.bash | 127 +++++++++++++++++++++++++++++++++++++++++++++++ lib/actions/test.bash | 6 +++ 5 files changed, 290 insertions(+) create mode 100644 lib/actions/clean.bash create mode 100644 lib/actions/dist.bash create mode 100644 lib/actions/fetch.bash create mode 100644 lib/actions/install.bash create mode 100644 lib/actions/test.bash (limited to 'lib/actions') diff --git a/lib/actions/clean.bash b/lib/actions/clean.bash new file mode 100644 index 0000000..c00e85d --- /dev/null +++ b/lib/actions/clean.bash @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +action() { + remove "$BASEDIR/tmp" + remove "$BASEDIR/install" +} + +remove() { + info "Removing $1" + rm -fr -- "$1" +} diff --git a/lib/actions/dist.bash b/lib/actions/dist.bash new file mode 100644 index 0000000..3b06b4f --- /dev/null +++ b/lib/actions/dist.bash @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +RSTAR_DEPS_BIN+=( + git + tar +) + +action() { + local version="${1:-$(date +%Y.%m)}" + WORKDIR="$BASEDIR/tmp/rakudo-star-$version" + + info "Creating distribution contents at $WORKDIR" + + cd -- "$BASEDIR" + + # Include files from this project + for file in $(git ls-files) + do + dist_include "/$file" + done + + # Include the sources of all components + for src in dist/src/* + do + dist_include "/$src" + done + + # Add a MANIFEST.txt + cd -- "$WORKDIR" + find . > MANIFEST.txt + + # Tar it all up into a distribution tarball + info "Creating tarball out of $WORKDIR" + + local tarball="$BASEDIR/dist/rakudo-star-$version.tar.gz" + + mkdir -p -- "$(dirname "$tarball")" + cd -- "$BASEDIR/tmp" + + tar czf "$tarball" "rakudo-star-$version" + + info "Distribution tarball available at $tarball" +} + +dist_include() { + mkdir -p -- "$(dirname "${WORKDIR}$1")" + cp -r -- "${BASEDIR}$1" "${WORKDIR}$1" +} diff --git a/lib/actions/fetch.bash b/lib/actions/fetch.bash new file mode 100644 index 0000000..c489608 --- /dev/null +++ b/lib/actions/fetch.bash @@ -0,0 +1,98 @@ +#!/usr/bin/env bash + +RSTAR_DEPS_BIN=( + awk + curl + git + tar +) + +action() { + # Ensure the directory to download to exists + mkdir -p "$BASEDIR/dist/src/core" + + # Download all core components + for component in moarvm nqp rakudo + do + download_core "$component" + done + + mkdir -p "$BASEDIR/dist/src/modules" + + # Download all modules available over http + list_modules "http" | while read -r name proto url prefix + do + download_module_http "$name" "$url" "$prefix" + done + + # Download all modules available over git + list_modules "git" | while read -r name proto url ref + do + download_module_git "$name" "$url" "$ref" + done +} + +download_core() { + local version="$(config_etc_kv "dist_$1.txt" "version")" + local source="$(echo "$(config_etc_kv "dist_$1.txt" "url")" | sed "s/%s/$version/g")" + local destination="$BASEDIR/dist/src/core/$1-$version" + + if [[ -d $destination ]] + then + warn "Skipping sources for $1, destination already exists: $destination" + return 0 + fi + + mkdir -p -- "$destination" + + tarball="$(fetch "$source")" + tar xzf "$tarball" -C "$destination" --strip-components=1 && return + + crit "Failed to download $destination" + rm -f -- "$destination" +} + +download_module_git() { + local name=$1 + local url=$2 + local ref=$3 + local destination="$BASEDIR/dist/src/modules/$name" + + if [[ -d "$destination" ]] + then + warn "Skipping sources for $name, destination already exists: $destination" + return 0 + fi + + notice "Cloning $url@$ref to $destination" + git clone -b "$ref" "$url" --depth=1 --single-branch "$destination" \ + > /dev/null 2>&1 + + rm -fr -- "$destination/.git" +} + +download_module_http() { + local name=$1 + local url=$2 + local prefix=$3 + local destination="$BASEDIR/dist/src/modules/$name" + + if [[ -d "$destination" ]] + then + warn "Skipping sources for $name, destination already exists: $destination" + return 0 + fi + + local tarball="$(fetch "$url")" + local extracted="$(tempdir)" + + notice "Extracting $tarball into $extracted" + tar xzf "$tarball" -C "$extracted" + + notice "Moving $extracted/$prefix to $destination" + mv -- "$extracted/$prefix" "$destination" +} + +list_modules() { + awk '/^[^#]/ && $2 == "'"$1"'" { print }' "$BASEDIR/etc/modules.txt" +} diff --git a/lib/actions/install.bash b/lib/actions/install.bash new file mode 100644 index 0000000..30b88dd --- /dev/null +++ b/lib/actions/install.bash @@ -0,0 +1,127 @@ +#!/usr/bin/bash + +RSTAR_DEPS_BIN+=( + awk + gcc + make + perl +) + +RSTAR_DEPS_PERL+=( + ExtUtils::Command + Pod::Usage +) + +action() { + local OPTIND + + while getopts ":b:p:" opt + do + case "$opt" in + b) RSTAR_BACKEND=$OPTARG ;; + p) RSTAR_PREFIX=$OPTARG ;; + esac + done + + shift $(( OPTIND -1 )) + # TODO: Check if binaries are available + + mkdir -p -- "$RSTAR_PREFIX" + local prefix_absolute="$(CDPATH="" cd -- "$RSTAR_PREFIX" && pwd -P)" + + info "Installing Raku in $prefix_absolute" + + # Compile all core components + for component in moarvm nqp rakudo + do + VERSION="$(config_etc_kv "dist_$component.txt" "version")" \ + build_"$component" \ + --prefix="$RSTAR_PREFIX" \ + --relocatable \ + && continue + + die "Build failed!" + done + + # Install community modules + failed_modules=() + + for module in $(awk '/^[^#]/ {print $1}' "$BASEDIR/etc/modules.txt") + do + info "Installing $module" + + install_raku_module "$BASEDIR/dist/src/modules/$module" \ + && continue + + failed_modules+=("$module") + done + + # Show a list of all modules that failed to install + if [[ $failed_modules ]] + then + crit "The following modules failed to install:" + + for module in "${failed_modules[@]}" + do + crit " $module" + done + fi + + # Friendly message + info "Rakudo Star has been installed into $prefix_absolute!" + info "You may need to add the following paths to your \$PATH:" + info " $prefix_absolute/bin" + info " $prefix_absolute/share/perl6/site/bin" + info " $prefix_absolute/share/perl6/vendor/bin" + info " $prefix_absolute/share/perl6/core/bin" +} + +build_moarvm() { + info "Starting build on MoarVM" + + build_prepare "$BASEDIR/dist/src/core/moarvm-$VERSION" || return + perl Configure.pl \ + "$@" \ + && make \ + && make install \ + || return +} + +build_nqp() { + info "Starting build on NQP" + + build_prepare "$BASEDIR/dist/src/core/nqp-$VERSION" || return + perl Configure.pl \ + --backend="$RSTAR_BACKEND" \ + "$@" \ + && make \ + && make install \ + || return +} + +build_rakudo() { + info "Starting build on Rakudo" + + build_prepare "$BASEDIR/dist/src/core/rakudo-$VERSION" || return + perl Configure.pl \ + --backend="$RSTAR_BACKEND" \ + "$@" \ + && make \ + && make install \ + || return +} + +build_prepare() { + local source="$1" + local destination="$(tempdir)" + + notice "Using $destination as working directory" + + cp -R -- "$source/." "$destination" \ + && cd -- "$destination" \ + || return +} + +install_raku_module() { + "$RSTAR_PREFIX/bin/raku" "$BASEDIR/lib/install-module.raku" "$1" +} diff --git a/lib/actions/test.bash b/lib/actions/test.bash new file mode 100644 index 0000000..68c6d60 --- /dev/null +++ b/lib/actions/test.bash @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +action() { + # TODO: Implement test + die "Not yet implemented" +} -- cgit v1.1