Cleanup
[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
17 usage() { 
18     echo "Usage: $0 <options>"
19     echo "   -s|--source-dir: path to source tree (required)"
20     echo "   -i|--install-dir: path to install directory (defaults to \`pwd\`)"
21     echo "   -a|--architecture: specify archtitecture to build for (can be"
22     echo "       given multiple times, default architectures are"
23     echo "       $DFLTARCHS"
24     echo "   -n|--no-hake: just rebuild hake itself, don't run it (only useful"
25     echo "       for debugging hake)"
26     echo "   -t|--toolchain: toolchain to use when bootstrapping a new"
27     echo "       build tree (-t list for available options)."
28     echo ""
29     echo "  The way you use this script is to create a new directory for your"
30     echo "  build tree, cd into it, and run this script with the --source-dir"
31     echo "  argument specifying the top of the source tree."
32     echo ""
33     echo "  Known architectures may include: "
34     echo "     x86_64 x86_32 armv5 arm11mp xscale armv7 armv7-m k10m"
35     exit 1;
36 }
37
38 toolchains() {
39     TOOLCHAINS=$(ls ${HAKEDIR}/Config.hs.* | sed s/.*Config\.hs\.//)
40     echo "Available toolchains:"
41     for tc in ${TOOLCHAINS}; do
42         echo "   $tc"
43     done
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         TOOLCHAIN="$2"
83         shift
84         if [ "${TOOLCHAIN}" == "list" ]; then
85             toolchains
86         fi
87         if [ ! -f ${HAKEDIR}/Config.hs.${TOOLCHAIN} ]; then
88             echo "Unknown toolchain \"${TOOLCHAIN}\""
89             exit 1
90         fi
91         ;;
92         *) 
93             usage
94             ;;
95     esac
96     shift
97 done
98
99 if [ -z "$INSTALLDIR" ] ; then
100     echo "Install directory defaulting to '.'"
101     INSTALLDIR="."
102 else
103     echo "Install directory is $INSTALLDIR"
104 fi
105 cd $INSTALLDIR
106
107 if [ -z "$SRCDIR" ] ; then
108     usage
109 fi
110
111 if [ ! -f "$SRCDIR"/hake/Main.hs ] ; then
112     echo "Can't find Hake in the source directory $SRCDIR."
113     echo "Did you specify the source directory correctly?"
114     usage
115 fi
116 echo "Source directory is $SRCDIR"
117
118 if [ ! -z "$NEWARCHS" ]; then
119     ARCHS="$NEWARCHS"
120 else 
121     ARCHS="$DFLTARCHS"
122 fi
123 echo "Architectures to build: $ARCHS"
124
125 if [ ! -d hake ] ; then
126     echo "Creating a local hake directory..."
127     mkdir -p hake
128     touch hake/.marker
129 fi
130
131 echo "Setting up hake build directory..."
132 if [ ! -f hake/Config.hs ]; then
133     echo "Bootstrapping with toolchain \"${TOOLCHAIN}\""
134     cp $SRCDIR/hake/Config.hs.${TOOLCHAIN} hake/Config.hs
135     cat >> hake/Config.hs <<EOF
136
137 -- Automatically added by hake.sh. Do NOT copy these definitions to the defaults
138 source_dir = "$SRCDIR"
139 architectures = [ $ARCHS ]
140 install_dir = "$INSTALLDIR"
141 EOF
142 else
143     echo "You already have Config.hs, leaving it as-is."
144 fi
145
146 if [ ! -f ./symbolic_targets.mk ]; then
147     echo "Creating new symbolic_targets.mk file."
148     cp "$SRCDIR/hake/symbolic_targets.mk" . 
149 else
150     echo "You already have symbolic_targets.mk, leaving it as-is."
151 fi
152
153 # FIXME: do we really need this; doesn't ghc get the dependencies right? -AB
154 #rm -f hake/*.hi hake/*.o 
155
156 echo "Building hake..."
157 ghc -O --make -XDeriveDataTypeable \
158     -package ghc \
159     -package ghc-mtl \
160     -package ghc-paths \
161     -o hake/hake \
162     -outputdir hake \
163     -i$SRCDIR/hake \
164     -ihake \
165     -rtsopts=all \
166     -threaded \
167     $SRCDIR/hake/Main.hs $LDFLAGS || exit 1
168
169     # -eventlog \
170
171 if [ "$RUN_HAKE" == "No" ] ; then
172     echo "Not running hake as per your request."
173     exit
174 fi
175
176 echo "Running hake..."
177 ./hake/hake --output-filename Makefile --source-dir "$SRCDIR" +RTS -T -H128M -A4M -N4 || exit
178
179 echo "Now running initial make to build dependencies."
180 echo " (remove the '-j 4' if your system has trouble handling this" 
181 make -j 4 help