7e23892f657772cb06c6d5209da4098c79c02ab2
[barrelfish] / hake / hake.sh
1 #!/bin/bash
2
3 ##########################################################################
4 # Copyright (c) 2009, 2011, 2013, ETH Zurich.
5 # All rights reserved.
6 #
7 # This file is distributed under the terms in the attached LICENSE file.
8 # If you do not find this file, copies can be found by writing to:
9 # ETH Zurich D-INFK, Universit√§tstasse 6, CH-8092 Zurich. Attn: Systems Group.
10 ##########################################################################
11
12 DFLTARCHS="\"x86_64\""
13 RUN_HAKE="Yes"
14 TOOLCHAIN="ubuntu"
15 HAKEDIR=$(dirname $0)
16 DEFAULT_JOBS=4
17 JOBS="$DEFAULT_JOBS"
18
19 usage() { 
20     echo "Usage: $0 <options>"
21     echo "   -s|--source-dir: path to source tree (required)"
22     echo "   -i|--install-dir: path to install directory (defaults to \`pwd\`)"
23     echo "   -a|--architecture: specify archtitecture to build for (can be"
24     echo "       given multiple times, default architectures are"
25     echo "       $DFLTARCHS"
26     echo "   -n|--no-hake: just rebuild hake itself, don't run it (only useful"
27     echo "       for debugging hake)"
28     echo "   -t|--toolchain: toolchain to use when bootstrapping a new"
29     echo "       build tree (-t list for available options)."
30     echo "   -j|--jobs: Number of parallel jobs to run (default $DEFAULT_JOBS)."
31     echo ""
32     echo "  The way you use this script is to create a new directory for your"
33     echo "  build tree, cd into it, and run this script with the --source-dir"
34     echo "  argument specifying the top of the source tree."
35     echo ""
36     echo "  Known architectures may include: "
37     echo "     x86_64 x86_32 armv5 xscale armv7 armv7-m k10m"
38     exit 1;
39 }
40
41 toolchains() {
42     TOOLCHAINS=$(ls ${HAKEDIR}/Config.hs.* | sed s/.*Config\.hs\.//)
43     echo "Available toolchains:"
44     for tc in ${TOOLCHAINS}; do
45         echo "   $tc"
46     done
47     exit 1
48 }
49
50 #
51 # Legacy compatibility to avoid breaking the harness...
52 #
53 if [ $# -eq 1 ]; then
54     echo "WARNING: old usage of hake.sh (sole argument gives the source directory) is"
55     echo "deprecated: please use --source-dir instead."
56     SRCDIR="$1"
57     shift
58 fi
59
60 #
61 # Parse args
62 #
63 while [ $# -ne 0 ]; do
64     case $1 in
65         "-a"|"--architecture") 
66             if [ -z "$NEWARCHS" ] ; then
67                     NEWARCHS="\"$2\""
68             else
69                     NEWARCHS="$NEWARCHS, \"$2\""
70             fi
71         shift 
72             ;;
73         "-i"|"--install-dir")
74             INSTALLDIR="$2"
75         shift 
76             ;;
77         "-s"|"--source-dir")
78             SRCDIR="$2"
79         shift 
80             ;;
81         "-n"|"--no-hake")
82             RUN_HAKE="No"
83             ;;
84     "-t"|"--toolchain")
85         TOOLCHAIN="$2"
86         shift
87         if [ "${TOOLCHAIN}" == "list" ]; then
88             toolchains
89         fi
90         if [ ! -f ${HAKEDIR}/Config.hs.${TOOLCHAIN} ]; then
91             echo "Unknown toolchain \"${TOOLCHAIN}\""
92             exit 1
93         fi
94         ;;
95         "-j"|"--jobs")
96             JOBS="$2"
97         shift 
98         ;;
99         *) 
100             usage
101             ;;
102     esac
103     shift
104 done
105
106 if [ -z "$INSTALLDIR" ] ; then
107     echo "Install directory defaulting to '.'"
108     INSTALLDIR="."
109 else
110     echo "Install directory is $INSTALLDIR"
111 fi
112 cd $INSTALLDIR
113
114 if [ -z "$SRCDIR" ] ; then
115     usage
116 fi
117
118 if [ ! -f "$SRCDIR"/hake/Main.hs ] ; then
119     echo "Can't find Hake in the source directory $SRCDIR."
120     echo "Did you specify the source directory correctly?"
121     usage
122 fi
123 echo "Source directory is $SRCDIR"
124
125 if [ ! -z "$NEWARCHS" ]; then
126     ARCHS="$NEWARCHS"
127 else 
128     ARCHS="$DFLTARCHS"
129 fi
130 echo "Architectures to build: $ARCHS"
131
132 if [ ! -d hake ] ; then
133     echo "Creating a local hake directory..."
134     mkdir -p hake
135     touch hake/.marker
136 fi
137
138 echo "Setting up hake build directory..."
139 if [ ! -f hake/Config.hs ]; then
140     echo "Bootstrapping with toolchain \"${TOOLCHAIN}\""
141     cp $SRCDIR/hake/Config.hs.${TOOLCHAIN} hake/Config.hs
142     cat >> hake/Config.hs <<EOF
143
144 -- Automatically added by hake.sh. Do NOT copy these definitions to the defaults
145 source_dir = "$SRCDIR"
146 architectures = [ $ARCHS ]
147 install_dir = "$INSTALLDIR"
148 EOF
149 else
150     echo "You already have Config.hs, leaving it as-is."
151 fi
152
153 if [ ! -f ./symbolic_targets.mk ]; then
154     echo "Creating new symbolic_targets.mk file."
155     cp "$SRCDIR/hake/symbolic_targets.mk" . 
156 else
157     echo "You already have symbolic_targets.mk, leaving it as-is."
158 fi
159
160 # FIXME: do we really need this; doesn't ghc get the dependencies right? -AB
161 #rm -f hake/*.hi hake/*.o 
162
163 # RTS parameters for hake.  Tuned to perform well for the mid-2015 Barrelfish
164 # tree, building over NFS.  Maximum heap size sits around 64MB, or a little
165 # more, so 128MB minimises collections.  Parallelism is a balancing act
166 # between performance in the tree walk on NFS systems (which benefits heavily
167 # from parallelising the IO operations), and performance in Hakefile
168 # evaluation, which generally gets *slower* with more threads, as the GHC
169 # garbage collector ends up thrashing a lot.
170 HAKE_RTSOPTS="-H128M -A4M -N4"
171
172 echo "Building hake..."
173 ghc -O --make \
174     -XDeriveDataTypeable \
175     -XStandaloneDeriving \
176     -XScopedTypeVariables \
177     -package ghc \
178     -package ghc-mtl \
179     -package ghc-paths \
180     -package bytestring-trie \
181     -o hake/hake \
182     -outputdir hake \
183     -i$SRCDIR/hake \
184     -ihake \
185     -rtsopts=all \
186     -with-rtsopts="$HAKE_RTSOPTS" \
187     -threaded \
188     $SRCDIR/hake/Main.hs $LDFLAGS || exit 1
189
190     # -eventlog \
191
192 if [ "$RUN_HAKE" == "No" ] ; then
193     echo "Not running hake as per your request."
194     exit
195 fi
196
197 echo "Running hake..."
198 ./hake/hake --output-filename Makefile --source-dir "$SRCDIR" || exit
199
200 echo "Now running initial make to build dependencies."
201 echo "Running $JOBS jobs at once (-j N to change this)."
202 make -j "$JOBS" help