X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=build-hc-pkg.git;a=blobdiff_plain;f=build-hc-pkg;h=e900fcfae14f44a209c2e47f40d37afb98be266e;hp=5743b3cf1554a574db00c73649001000750cb3dd;hb=HEAD;hpb=dd13c430199fd856b830e6647f659d4ef3fb300a diff --git a/build-hc-pkg b/build-hc-pkg index 5743b3c..e900fcf 100755 --- a/build-hc-pkg +++ b/build-hc-pkg @@ -1,53 +1,120 @@ #!/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 ! gmake --question --file="mk/canon-name.mk" >/dev/null 2>&1; then + gmake --file="mk/canon-name.mk" >&2 + fi + + "$canon_name" +} + +function detect_number_of_cpus () { + if sysctl -n "hw.ncpu" 2>/dev/null; then + # This works for most BSDs. + : + elif grep -qF processor /proc/cpuinfo 2>/dev/null; then + # Linux sucks... + grep -cF processor /proc/cpuinfo else - echo "$srcpath not found." >&2 + 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 + fi +} + +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 "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 detect_gnu_sed () { + if which gsed >/dev/null 2>&1; then + echo "gsed" + elif sed --version | grep -qF GNU; then + echo "sed" + else + echo "We need GNU sed to be installed." >&2 + exit 1 + fi +} + +function say_hello () { + local -r self=$(basename "$0") + local -r platform=$(detect_platform_type) + local -r n_cpus=$(detect_number_of_cpus) + + echo -n "This is $self, running on $platform with $n_cpus " + if (( $n_cpus == 1 )); then + echo "processor." + else + echo "processors." + fi +} + +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)" \ + GNUSED="$(detect_gnu_sed)" \ + 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 $@