libbarrelfish: Adjust libbarrelfish to new terminal API and remove old API.
[barrelfish] / hake / ArchDefaults.hs
1 --------------------------------------------------------------------------
2 -- Copyright (c) 2007-2010, ETH Zurich.
3 -- All rights reserved.
4 --
5 -- This file is distributed under the terms in the attached LICENSE file.
6 -- If you do not find this file, copies can be found by writing to:
7 -- ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
8 --
9 -- Default architecture-specific definitions for Barrelfish
10 -- 
11 --------------------------------------------------------------------------
12
13 module ArchDefaults where
14
15 import Data.List
16 import HakeTypes
17 import Path
18 import qualified Config
19
20 commonFlags = [ Str s | s <- [ "-fno-builtin",
21                                 "-nostdinc",
22                                 "-U__linux__",
23                                 "-Ulinux",
24                                 "-Wall",
25                                 "-Wshadow",
26                                 "-Wmissing-declarations",
27                                 "-Wmissing-field-initializers",
28                                 "-Wredundant-decls",
29                                 "-Werror",
30                                 "-imacros" ] ]
31          ++ [ NoDep SrcTree "src" "/include/deputy/nodeputy.h" ]
32
33 commonCFlags = [ Str s | s <- [ "-std=c99",
34                                 "-U__STRICT_ANSI__", -- for newlib headers
35                                 "-Wstrict-prototypes",
36                                 "-Wold-style-definition",
37                                 "-Wmissing-prototypes" ] ]
38                  ++ [ ContStr Config.use_fp "-fno-omit-frame-pointer" ""]
39
40 commonCxxFlags = [ Str s | s <- [ "-nostdinc++",
41                                   "-std=c++0x",
42                                   "-fno-exceptions",
43                                   "-I" ] ]
44                  ++ [ NoDep SrcTree "src" "/include/cxx" ]
45                  ++ [ ContStr Config.use_fp "-fno-omit-frame-pointer" ""]
46
47 cFlags = [ Str s | s <- [ "-Wno-packed-bitfield-compat" ] ]
48        ++ commonCFlags
49
50 cxxFlags = [ Str s | s <- [ "-Wno-packed-bitfield-compat" ] ]
51        ++ commonCxxFlags
52
53 cDefines options = [ Str ("-D"++s) | s <- [ "BARRELFISH" ]]
54                    ++ Config.defines
55                    ++ Config.arch_defines options
56
57 cStdIncs arch archFamily =
58     [ NoDep SrcTree "src" "/include",
59       NoDep SrcTree "src" ("/include/arch" ./. archFamily),
60       NoDep SrcTree "src" Config.libcInc,
61       NoDep SrcTree "src" "/include/c",
62       NoDep SrcTree "src" ("/include/target" ./. archFamily),
63       NoDep SrcTree "src" "/include/ipv4", -- XXX
64       NoDep InstallTree arch "/include",
65       NoDep InstallTree arch "/include/dev",
66       NoDep SrcTree "src" ".",
67       NoDep BuildTree arch "." ]
68                       
69 ldFlags arch = 
70     [ Str Config.cOptFlags,
71       In InstallTree arch "/lib/crt0.o",
72       In InstallTree arch "/lib/crtbegin.o",
73       Str "-fno-builtin",
74       Str "-nostdlib" ]
75           
76 ldCxxFlags arch = 
77     [ Str Config.cOptFlags,
78       In InstallTree arch "/lib/crt0.o",
79       In InstallTree arch "/lib/crtbegin.o",
80       Str "-fno-builtin",
81       Str "-nostdlib" ]
82
83
84 -- Libraries that are linked to all applications.
85 stdLibs arch = 
86     [ In InstallTree arch "/lib/libbarrelfish.a",
87       In InstallTree arch "/lib/libterm_client.a",
88       In InstallTree arch "/lib/liboctopus_parser.a", -- XXX: For NS client in libbarrelfish
89       In InstallTree arch "/errors/errno.o",
90       In InstallTree arch ("/lib/lib" ++ Config.libc ++ ".a"),
91       --In InstallTree arch "/lib/libposixcompat.a",
92       --In InstallTree arch "/lib/libvfs.a",
93       --In InstallTree arch "/lib/libnfs.a",
94       --In InstallTree arch "/lib/liblwip.a",
95       --In InstallTree arch "/lib/libbarrelfish.a",
96       --In InstallTree arch "/lib/libcontmng.a",
97       --In InstallTree arch "/lib/libprocon.a",
98       In InstallTree arch "/lib/crtend.o" ,
99       In InstallTree arch "/lib/libcollections.a" ]
100
101 stdCxxLibs arch = 
102     [ In InstallTree arch "/lib/libcxx.a",
103       Str "./libsupc++.a" ]
104     ++ stdLibs arch 
105
106 options arch archFamily = Options { 
107             optArch = arch,
108             optArchFamily = archFamily,
109             optFlags = cFlags,
110             optCxxFlags = cxxFlags,
111             optDefines = [ Str "-DBARRELFISH" ] ++ Config.defines,
112             optIncludes = cStdIncs arch archFamily,
113             optDependencies = 
114                 [ PreDep InstallTree arch "/include/errors/errno.h",
115                   PreDep InstallTree arch "/include/barrelfish_kpi/capbits.h",
116                   PreDep InstallTree arch "/include/asmoffsets.h" ],
117             optLdFlags = ldFlags arch,
118             optLdCxxFlags = ldCxxFlags arch,
119             optLibs = stdLibs arch,
120             optCxxLibs = stdCxxLibs arch,
121             optInterconnectDrivers = ["lmp", "ump", "multihop"],
122             optFlounderBackends = ["lmp", "ump", "multihop"],
123             extraFlags = [],
124             extraDefines = [],
125             extraIncludes = [],
126             extraDependencies = [],
127             extraLdFlags = [],
128             optSuffix = []
129           }
130
131 ------------------------------------------------------------------------
132 --
133 -- Now, commands to actually do something
134 --
135 ------------------------------------------------------------------------
136
137 --
138 -- C compiler
139 --
140 cCompiler arch compiler opts phase src obj = 
141     let incls = (optIncludes opts) ++ (extraIncludes opts)
142         flags = (optFlags opts) 
143                 ++ (optDefines opts)
144                 ++ [ Str f | f <- extraFlags opts ]
145                 ++ [ Str f | f <- extraDefines opts ]
146         deps = (optDependencies opts) ++ (extraDependencies opts)
147     in
148       [ Str compiler ] ++ flags ++ [ Str Config.cOptFlags ]
149       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
150       ++ [ Str "-o", Out arch obj,
151            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src ]
152       ++ deps
153 --
154 -- the C preprocessor, like C compiler but with -E
155 --
156 cPreprocessor arch compiler opts phase src obj = 
157     let incls = (optIncludes opts) ++ (extraIncludes opts)
158         flags = (optFlags opts) 
159                 ++ (optDefines opts)
160                 ++ [ Str f | f <- extraFlags opts ]
161                 ++ [ Str f | f <- extraDefines opts ]
162         deps = (optDependencies opts) ++ (extraDependencies opts)
163         cOptFlags = unwords ((words Config.cOptFlags) \\ ["-g"])
164     in
165       [ Str compiler ] ++ flags ++ [ Str cOptFlags ]
166       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
167       ++ [ Str "-o", Out arch obj,
168            Str "-E", In (if phase == "src" then SrcTree else BuildTree) phase src ]
169       ++ deps
170
171 --
172 -- C++ compiler
173 --
174 cxxCompiler arch cxxcompiler opts phase src obj = 
175     let incls = (optIncludes opts) ++ (extraIncludes opts)
176         flags = (optCxxFlags opts) 
177                 ++ (optDefines opts)
178                 ++ [ Str f | f <- extraFlags opts ]
179                 ++ [ Str f | f <- extraDefines opts ]
180         deps = (optDependencies opts) ++ (extraDependencies opts)
181     in
182       [ Str cxxcompiler ] ++ flags ++ [ Str Config.cOptFlags ]
183       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
184       ++ [ Str "-o", Out arch obj,
185            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src ]
186       ++ deps
187
188 --
189 -- Create C file dependencies
190 --
191 makeDepend arch compiler opts phase src obj depfile =
192     let incls = (optIncludes opts) ++ (extraIncludes opts)
193         flags = (optFlags opts) 
194                 ++ (optDefines opts)
195                 ++ [ Str f | f <- extraFlags opts ]
196                 ++ [ Str f | f <- extraDefines opts ]
197     in
198       [ Str ('@':compiler) ] ++ flags 
199       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
200       ++ (optDependencies opts) ++ (extraDependencies opts)
201       ++ [ Str "-M -MF", 
202            Out arch depfile,
203            Str "-MQ", NoDep BuildTree arch obj, 
204            Str "-MQ", NoDep BuildTree arch depfile,
205            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src
206          ] 
207
208 --
209 -- Create C++ file dependencies
210 --
211 makeCxxDepend arch cxxcompiler opts phase src obj depfile =
212     let incls = (optIncludes opts) ++ (extraIncludes opts)
213         flags = (optCxxFlags opts) 
214                 ++ (optDefines opts)
215                 ++ [ Str f | f <- extraFlags opts ]
216                 ++ [ Str f | f <- extraDefines opts ]
217     in
218       [ Str ('@':cxxcompiler) ] ++ flags 
219       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
220       ++ (optDependencies opts) ++ (extraDependencies opts)
221       ++ [ Str "-M -MF", 
222            Out arch depfile,
223            Str "-MQ", NoDep BuildTree arch obj, 
224            Str "-MQ", NoDep BuildTree arch depfile,
225            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src
226          ] 
227
228 --
229 -- Compile a C program to assembler
230 --
231 cToAssembler :: String -> String -> Options -> String -> String -> String -> String -> [ RuleToken ]
232 cToAssembler arch compiler  opts phase src afile objdepfile =
233     let incls = (optIncludes opts) ++ (extraIncludes opts)
234         flags = (optFlags opts) 
235                 ++ (optDefines opts)
236                 ++ [ Str f | f <- extraFlags opts ]
237                 ++ [ Str f | f <- extraDefines opts ]
238         deps = [ Dep BuildTree arch objdepfile ] ++ (optDependencies opts) ++ (extraDependencies opts)
239     in
240       [ Str compiler ] ++ flags ++ [ Str Config.cOptFlags ]
241       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
242       ++ [ Str "-o ", Out arch afile, 
243            Str "-S ", In (if phase == "src" then SrcTree else BuildTree) phase src ]
244       ++ deps
245
246 --
247 -- Assemble an assembly language file
248 --
249 assembler :: String -> String -> Options -> String -> String -> [ RuleToken ]
250 assembler arch compiler opts src obj = 
251     let incls = (optIncludes opts) ++ (extraIncludes opts)
252         flags = (optFlags opts) 
253                 ++ (optDefines opts)
254                 ++ [ Str f | f <- extraFlags opts ]
255                 ++ [ Str f | f <- extraDefines opts ]
256         deps = (optDependencies opts) ++ (extraDependencies opts)
257     in
258       [ Str compiler ] ++ flags ++ [ Str Config.cOptFlags ]
259       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
260       ++ [ Str "-o ", Out arch obj, Str "-c ", In SrcTree "src" src ]
261       ++ deps
262
263 --
264 -- Create a library from a set of object files
265 --
266 archive :: String -> Options -> [String] -> [String] -> String -> String -> [ RuleToken ]
267 archive arch opts objs libs name libname =
268     [ Str "rm -f ", Out arch libname ]
269     ++ 
270     [ NL, Str "ar cr ", Out arch libname ] 
271     ++ 
272     [ In BuildTree arch o | o <- objs ]
273     ++
274     if libs == [] then []
275                   else (
276       [ NL, Str ("rm -fr tmp-" ++ name ++ "; mkdir tmp-" ++ name) ]
277       ++
278       [ NL, Str ("cd tmp-" ++ name ++ "; for i in ") ]
279       ++
280       [ In BuildTree arch a | a <- libs ]
281       ++
282       [ Str "; do ar x ../$$i; done" ]
283       ++
284       [ NL, Str "ar q ", Out arch libname, Str (" tmp-" ++ name ++ "/*.o") ]
285       ++
286       [ NL, Str ("rm -fr tmp-" ++ name) ]
287     )
288     ++
289     [ NL, Str "ranlib ", Out arch libname ]
290
291 --
292 -- Link an executable
293 -- 
294 linker :: String -> String -> Options -> [String] -> [String] -> String -> [RuleToken]
295 linker arch compiler opts objs libs bin =
296     [ Str compiler ] 
297     ++ (optLdFlags opts) 
298     ++ 
299     (extraLdFlags opts) 
300     ++ 
301     [ Str "-o", Out arch bin ] 
302     ++ 
303     [ In BuildTree arch o | o <- objs ]
304     ++
305     [ In BuildTree arch l | l <- libs ]
306     ++ 
307     (optLibs opts)
308
309 --
310 -- Link an executable
311 -- 
312 cxxlinker :: String -> String -> Options -> [String] -> [String] -> String -> [RuleToken]
313 cxxlinker arch cxxcompiler opts objs libs bin =
314     [ Str cxxcompiler ] 
315     ++ (optLdCxxFlags opts) 
316     ++ 
317     (extraLdFlags opts) 
318     ++ 
319     [ Str "-o", Out arch bin ] 
320     ++ 
321     [ In BuildTree arch o | o <- objs ]
322     ++
323     [ In BuildTree arch l | l <- libs ]
324     ++ 
325     (optCxxLibs opts)