Add BF_BINARY_PREFIX define to configure binary path by build system.
[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                                   "-fexceptions",
42                                   "-nodefaultlibs",
43                                   "-fasynchronous-unwind-tables",
44                                   "-DLIBCXX_CXX_ABI=libcxxabi",
45                                   "-I" ] ]
46                  ++ [ NoDep SrcTree "src" "/include/cxx" ]
47                  ++ [ ContStr Config.use_fp "-fno-omit-frame-pointer" ""]
48
49 cFlags = [ Str s | s <- [ "-Wno-packed-bitfield-compat" ] ]
50        ++ commonCFlags
51
52 cxxFlags = [ Str s | s <- [ "-Wno-packed-bitfield-compat" ] ]
53        ++ commonCxxFlags
54
55 cDefines options = [ Str ("-D"++s) | s <- [ "BARRELFISH", "BF_BINARY_PREFIX=\\\"\\\"" ] ]
56                    ++ Config.defines
57                    ++ Config.arch_defines options
58
59 cStdIncs arch archFamily =
60     [ NoDep SrcTree "src" "/include",
61       NoDep SrcTree "src" ("/include/arch" ./. archFamily),
62       NoDep SrcTree "src" Config.libcInc,
63       NoDep SrcTree "src" "/include/c",
64       NoDep SrcTree "src" ("/include/target" ./. archFamily),
65       NoDep SrcTree "src" Config.lwipxxxInc, -- XXX
66       NoDep SrcTree "src" Config.lwipInc,
67       NoDep InstallTree arch "/include",
68       NoDep SrcTree "src" ".",
69       NoDep BuildTree arch "." ]
70                       
71 ldFlags arch = 
72     [ Str Config.cOptFlags,
73       In InstallTree arch "/lib/crt0.o",
74       In InstallTree arch "/lib/crtbegin.o",
75       Str "-fno-builtin",
76       Str "-nostdlib" ]
77           
78 ldCxxFlags arch = 
79     [ Str Config.cOptFlags,
80       In InstallTree arch "/lib/crt0.o",
81       In InstallTree arch "/lib/crtbegin.o",
82       Str "-fno-builtin",
83       Str "-nostdlib" ]
84
85
86 -- Libraries that are linked to all applications.
87 stdLibs arch = 
88     [ In InstallTree arch "/lib/libbarrelfish.a",
89       In InstallTree arch "/lib/libterm_client.a",
90       In InstallTree arch "/lib/liboctopus_parser.a", -- XXX: For NS client in libbarrelfish
91       In InstallTree arch "/errors/errno.o",
92       In InstallTree arch ("/lib/lib" ++ Config.libc ++ ".a"),
93       --In InstallTree arch "/lib/libposixcompat.a",
94       --In InstallTree arch "/lib/libvfs.a",
95       --In InstallTree arch "/lib/libnfs.a",
96       --In InstallTree arch "/lib/liblwip.a",
97       --In InstallTree arch "/lib/libbarrelfish.a",
98       --In InstallTree arch "/lib/libcontmng.a",
99       --In InstallTree arch "/lib/libprocon.a",
100       In InstallTree arch "/lib/crtend.o" ,
101       In InstallTree arch "/lib/libcollections.a" ]
102
103 stdCxxLibs arch = 
104     [ In InstallTree arch "/lib/libcxx.a" ]
105     ++ stdLibs arch 
106
107 options arch archFamily = Options { 
108             optArch = arch,
109             optArchFamily = archFamily,
110             optFlags = cFlags,
111             optCxxFlags = cxxFlags,
112             optDefines = [ Str "-DBARRELFISH" ] ++ Config.defines,
113             optIncludes = cStdIncs arch archFamily,
114             optDependencies = 
115                 [ PreDep InstallTree arch "/include/errors/errno.h",
116                   PreDep InstallTree arch "/include/barrelfish_kpi/capbits.h",
117                   PreDep InstallTree arch "/include/asmoffsets.h",
118                   PreDep InstallTree arch "/include/trace_definitions/trace_defs.h" ],
119             optLdFlags = ldFlags arch,
120             optLdCxxFlags = ldCxxFlags arch,
121             optLibs = stdLibs arch,
122             optCxxLibs = stdCxxLibs arch,
123             optInterconnectDrivers = ["lmp", "ump", "multihop"],
124             optFlounderBackends = ["lmp", "ump", "multihop"],
125             extraFlags = [],
126             extraDefines = [],
127             extraIncludes = [],
128             extraDependencies = [],
129             extraLdFlags = [],
130             optSuffix = []
131           }
132
133 ------------------------------------------------------------------------
134 --
135 -- Now, commands to actually do something
136 --
137 ------------------------------------------------------------------------
138
139 --
140 -- C compiler
141 --
142 cCompiler arch compiler opts phase src obj = 
143     let incls = (optIncludes opts) ++ (extraIncludes opts)
144         flags = (optFlags opts) 
145                 ++ (optDefines opts)
146                 ++ [ Str f | f <- extraFlags opts ]
147                 ++ [ Str f | f <- extraDefines opts ]
148         deps = (optDependencies opts) ++ (extraDependencies opts)
149     in
150       [ Str compiler ] ++ flags ++ [ Str Config.cOptFlags ]
151       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
152       ++ [ Str "-o", Out arch obj,
153            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src ]
154       ++ deps
155 --
156 -- the C preprocessor, like C compiler but with -E
157 --
158 cPreprocessor arch compiler opts phase src obj = 
159     let incls = (optIncludes opts) ++ (extraIncludes opts)
160         flags = (optFlags opts) 
161                 ++ (optDefines opts)
162                 ++ [ Str f | f <- extraFlags opts ]
163                 ++ [ Str f | f <- extraDefines opts ]
164         deps = (optDependencies opts) ++ (extraDependencies opts)
165         cOptFlags = unwords ((words Config.cOptFlags) \\ ["-g"])
166     in
167       [ Str compiler ] ++ flags ++ [ Str cOptFlags ]
168       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
169       ++ [ Str "-o", Out arch obj,
170            Str "-E", In (if phase == "src" then SrcTree else BuildTree) phase src ]
171       ++ deps
172
173 --
174 -- C++ compiler
175 --
176 cxxCompiler arch cxxcompiler opts phase src obj = 
177     let incls = (optIncludes opts) ++ (extraIncludes opts)
178         flags = (optCxxFlags opts) 
179                 ++ (optDefines opts)
180                 ++ [ Str f | f <- extraFlags opts ]
181                 ++ [ Str f | f <- extraDefines opts ]
182         deps = (optDependencies opts) ++ (extraDependencies opts)
183     in
184       [ Str cxxcompiler ] ++ flags ++ [ Str Config.cOptFlags ]
185       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
186       ++ [ Str "-o", Out arch obj,
187            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src ]
188       ++ deps
189
190 --
191 -- Create C file dependencies
192 --
193 makeDepend arch compiler opts phase src obj depfile =
194     let incls = (optIncludes opts) ++ (extraIncludes opts)
195         flags = (optFlags opts) 
196                 ++ (optDefines opts)
197                 ++ [ Str f | f <- extraFlags opts ]
198                 ++ [ Str f | f <- extraDefines opts ]
199     in
200       [ Str ('@':compiler) ] ++ flags 
201       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
202       ++ (optDependencies opts) ++ (extraDependencies opts)
203       ++ [ Str "-M -MF", 
204            Out arch depfile,
205            Str "-MQ", NoDep BuildTree arch obj, 
206            Str "-MQ", NoDep BuildTree arch depfile,
207            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src
208          ] 
209
210 --
211 -- Create C++ file dependencies
212 --
213 makeCxxDepend arch cxxcompiler opts phase src obj depfile =
214     let incls = (optIncludes opts) ++ (extraIncludes opts)
215         flags = (optCxxFlags opts) 
216                 ++ (optDefines opts)
217                 ++ [ Str f | f <- extraFlags opts ]
218                 ++ [ Str f | f <- extraDefines opts ]
219     in
220       [ Str ('@':cxxcompiler) ] ++ flags 
221       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
222       ++ (optDependencies opts) ++ (extraDependencies opts)
223       ++ [ Str "-M -MF", 
224            Out arch depfile,
225            Str "-MQ", NoDep BuildTree arch obj, 
226            Str "-MQ", NoDep BuildTree arch depfile,
227            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src
228          ] 
229
230 --
231 -- Compile a C program to assembler
232 --
233 cToAssembler :: String -> String -> Options -> String -> String -> String -> String -> [ RuleToken ]
234 cToAssembler arch compiler  opts phase src afile objdepfile =
235     let incls = (optIncludes opts) ++ (extraIncludes opts)
236         flags = (optFlags opts) 
237                 ++ (optDefines opts)
238                 ++ [ Str f | f <- extraFlags opts ]
239                 ++ [ Str f | f <- extraDefines opts ]
240         deps = [ Dep BuildTree arch objdepfile ] ++ (optDependencies opts) ++ (extraDependencies opts)
241     in
242       [ Str compiler ] ++ flags ++ [ Str Config.cOptFlags ]
243       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
244       ++ [ Str "-o ", Out arch afile, 
245            Str "-S ", In (if phase == "src" then SrcTree else BuildTree) phase src ]
246       ++ deps
247
248 --
249 -- Assemble an assembly language file
250 --
251 assembler :: String -> String -> Options -> String -> String -> [ RuleToken ]
252 assembler arch compiler opts src obj = 
253     let incls = (optIncludes opts) ++ (extraIncludes opts)
254         flags = (optFlags opts) 
255                 ++ (optDefines opts)
256                 ++ [ Str f | f <- extraFlags opts ]
257                 ++ [ Str f | f <- extraDefines opts ]
258         deps = (optDependencies opts) ++ (extraDependencies opts)
259     in
260       [ Str compiler ] ++ flags ++ [ Str Config.cOptFlags ]
261       ++ concat [ [ NStr "-I", i ] | i <- incls ] 
262       ++ [ Str "-o ", Out arch obj, Str "-c ", In SrcTree "src" src ]
263       ++ deps
264
265 --
266 -- Create a library from a set of object files
267 --
268 archive :: String -> Options -> [String] -> [String] -> String -> String -> [ RuleToken ]
269 archive arch opts objs libs name libname =
270     [ Str "rm -f ", Out arch libname ]
271     ++ 
272     [ NL, Str "ar cr ", Out arch libname ] 
273     ++ 
274     [ In BuildTree arch o | o <- objs ]
275     ++
276     if libs == [] then []
277                   else (
278       [ NL, Str ("rm -fr tmp-" ++ arch ++ name ++ "; mkdir tmp-" ++ arch ++ name) ]
279       ++
280       [ NL, Str ("cd tmp-" ++ arch ++ name ++ "; for i in ") ]
281       ++
282       [ In BuildTree arch a | a <- libs ]
283       ++
284       [ Str "; do mkdir `basename $$i`; (cd `basename $$i`; ar x ../../$$i); done" ]
285       ++
286       [ NL, Str "ar q ", Out arch libname, Str (" tmp-" ++ arch ++ name ++ "/*/*.o") ]
287       ++
288       [ NL, Str ("rm -fr tmp-" ++ arch ++ name) ]
289     )
290     ++
291     [ NL, Str "ranlib ", Out arch libname ]
292
293 --
294 -- Link an executable
295 -- 
296 linker :: String -> String -> Options -> [String] -> [String] -> String -> [RuleToken]
297 linker arch compiler opts objs libs bin =
298     [ Str compiler ] 
299     ++ (optLdFlags opts) 
300     ++ 
301     (extraLdFlags opts) 
302     ++ 
303     [ Str "-o", Out arch bin ] 
304     ++ 
305     [ In BuildTree arch o | o <- objs ]
306     ++
307     [ In BuildTree arch l | l <- libs ]
308     ++ 
309     (optLibs opts)
310
311 --
312 -- Link an executable
313 -- 
314 cxxlinker :: String -> String -> Options -> [String] -> [String] -> String -> [RuleToken]
315 cxxlinker arch cxxcompiler opts objs libs bin =
316     [ Str cxxcompiler ] 
317     ++ (optLdCxxFlags opts) 
318     ++ 
319     (extraLdFlags opts) 
320     ++ 
321     [ Str "-o", Out arch bin ] 
322     ++ 
323     [ In BuildTree arch o | o <- objs ]
324     ++
325     [ In BuildTree arch l | l <- libs ]
326     ++ 
327     (optCxxLibs opts)