From 1fdd884913f7ed6bd8ff5a08d4e719a413b8d315 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Mon, 21 Jul 2014 01:05:22 -0400 Subject: installers/pc: New installer for PC platforms --- (limited to 'installers/pc.sh') diff --git a/installers/pc.sh b/installers/pc.sh new file mode 100644 index 0000000..aa61b35 --- /dev/null +++ b/installers/pc.sh @@ -0,0 +1,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 ] [-P ] [-m ] \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 "${@}" -- cgit v0.9.1