aboutsummaryrefslogtreecommitdiff
path: root/lib/actions
diff options
context:
space:
mode:
authorPatrick Spek <p.spek@tyil.nl>2020-03-22 11:48:23 +0100
committerPatrick Spek <p.spek@tyil.nl>2020-03-22 11:48:23 +0100
commit1d983e9f934bf6aeb9333c763fe1a603b8d8e5c4 (patch)
treeff96afaf569e8669a28ba35e85a1441621117d0b /lib/actions
Initial commit
Diffstat (limited to 'lib/actions')
-rw-r--r--lib/actions/clean.bash11
-rw-r--r--lib/actions/dist.bash48
-rw-r--r--lib/actions/fetch.bash98
-rw-r--r--lib/actions/install.bash127
-rw-r--r--lib/actions/test.bash6
5 files changed, 290 insertions, 0 deletions
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"
+}