#!/usr/bin/env bash
set -e
-declare canon_name="canon-name/src/canon-name"
-declare archive="work/archive"
-
-if [[ ! -x "$canon_name" ]]; then
- gmake -f mk/canon-name.mk
-fi
-readonly platform=$("$canon_name")
-
-echo "This is build-hc-pkg, running on \"$platform\"."
-
-if [[ "$1" = "clean" ]]; then
- echo "Cleaning..."
- rm -rf work
- exit
-fi
-
-declare srcpath=""
-if [[ -e "$archive" ]]; then
- srcpath=$(cat "$archive")
-fi
-
-if [[ -z "$srcpath" || ! -e "$srcpath" ]]; then
- mkdir -p work
- read -e -p "Enter the file path to ghc-x.y.z-src.tar.bz2: " srcpath
- if [[ -e "$srcpath" ]]; then
- mkdir -p work
- echo "$srcpath" > "$archive"
+
+function detect_platform_type () {
+ local -r canon_name="canon-name/src/canon-name"
+
+ if [[ ! -x "$canon_name" ]]; then
+ gmake -f mk/canon-name.mk
+ fi
+
+ "$canon_name"
+}
+
+function detect_number_of_cpus () {
+ case "$(detect_platform_type)" in
+ *-*-darwin)
+ ioreg -r -c IOCPU | fgrep -c IOCPUNumber
+ ;;
+ *)
+ echo "WARNING: I don't know how to detect the number of processors on this platform." >&2
+ echo "WARNING: GHC will be built using only 1 processor. Expect some slowdown." >&2
+ echo 1
+ ;;
+ esac
+}
+
++function detect_gnu_tar () {
++ if which gnutar >/dev/null 2>&1; then
++ echo "gnutar"
++ elif which gtar >/dev/null 2>&1; then
++ echo "gtar"
+ else
- echo "$srcpath not found." >&2
++ echo "We need GNU tar to be installed." >&2
+ exit 1
+ fi
-fi
-
-# What's the name of our GNU tar?
-declare gnutar=""
-if which gnutar >/dev/null 2>&1; then
- gnutar="gnutar"
-elif which gtar >/dev/null 2>&1; then
- gnutar="gtar"
-else
- echo "We need GNU tar to be installed." >&2
- exit 1
-fi
-
-gmake -f mk/main.mk \
- SRCPATH="$srcpath" \
- PLATFORM="$platform" \
- GNUTAR="$gnutar" \
- SHELL="$SHELL"
-
-echo "If you are done, run \"$0 clean\" to cleanup the working directory."
++}
++
+function say_hello () {
+ local -r platform=$(detect_platform_type)
+ local -r n_cpus=$(detect_number_of_cpus)
+ echo "This is build-hc-pkg, running on $platform with $n_cpus processors."
+}
+
+function srcpath () {
+ local -r archive="work/archive"
+ local srcpath=""
+
+ if [[ -e "$archive" ]]; then
+ srcpath=$(cat "$archive")
+ fi
+
+ if [[ -z "$srcpath" || ! -e "$srcpath" ]]; then
+ mkdir -p work
+ read -e -p "Enter the file path to ghc-x.y.z-src.tar.bz2: " srcpath
+ if [[ -e "$srcpath" ]]; then
+ mkdir -p work
+ echo "$srcpath" > "$archive"
+ else
+ echo "$srcpath not found." >&2
+ exit 1
+ fi
+ fi
+
+ echo "$srcpath"
+}
+
+function build_hc_pkg () {
+ local -r srcpath="$(srcpath)"
+
+ gmake \
+ -j $(($(detect_number_of_cpus) + 1)) \
+ -f mk/main.mk \
+ SRCPATH="$srcpath" \
+ PLATFORM="$(detect_platform_type)" \
++ GNUTAR="$(detect_gnu_tar)" \
+ SHELL="$SHELL"
+
+ echo "If you are done, run \"$0 clean\" to cleanup the working directory."
+}
+
+function main () {
+ case "$1" in
+ "")
+ say_hello
+ build_hc_pkg
+ exit
+ ;;
+ "clean")
+ echo "Cleaning..."
+ rm -rf work
+ exit
+ ;;
+ *)
+ echo "Usage: $0 [clean]" >&2
+ exit 1
+ ;;
+ esac
+}
+
+main $@