278 lines
7.2 KiB
Bash
Executable File
278 lines
7.2 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
##########################################################################
|
|
# Copyright (c) 2009, 2011, 2013, 2015, ETH Zurich.
|
|
# All rights reserved.
|
|
#
|
|
# This file is distributed under the terms in the attached LICENSE file.
|
|
# If you do not find this file, copies can be found by writing to:
|
|
# ETH Zurich D-INFK, Universitaetstasse 6, CH-8092 Zurich. Attn: Systems Group.
|
|
##########################################################################
|
|
|
|
DFLTARCHS="\"armv8\""
|
|
RUN_HAKE="Yes"
|
|
HAKEDIR=$(dirname $0)
|
|
DEFAULT_JOBS=4
|
|
JOBS="$DEFAULT_JOBS"
|
|
CACHEDIR="$HOME/.cache/barrelfish"
|
|
HAGFISH_LOCATION="/home/netos/tftpboot/Hagfish.efi"
|
|
DEFAULT_OPT_FLAGS="-O2 -g -DNDEBUG"
|
|
|
|
# Don't override the default toolchain unless asked to.
|
|
TOOLROOT=Nothing
|
|
ARM_TOOLSPEC=Nothing
|
|
AARCH64_TOOLSPEC=Nothing
|
|
THUMB_TOOLSPEC=Nothing
|
|
ARMEB_TOOLSPEC=Nothing
|
|
X86_TOOLSPEC=Nothing
|
|
K1OM_TOOLSPEC=Nothing
|
|
|
|
usage() {
|
|
echo "Usage: $0 <options>"
|
|
echo " -s|--source-dir: path to source tree (required)"
|
|
echo " -i|--install-dir: path to install directory (defaults to \`pwd\`)"
|
|
echo " -a|--architecture: specify archtitecture to build for (can be"
|
|
echo " given multiple times, default architectures are"
|
|
echo " $DFLTARCHS"
|
|
echo " -n|--no-hake: just rebuild hake itself, don't run it (only useful"
|
|
echo " for debugging hake)"
|
|
echo " -t|--toolchain <arch> <toolchain>: use <toolchain> to build for"
|
|
echo " <arch>."
|
|
echo " -r|--toolroot <path>: where should I look for toolchains (instead"
|
|
echo " of (/home/netos/tools)"
|
|
ecgi " -f|--flags <flags>: the compiler flags to set (defaut $DEFAULT_OPT_FLAGS)"
|
|
echo " -j|--jobs: Number of parallel jobs to run (default $DEFAULT_JOBS)."
|
|
echo " --hagfish: Location of Hagfish boot loader (default $HAGFISH_LOCATION)."
|
|
echo " --cachedir: Cache directory (default $CACHEDIR)."
|
|
echo " --help: Print this help."
|
|
echo ""
|
|
echo " The way you use this script is to create a new directory for your"
|
|
echo " build tree, cd into it, and run this script with the --source-dir"
|
|
echo " argument specifying the top of the source tree."
|
|
echo ""
|
|
echo " Known architectures may include: "
|
|
echo " x86_64 armv7 armv8 k1om"
|
|
exit 1;
|
|
}
|
|
|
|
#
|
|
# Legacy compatibility to avoid breaking the harness...
|
|
#
|
|
if test $# -eq 1 && test $1 != "-"*; then
|
|
echo "WARNING: old usage of hake.sh (sole argument gives the source directory) is"
|
|
echo "deprecated: please use --source-dir instead."
|
|
SRCDIR="$1"
|
|
shift
|
|
fi
|
|
|
|
#
|
|
# Parse args
|
|
#
|
|
while test $# -ne 0; do
|
|
case $1 in
|
|
"-a"|"--architecture")
|
|
if test -z "$NEWARCHS"; then
|
|
NEWARCHS="\"$2\""
|
|
else
|
|
NEWARCHS="$NEWARCHS, \"$2\""
|
|
fi
|
|
shift
|
|
;;
|
|
"-i"|"--install-dir")
|
|
INSTALLDIR="$2"
|
|
shift
|
|
;;
|
|
"-f"|"--flagsr")
|
|
OPT_FLAGS="$2"
|
|
shift
|
|
;;
|
|
"-s"|"--source-dir")
|
|
SRCDIR="$2"
|
|
shift
|
|
;;
|
|
"-n"|"--no-hake")
|
|
RUN_HAKE="No"
|
|
;;
|
|
"-d"|"--no-deps")
|
|
NO_DEPS="No"
|
|
;;
|
|
"-t"|"--toolchain")
|
|
TC_ARCH="$2"
|
|
shift
|
|
TOOLSPEC="$2"
|
|
shift
|
|
case ${TC_ARCH} in
|
|
"arm")
|
|
ARM_TOOLSPEC="Just Tools.$TOOLSPEC"
|
|
;;
|
|
"aarch64")
|
|
AARCH64_TOOLSPEC="Just Tools.$TOOLSPEC"
|
|
;;
|
|
"thumb")
|
|
THUMB_TOOLSPEC="Just Tools.$TOOLSPEC"
|
|
;;
|
|
"armeb")
|
|
ARMEB_TOOLSPEC="Just Tools.$TOOLSPEC"
|
|
;;
|
|
"x86")
|
|
X86_TOOLSPEC="Just Tools.$TOOLSPEC"
|
|
;;
|
|
"k1om")
|
|
K1OM_TOOLSPEC="Just Tools.$TOOLSPEC"
|
|
;;
|
|
*)
|
|
echo "Unknown toolchain architecture: $TC_ARCH"
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
"-r"|"--toolroot")
|
|
TOOLROOT="Just \"$2\""
|
|
shift
|
|
;;
|
|
"-j"|"--jobs")
|
|
JOBS="$2"
|
|
shift
|
|
;;
|
|
"--cachedir")
|
|
CACHEDIR="$2"
|
|
shift
|
|
;;
|
|
"--hagfish")
|
|
HAGFISH_LOCATION="$2"
|
|
shift
|
|
;;
|
|
"--help")
|
|
usage
|
|
;;
|
|
*)
|
|
usage
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if test -z "$INSTALLDIR"; then
|
|
echo "Install directory defaulting to '.'"
|
|
INSTALLDIR="."
|
|
else
|
|
echo "Install directory is $INSTALLDIR"
|
|
fi
|
|
cd $INSTALLDIR
|
|
|
|
if test -z "$SRCDIR"; then
|
|
usage
|
|
fi
|
|
|
|
if test ! -f "$SRCDIR"/hake/Main.hs; then
|
|
echo "Can't find Hake in the source directory $SRCDIR."
|
|
echo "Did you specify the source directory correctly?"
|
|
usage
|
|
fi
|
|
echo "Source directory is $SRCDIR"
|
|
|
|
if test ! -z "$NEWARCHS"; then
|
|
ARCHS="$NEWARCHS"
|
|
else
|
|
ARCHS="$DFLTARCHS"
|
|
fi
|
|
echo "Architectures to build: $ARCHS"
|
|
|
|
if test ! -d "$CACHEDIR"; then
|
|
mkdir -p "$CACHEDIR"
|
|
chmod g+rw "$CACHEDIR"
|
|
fi
|
|
|
|
if test ! -d hake; then
|
|
echo "Creating a local hake directory..."
|
|
mkdir -p hake
|
|
touch hake/.marker
|
|
fi
|
|
|
|
|
|
if test -z "$OPT_FLAGS"; then
|
|
OPT_FLAGS=$DEFAULT_OPT_FLAGS
|
|
fi
|
|
|
|
OPTIMIZATION_FLAGS="\"\""
|
|
for f in $OPT_FLAGS; do
|
|
OPTIMIZATION_FLAGS="$OPTIMIZATION_FLAGS, \"$f\" "
|
|
done
|
|
|
|
echo "Optimization Flags: $OPT_FLAGS"
|
|
|
|
echo "Setting up hake build directory..."
|
|
if test ! -f hake/Config.hs; then
|
|
echo "Bootstrapping Config.hs"
|
|
cp $SRCDIR/hake/Config.hs.template hake/Config.hs
|
|
cat >> hake/Config.hs <<EOF
|
|
|
|
-- Automatically added by hake.sh. Do NOT copy these definitions to the defaults
|
|
source_dir = "$SRCDIR"
|
|
architectures = [ $ARCHS ]
|
|
install_dir = "$INSTALLDIR"
|
|
toolroot = $TOOLROOT
|
|
arm_toolspec = $ARM_TOOLSPEC
|
|
aarch64_toolspec = $AARCH64_TOOLSPEC
|
|
thumb_toolspec = $THUMB_TOOLSPEC
|
|
armeb_toolspec = $ARMEB_TOOLSPEC
|
|
x86_toolspec = $X86_TOOLSPEC
|
|
k1om_toolspec = $K1OM_TOOLSPEC
|
|
cache_dir = "$CACHEDIR"
|
|
hagfish_location = "$HAGFISH_LOCATION"
|
|
cOptFlags = [ $OPTIMIZATION_FLAGS ]
|
|
EOF
|
|
else
|
|
echo "You already have Config.hs, leaving it as-is."
|
|
fi
|
|
|
|
|
|
# FIXME: do we really need this; doesn't ghc get the dependencies right? -AB
|
|
#rm -f hake/*.hi hake/*.o
|
|
|
|
# RTS parameters for hake. Tuned to perform well for the mid-2015 Barrelfish
|
|
# tree, building over NFS. Maximum heap size sits around 64MB, or a little
|
|
# more, so 128MB minimises collections. Parallelism is a balancing act
|
|
# between performance in the tree walk on NFS systems (which benefits heavily
|
|
# from parallelising the IO operations), and performance in Hakefile
|
|
# evaluation, which generally gets *slower* with more threads, as the GHC
|
|
# garbage collector ends up thrashing a lot.
|
|
HAKE_RTSOPTS="-H1024M -A4M -N4"
|
|
|
|
echo "Building hake..."
|
|
ghc -O2 --make \
|
|
-XDeriveDataTypeable \
|
|
-XStandaloneDeriving \
|
|
-XScopedTypeVariables \
|
|
-package ghc \
|
|
-package ghc-mtl \
|
|
-package ghc-paths \
|
|
-package bytestring-trie \
|
|
-o hake/hake \
|
|
-outputdir hake \
|
|
-i$SRCDIR/hake \
|
|
-ihake \
|
|
-rtsopts=all \
|
|
-with-rtsopts="$HAKE_RTSOPTS" \
|
|
-threaded \
|
|
$SRCDIR/hake/Main.hs $LDFLAGS || exit 1
|
|
|
|
# -eventlog \
|
|
|
|
if test "$RUN_HAKE" = "No"; then
|
|
echo "Not running hake as per your request."
|
|
exit
|
|
fi
|
|
|
|
echo "Running hake..."
|
|
./hake/hake --output-filename Makefile --source-dir "$SRCDIR/" --ghc-libdir "$(ghc --print-libdir)" || exit
|
|
|
|
if test "$NO_DEPS" = "No"; then
|
|
echo "Not running dependencies as per your request."
|
|
exit
|
|
fi
|
|
|
|
echo "Now running initial make to build dependencies."
|
|
echo "Running $JOBS jobs at once (-j N to change this)."
|
|
make -j "$JOBS" help
|