36ace55733399b9f40eb47c92f3ce7f894c22bfd
[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
15 usage() { 
16     echo "Usage: $0 <options>"
17     echo "   -s|--source-dir: path to source tree (required)"
18     echo "   -i|--install-dir: path to install directory (defaults to \`pwd\`)"
19     echo "   -a|--architecture: specify archtitecture to build for (can be"
20     echo "       given multiple times, default architectures are"
21     echo "       $DFLTARCHS"
22     echo "   -n|--no-hake: just rebuild hake itself, don't run it (only useful"
23     echo "       for debugging hake)"
24     echo ""
25     echo "  The way you use this script is to create a new directory for your"
26     echo "  build tree, cd into it, and run this script with the --source-dir"
27     echo "  argument specifying the top of the source tree."
28     echo ""
29     echo "  Known architectures may include: "
30     echo "     x86_64 x86_32 armv5 arm11mp xscale armv7 armv7-m k10m"
31     exit 1;
32 }
33
34 #
35 # Legacy compatibility to avoid breaking the harness...
36 #
37 if [ $# -eq 1 ]; then
38     echo "WARNING: old usage of hake.sh (sole argument gives the source directory) is"
39     echo "deprecated: please use --source-dir instead."
40     SRCDIR="$1"
41     shift
42 fi
43
44 #
45 # Parse args
46 #
47 while [ $# -ne 0 ]; do
48     case $1 in
49         "-a"|"--architecture") 
50             if [ -z "$NEWARCHS" ] ; then
51                 NEWARCHS="\"$2\""
52             else
53                 NEWARCHS="$NEWARCHS, \"$2\""
54             fi
55             ;;
56         "-i"|"--install-dir")
57             INSTALLDIR="$2"
58             ;;
59         "-s"|"--source-dir")
60             SRCDIR="$2"
61             ;;
62         "-n"|"--no-hake")
63             RUN_HAKE="No"
64             ;;
65         *) 
66             usage
67             ;;
68     esac
69     shift 
70     shift
71 done
72
73 if [ -z "$INSTALLDIR" ] ; then
74     echo "Install directory defaulting to '.'"
75     INSTALLDIR="."
76 else
77     echo "Install directory is $INSTALLDIR"
78 fi
79 cd $INSTALLDIR
80
81 if [ -z "$SRCDIR" ] ; then
82     usage
83 fi
84
85 if [ ! -f "$SRCDIR"/hake/Main.hs ] ; then
86     echo "Can't find Hake in the source directory $SRCDIR."
87     echo "Did you specify the source directory correctly?"
88     usage
89 fi
90 echo "Source directory is $SRCDIR"
91
92 if [ ! -z "$NEWARCHS" ]; then
93     ARCHS="$NEWARCHS"
94 else 
95     ARCHS="$DFLTARCHS"
96 fi
97 echo "Architectures to build: $ARCHS"
98
99 if [ ! -d hake ] ; then
100     echo "Creating a local hake directory..."
101     mkdir -p hake
102     touch hake/.marker
103 fi
104
105 echo "Setting up hake build directory..."
106 if [ ! -f hake/Config.hs ]; then
107     cp $SRCDIR/hake/Config.hs.template hake/Config.hs
108     cat >> hake/Config.hs <<EOF
109
110 -- Automatically added by hake.sh. Do NOT copy these definitions to the defaults
111 source_dir = "$SRCDIR"
112 architectures = [ $ARCHS ]
113 install_dir = "$INSTALLDIR"
114 EOF
115 else
116     echo "You already have Config.hs, leaving it as-is."
117 fi
118
119 if [ ! -f ./symbolic_targets.mk ]; then
120     echo "Creating new symbolic_targets.mk file."
121     cp "$SRCDIR/hake/symbolic_targets.mk" . 
122 else
123     echo "You already have symbolic_targets.mk, leaving it as-is."
124 fi
125
126 # FIXME: do we really need this; doesn't ghc get the dependencies right? -AB
127 #rm -f hake/*.hi hake/*.o 
128
129 echo "Building hake..."
130 ghc -O --make -XDeriveDataTypeable \
131     -package ghc \
132     -package ghc-paths \
133     -o hake/hake \
134     -outputdir hake \
135     -i$SRCDIR/hake \
136     -ihake \
137     -rtsopts=all \
138     -threaded \
139     -with-rtsopts="-K32m" \
140     $SRCDIR/hake/Main.hs $LDFLAGS || exit 1
141
142     # -eventlog \
143
144 if [ "$RUN_HAKE" == "No" ] ; then
145     echo "Not running hake as per your request."
146     exit
147 fi
148
149 echo "Running hake..."
150 #./hake/hake --output-filename Makefile --source-dir "$SRCDIR" +RTS -s -N -K64M -A64M -ls -lf || exit
151 ./hake/hake --output-filename Makefile --source-dir "$SRCDIR" +RTS -N -K64M -A64M || exit
152
153 echo "Now running initial make to build dependencies."
154 echo " (remove the '-j 4' if your system has trouble handling this" 
155 make -j 4 help