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