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