aboutsummaryrefslogtreecommitdiff
path: root/lib/actions/install.bash
blob: 19cac9ac6506628a3a353218b180b73ee76fd438 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/bash

RSTAR_DEPS_BIN+=(
	awk
	gcc
	make
	perl
)

RSTAR_DEPS_PERL+=(
	ExtUtils::Command
	Pod::Usage
)

action() {
	local OPTIND
	local prefix_absolute
	local modules
	local init
	local duration

	while getopts ":b:p:" opt
	do
		case "$opt" in
			b) RSTAR_BACKEND=$OPTARG ;;
			p) RSTAR_PREFIX=$OPTARG ;;
			*) emerg "Invalid option specified: $opt" ;;
		esac
	done

	shift $(( OPTIND -1 ))
	# TODO: Check if binaries are available

	mkdir -p -- "$RSTAR_PREFIX"
	prefix_absolute="$(CDPATH="" cd -- "$RSTAR_PREFIX" && pwd -P)"

	info "Installing Raku in $prefix_absolute"
	init="$(date +%s)"

	# 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=()
	modules="$(tmpfile)"

	awk '/^[^#]/ {print $1}' "$BASEDIR/etc/modules.txt" > "$modules"

	while read -r module
	do
		info "Installing $module"

		install_raku_module "$BASEDIR/src/rakudo-star-modules/$module" \
			&& continue

		failed_modules+=("$module")
	done < "$modules"

	# 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

	duration="$(pp_duration "$init")"

	# Friendly message
	info "Rakudo Star has been installed into $prefix_absolute!"
	info "The installation took $duration."
	info ""
	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/src/moarvm-$VERSION" || return
	perl Configure.pl \
		"$@" \
		&& make \
		&& make install \
		|| return
}

build_nqp() {
	info "Starting build on NQP"

	build_prepare "$BASEDIR/src/nqp-$VERSION" || return
	perl Configure.pl \
		--backend="$RSTAR_BACKEND" \
		"$@" \
		&& make \
		&& make install \
		|| return
}

build_rakudo() {
	info "Starting build on Rakudo"

	build_prepare "$BASEDIR/src/rakudo-$VERSION" || return
	perl Configure.pl \
		--backend="$RSTAR_BACKEND" \
		"$@" \
		&& make \
		&& make install \
		|| return
}

build_prepare() {
	local source="$1"
	local destination

	destination="$(tmpdir)"

	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"
}