summaryrefslogtreecommitdiffstats
path: root/installers/pc.sh
blob: aa61b354e9f0028107bc7d5b04c5082937aa4a36 (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
#!/bin/sh

set -u

# This should be maintained in order of compatibility, i.e. each arch can also
# run programs built for the arches before it.
ARCHES='i686 amd64'

main()
{
	local opt=
	local host_arch=
	local host_plat=
	local mirror=
	local install_arch=

	while getopts 'a:P:m:' opt; do
		case ${opt} in
			a) host_arch="${OPTARG}";;
			P) host_plat="${OPTARG}";;
			m) mirror="${OPTARG}";;
			?)
				print_usage >&2
				exit 1
				;;
		esac
	done
	shift $(($OPTIND - 1))
	if [ ${#} -ne 1 ]; then
		print_usage >&2
		exit 1
	fi
	root="${1}"

	install_arch="$(detect_arch)"
	if [ "x${host_arch}" = 'x' ]; then
		host_arch="${install_arch}"
	else
		validate_arch "${host_arch}"
	fi
	check_arch_compat "${install_arch}" "${host_arch}"

	if [ "x${host_plat}" = 'x' ]; then
		host_plat='dev'
	fi

	"${0%installers/inst-pc.sh}./miniprokit.sh" install \
		-a "${host_arch}" -P "${host_plat}" \
		${mirror:+-m} ${mirror} "${root}"
	"${0%installers/inst-pc.sh}./miniprokit.sh" shell "${root}" \
		<"${0%inst-pc.sh}data/pc.sh"
}

print_usage()
{
	printf 'Usage: %s [-a <arch>] [-P <plat>] [-m <mirror>] <root>\n' "${0}"
}

error()
{
	local status=${1}
	local fmt="${2}"
	shift 2

	printf "Error: ${fmt}\n" "${@}" >&2

	exit ${status}
}

detect_arch()
{
	local uname_m=
	local uname_s=
	local arch=

	uname_m="$( (uname -m) 2>/dev/null)" || uname_m='?'
	uname_s="$( (uname -s) 2>/dev/null)" || uname_s='?'
	case "${uname_m}:${uname_s}" in
		'i686:Linux') arch='i686-linux-glibc';;
		'x86_64:Linux') arch='amd64-linux-glibc';;
		'?:?') error 2 'Architecture unknown';;
		*) error 2 'Architecture unsupported';;
	esac

	printf '%s\n' "${arch}"
}

validate_arch()
{
	local arch="${1}"
	local arches=

	arches=" ${ARCHES} "
	if [ "x${arches#* ${arch} }" = "x${arches}" ]; then
		error 2 'Unknown architecture "%s"' "${arch}"
	fi
}

check_arch_compat()
{
	local install_arch="${1}"
	local host_arch="${2}"
	local arches=

	if [ "x${install_arch}" = "x${host_arch}" ]; then
		return 0
	fi

	arches="$(printf ' %s ' ${ARCHES})"
	if [ "x${arches#* ${host_arch} * ${install_arch} }" = "x${arches}" ]
	then
		error 2 'Cannot install a system of architecture %s on %s %s' \
			"${host_arch}" 'a system of architecture' \
			"${install_arch}"
	fi
}

main "${@}"