Fixing compilation issues on x86_64 and armv8
[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, Universitaetstasse 6, 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 System.FilePath
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                                 "-Wtype-limits",
29                                 "-Wredundant-decls",
30                                 "-Werror" ] ]
31
32 commonCFlags = [ Str s | s <- [ "-std=c99",
33                                 "-U__STRICT_ANSI__", -- for newlib headers
34                                 "-Wstrict-prototypes",
35                                 "-Wold-style-definition",
36                                 "-Wmissing-prototypes" ] ]
37                  ++ [ Str (if Config.use_fp then "-fno-omit-frame-pointer" else "") ]
38
39 commonCxxFlags = [ Str s | s <- [ "-nostdinc++",
40                                   "-fexceptions",
41                                   "-nodefaultlibs",
42                                   "-fasynchronous-unwind-tables",
43                                   "-DLIBCXX_CXX_ABI=libcxxabi",
44                                   "-I" ] ]
45                  ++ [ NoDep SrcTree "src" "/include/cxx" ]
46                  ++ [ Str (if Config.use_fp then "-fno-omit-frame-pointer" else "") ]
47
48 cFlags = [ Str s | s <- [ "-Wno-packed-bitfield-compat" ] ]
49        ++ commonCFlags
50
51 cxxFlags = [ Str s | s <- [ "-Wno-packed-bitfield-compat" ] ]
52        ++ commonCxxFlags
53
54 cDefines options = [ Str ("-D"++s) | s <- [ "BARRELFISH",
55                                             "BF_BINARY_PREFIX=\\\"\\\"",
56                                             "_WANT_IO_C99_FORMATS" -- newlib C99 printf format specifiers
57                                           ]
58                    ]
59                    ++ Config.defines
60                    ++ Config.arch_defines options
61
62 cStdIncs arch archFamily =
63     [ NoDep BFSrcTree "src" "/include",
64       NoDep BFSrcTree "src" ("/include/arch" </> archFamily),
65       NoDep BFSrcTree "src" "/lib/newlib/newlib/libc/include",
66       NoDep BFSrcTree "src" "/include/c",
67       NoDep BFSrcTree "src" ("/include/target" </> archFamily),
68       NoDep BFSrcTree "src" Config.lwipxxxInc, -- XXX
69       NoDep BFSrcTree "src" Config.lwipInc,
70       NoDep InstallTree arch "/include",
71       NoDep BFSrcTree "src" ".",
72       NoDep SrcTree "src" ".",
73       NoDep BuildTree arch "." ]
74
75 ldFlags arch =
76     map Str Config.cOptFlags ++
77     [ In InstallTree arch "/lib/crt0.o",
78       In InstallTree arch "/lib/crtbegin.o",
79       Str "-fno-builtin",
80       Str "-nostdlib" ]
81
82 ldCxxFlags arch =
83     map Str Config.cOptFlags ++
84     [ In InstallTree arch "/lib/crt0.o",
85       In InstallTree arch "/lib/crtbegin.o",
86       Str "-fno-builtin",
87       Str "-nostdlib" ]
88
89 kernelLibs arch =
90     [ In InstallTree arch "/lib/libcompiler-rt.a" ]
91
92 -- Libraries that are linked to all applications.
93 stdLibs arch =
94     [ In InstallTree arch "/lib/libbarrelfish.a",
95       In InstallTree arch "/lib/libterm_client.a",
96       In InstallTree arch "/lib/liboctopus_parser.a", -- XXX: For NS client in libbarrelfish
97       In InstallTree arch "/errors/errno.o",
98       In InstallTree arch ("/lib/libnewlib.a"),
99       In InstallTree arch "/lib/libcompiler-rt.a",
100       --In InstallTree arch "/lib/libposixcompat.a",
101       --In InstallTree arch "/lib/libvfs.a",
102       --In InstallTree arch "/lib/libnfs.a",
103       --In InstallTree arch "/lib/liblwip.a",
104       --In InstallTree arch "/lib/libbarrelfish.a",
105       --In InstallTree arch "/lib/libcontmng.a",
106       --In InstallTree arch "/lib/libprocon.a",
107       In InstallTree arch "/lib/crtend.o" ,
108       In InstallTree arch "/lib/libcollections.a" ]
109
110 stdCxxLibs arch =
111     [ In InstallTree arch "/lib/libcxx.a" ]
112     ++ stdLibs arch
113
114 options arch archFamily = Options {
115             optArch = arch,
116             optArchFamily = archFamily,
117             optFlags = cFlags,
118             optCxxFlags = cxxFlags,
119             optDefines = [ Str "-DBARRELFISH" ] ++ Config.defines,
120             optIncludes = cStdIncs arch archFamily,
121             optDependencies =
122                 [ Dep InstallTree arch "/include/errors/errno.h",
123                   Dep InstallTree arch "/include/barrelfish_kpi/capbits.h",
124                   Dep InstallTree arch "/include/asmoffsets.h",
125                   Dep InstallTree arch "/include/trace_definitions/trace_defs.h" ],
126             optLdFlags = ldFlags arch,
127             optLdCxxFlags = ldCxxFlags arch,
128             optLibs = stdLibs arch,
129             optCxxLibs = stdCxxLibs arch,
130             optInterconnectDrivers = ["lmp", "ump", "multihop", "local"],
131             optFlounderBackends = ["lmp", "ump", "multihop", "local"],
132             extraFlags = [],
133             extraCxxFlags = [],
134             extraDefines = [],
135             extraIncludes = [],
136             extraDependencies = [],
137             extraLdFlags = [],
138             optSuffix = [],
139             optInstallPath = OptionsPath {
140                 optPathBin = "/sbin",
141                 optPathLib = "/lib"
142             }
143           }
144
145 ------------------------------------------------------------------------
146 --
147 -- Now, commands to actually do something
148 --
149 ------------------------------------------------------------------------
150
151 --
152 -- C compiler
153 --
154 cCompiler :: String -> String -> [String] -> Options -> String ->
155              String -> String -> [RuleToken]
156 cCompiler arch compiler opt_flags opts phase src obj =
157     let incls = (extraIncludes opts) ++ (optIncludes 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     in
164       [ Str compiler ] ++ flags ++ (map Str opt_flags)
165       ++ concat [ [ NStr "-I", i ] | i <- incls ]
166       ++ [ Str "-o", Out arch obj,
167            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src ]
168       ++ deps
169
170 --
171 -- the C preprocessor, like C compiler but with -E
172 --
173 cPreprocessor :: String -> String -> [String] -> Options -> String ->
174                  String -> String -> [RuleToken]
175 cPreprocessor arch compiler opt_flags opts phase src obj =
176     let incls = (extraIncludes opts) ++ (optIncludes opts)
177         flags = (optFlags opts)
178                 ++ (optDefines opts)
179                 ++ [ Str f | f <- extraFlags opts ]
180                 ++ [ Str f | f <- extraDefines opts ]
181         deps = (optDependencies opts) ++ (extraDependencies opts)
182         cOptFlags = opt_flags \\ ["-g"]
183     in
184       [ Str compiler ] ++ flags ++ (map Str cOptFlags)
185       ++ concat [ [ NStr "-I", i ] | i <- incls ]
186       ++ [ Str "-o", Out arch obj,
187            Str "-E", In (if phase == "src" then SrcTree else BuildTree) phase src ]
188       ++ deps
189
190 --
191 -- C++ compiler
192 --
193 cxxCompiler arch cxxcompiler opt_flags opts phase src obj =
194     let incls = (extraIncludes opts) ++ (optIncludes opts)
195         flags = (optCxxFlags opts)
196                 ++ (optDefines opts)
197                 ++ [ Str f | f <- extraCxxFlags opts ]
198                 ++ [ Str f | f <- extraDefines opts ]
199         deps = (optDependencies opts) ++ (extraDependencies opts)
200     in
201       [ Str cxxcompiler ] ++ flags ++ (map Str opt_flags)
202       ++ concat [ [ NStr "-I", i ] | i <- incls ]
203       ++ [ Str "-o", Out arch obj,
204            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src ]
205       ++ deps
206
207 --
208 -- Create C file dependencies
209 --
210 makeDepend arch compiler opts phase src obj depfile =
211     let incls = (extraIncludes opts) ++ (optIncludes opts)
212         flags = (optFlags opts)
213                 ++ (optDefines opts)
214                 ++ [ Str f | f <- extraFlags opts ]
215                 ++ [ Str f | f <- extraDefines opts ]
216     in
217       [ Str ('@':compiler) ] ++ flags
218       ++ concat [ [ NStr "-I", i ] | i <- incls ]
219       ++ (optDependencies opts) ++ (extraDependencies opts)
220       ++ [ Str "-M -MF",
221            Out arch depfile,
222            Str "-MQ", NoDep BuildTree arch obj,
223            Str "-MQ", NoDep BuildTree arch depfile,
224            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src
225          ]
226
227 --
228 -- Create C++ file dependencies
229 --
230 makeCxxDepend arch cxxcompiler opts phase src obj depfile =
231     let incls = (extraIncludes opts) ++ (optIncludes opts)
232         flags = (optCxxFlags opts)
233                 ++ (optDefines opts)
234                 ++ [ Str f | f <- extraCxxFlags opts ]
235                 ++ [ Str f | f <- extraDefines opts ]
236     in
237       [ Str ('@':cxxcompiler) ] ++ flags
238       ++ concat [ [ NStr "-I", i ] | i <- incls ]
239       ++ (optDependencies opts) ++ (extraDependencies opts)
240       ++ [ Str "-M -MF",
241            Out arch depfile,
242            Str "-MQ", NoDep BuildTree arch obj,
243            Str "-MQ", NoDep BuildTree arch depfile,
244            Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src
245          ]
246
247 --
248 -- Compile a C program to assembler
249 --
250 cToAssembler :: String -> String -> [String] -> Options -> String -> String ->
251                 String -> String -> [ RuleToken ]
252 cToAssembler arch compiler opt_flags opts phase src afile objdepfile =
253     let incls = (extraIncludes opts) ++ (optIncludes opts)
254         flags = (optFlags opts)
255                 ++ (optDefines opts)
256                 ++ [ Str f | f <- extraFlags opts ]
257                 ++ [ Str f | f <- extraDefines opts ]
258         deps = [ Dep BuildTree arch objdepfile ] ++
259                (optDependencies opts) ++
260                (extraDependencies opts)
261     in
262       [ Str compiler ] ++ flags ++ (map Str opt_flags)
263       ++ concat [ [ NStr "-I", i ] | i <- incls ]
264       ++ [ Str "-o ", Out arch afile,
265            Str "-S ", In (if phase == "src" then SrcTree else BuildTree) phase src ]
266       ++ deps
267
268 --
269 -- Assemble an assembly language file
270 --
271 assembler :: String -> String -> [ String ] -> Options -> String ->
272              String -> [ RuleToken ]
273 assembler arch compiler opt_flags opts src obj =
274     let incls = (extraIncludes opts) ++ (optIncludes opts)
275         flags = (optFlags opts)
276                 ++ (optDefines opts)
277                 ++ [ Str f | f <- extraFlags opts ]
278                 ++ [ Str f | f <- extraDefines opts ]
279         deps = (optDependencies opts) ++ (extraDependencies opts)
280     in
281       [ Str compiler ] ++ flags ++ (map Str opt_flags)
282       ++ concat [ [ NStr "-I", i ] | i <- incls ]
283       ++ [ Str "-o ", Out arch obj, Str "-c ", In SrcTree "src" src ]
284       ++ deps
285
286 --
287 -- Create a library from a set of object files
288 --
289 archive :: String -> Options -> [String] -> [String] -> String -> String -> [ RuleToken ]
290 archive arch opts objs libs name libname =
291     [ Str "rm -f ", Out arch libname ]
292     ++
293     [ NL, Str "ar crT ", Out arch libname ]
294     ++
295     [ In BuildTree arch o | o <- objs ]
296     ++
297     if libs == [] then []
298                   else [ In BuildTree arch a | a <- libs ]
299     ++
300     [ NL, Str "ranlib ", Out arch libname ]
301
302 --
303 -- Link an executable
304 --
305 linker :: String -> String -> Options -> [String] -> [String] -> [String] -> String -> [RuleToken]
306 linker arch compiler opts objs libs mods bin =
307     [ Str compiler ]
308     ++ (optLdFlags opts)
309     ++
310     (extraLdFlags opts)
311     ++
312     [ Str "-o", Out arch bin ]
313     ++
314     [ In BuildTree arch o | o <- objs ]
315     ++
316     [Str "-Wl,--whole-archive"] ++ [ In BuildTree arch l | l <- mods ] ++ [Str "-Wl,--no-whole-archive"]
317     ++
318     [ In BuildTree arch l | l <- libs ]
319     ++
320     (optLibs opts)
321
322
323 --
324 -- Link an executable
325 --
326 cxxlinker :: String -> String -> Options -> [String] -> [String] -> [String] -> String -> [RuleToken]
327 cxxlinker arch cxxcompiler opts objs libs mods bin =
328     [ Str cxxcompiler ]
329     ++ (optLdCxxFlags opts)
330     ++
331     (extraLdFlags opts)
332     ++
333     [ Str "-o", Out arch bin ]
334     ++
335     [ In BuildTree arch o | o <- objs ]
336     ++
337     [ In BuildTree arch l | l <- libs ]
338     ++
339     [Str "-Wl,--whole-archive"] ++ [ In BuildTree arch l | l <- mods ] ++ [Str "-Wl,--no-whole-archive"]
340     ++
341     (optCxxLibs opts)
342
343 --
344 -- Strip debug symbols from an executable
345 --
346 strip :: String -> String -> Options -> String -> String ->
347          String -> [RuleToken]
348 strip arch objcopy opts src debuglink target =
349     [ Str objcopy,
350       Str "-g",
351       NStr "--add-gnu-debuglink=", In BuildTree arch debuglink,
352       In BuildTree arch src,
353       Out arch target
354     ]
355
356 --
357 -- Extract debug symbols from an executable
358 --
359 debug :: String -> String -> Options -> String -> String -> [RuleToken]
360 debug arch objcopy opts src target =
361     [ Str objcopy,
362       Str "--only-keep-debug",
363       In BuildTree arch src,
364       Out arch target
365     ]