Quieted make a little.
[barrelfish] / hake / Config.hs.template
1 --------------------------------------------------------------------------
2 -- Copyright (c) 2007-2010, 2012, 2013, 2015 ETH Zurich.
3 -- Copyright (c) 2014, HP Labs.
4 -- All rights reserved.
5 --
6 -- This file is distributed under the terms in the attached LICENSE file.
7 -- If you do not find this file, copies can be found by writing to:
8 -- ETH Zurich D-INFK, CAB F.78, Universitaetstr. 6, CH-8092 Zurich,
9 -- Attn: Systems Group.
10 --
11 -- Configuration options for Hake
12 -- 
13 --------------------------------------------------------------------------
14
15 module Config where
16
17 import HakeTypes
18 import Data.Char
19 import qualified Args
20 import Data.List
21 import Data.Maybe
22 import System.FilePath
23 import Tools (findTool, ToolDetails, toolPath, toolPrefix)
24 import qualified Tools
25
26 -- Set by hake.sh
27 arm_toolspec   :: Maybe ToolDetails
28 thumb_toolspec :: Maybe ToolDetails
29 armeb_toolspec :: Maybe ToolDetails
30 x86_toolspec   :: Maybe ToolDetails
31 k1om_toolspec  :: Maybe ToolDetails
32
33 -- Default toolchains
34 arm_tools   = fromMaybe Tools.arm_system                     arm_toolspec
35 thumb_tools = fromMaybe Tools.arm_netos_arm_2015q2         thumb_toolspec
36 armeb_tools = fromMaybe Tools.arm_netos_linaro_be_2015_02  armeb_toolspec
37 x86_tools   = fromMaybe Tools.x86_system                     x86_toolspec
38 k1om_tools  = fromMaybe Tools.k1om_netos_mpss_3_4           k1om_toolspec
39
40 -- ARM toolchain
41 arm_gnu_tool = findTool (toolPath arm_tools) (toolPrefix arm_tools)
42 arm_cc       = arm_gnu_tool "gcc"
43 arm_objcopy  = arm_gnu_tool "objcopy"
44 arm_objdump  = arm_gnu_tool "objdump"
45 arm_ar       = arm_gnu_tool "ar"
46 arm_ranlib   = arm_gnu_tool "ranlib"
47 arm_cxx      = arm_gnu_tool "g++"
48
49 -- ARM thumb (e.g. -M profile) toolchain
50 thumb_gnu_tool = findTool (toolPath thumb_tools) (toolPrefix thumb_tools)
51 thumb_cc       = thumb_gnu_tool "gcc"
52 thumb_objcopy  = thumb_gnu_tool "objcopy"
53 thumb_objdump  = thumb_gnu_tool "objdump"
54 thumb_ar       = thumb_gnu_tool "ar"
55 thumb_ranlib   = thumb_gnu_tool "ranlib"
56 thumb_cxx      = thumb_gnu_tool "g++"
57
58 -- ARM big-endian (e.g. XScale) toolchain
59 armeb_gnu_tool = findTool (toolPath armeb_tools) (toolPrefix armeb_tools)
60 armeb_cc       = armeb_gnu_tool "gcc"
61 armeb_objcopy  = armeb_gnu_tool "objcopy"
62 armeb_objdump  = armeb_gnu_tool "objdump"
63 armeb_ar       = armeb_gnu_tool "ar"
64 armeb_ranlib   = armeb_gnu_tool "ranlib"
65 armeb_cxx      = armeb_gnu_tool "g++"
66
67 -- X86 (32/64) toolchain
68 x86_gnu_tool = findTool (toolPath x86_tools) (toolPrefix x86_tools)
69 x86_cc       = x86_gnu_tool "gcc"
70 x86_objcopy  = x86_gnu_tool "objcopy"
71 x86_objdump  = x86_gnu_tool "objdump"
72 x86_ar       = x86_gnu_tool "ar"
73 x86_ranlib   = x86_gnu_tool "ranlib"
74 x86_cxx      = x86_gnu_tool "g++"
75
76 -- Xeon Phi toolchain
77 k1om_gnu_tool = findTool (toolPath k1om_tools) (toolPrefix k1om_tools)
78 k1om_cc      = k1om_gnu_tool "gcc"
79 k1om_objcopy = k1om_gnu_tool "objcopy"
80 k1om_objdump = k1om_gnu_tool "objdump"
81 k1om_ar      = k1om_gnu_tool "ar"
82 k1om_ranlib  = k1om_gnu_tool "ranlib"
83 k1om_cxx     = k1om_gnu_tool "g++"
84
85 -- Miscellaneous tools
86 gem5         = "gem5.fast"
87 runghc       = "runghc"    -- run GHC interactively
88 circo        = "circo"     -- from graphviz
89 dot          = "dot"       --   "    "
90 inkscape     = "inkscape"
91
92 -- path to source and install directories; these are automatically set by
93 -- hake.sh at setup time 
94 source_dir :: String
95 -- source_dir = undefined -- (set by hake.sh, see end of file)
96
97 install_dir :: String
98 -- install_dir = undefined -- (set by hake.sh, see end of file)
99
100 -- Set of architectures for which to generate rules
101 architectures :: [String]
102 -- architectures = undefined -- (set by hake.sh, see end of file)
103
104 -- Optimisation flags (-Ox -g etc.) passed to compiler
105 cOptFlags :: [String]
106 cOptFlags = ["-g", "-O2"]
107
108 -- Selects which libc to compile with, "oldc" or "newlib"
109 libc :: String
110 --libc = "oldc"
111 libc = "newlib"
112
113 newlib_malloc :: String
114 --newlib_malloc = "sbrk"     -- use sbrk and newlib's malloc()
115 --newlib_malloc = "dlmalloc" -- use dlmalloc
116 newlib_malloc = "oldmalloc"
117
118 -- Configure pagesize for libbarrelfish's morecore implementation
119 -- x86_64 accepts "small", "large", and "huge" for 4kB, 2MB and 1GB pages
120 -- respectively. x86_32 accepts "small" and "large" for 4kB and 2MB/4MB pages
121 -- respectively. All other architectures default to their default page size.
122 morecore_pagesize :: String
123 morecore_pagesize = "small"
124
125 -- Use a frame pointer
126 use_fp :: Bool
127 use_fp = True
128
129 -- Default timeslice duration in milliseconds
130 timeslice :: Integer
131 timeslice = 80
132
133 -- Put kernel into microbenchmarks mode
134 microbenchmarks :: Bool
135 microbenchmarks = False
136
137 -- Enable tracing
138 trace :: Bool
139 trace = False
140
141 -- Enable QEMU networking. (ie. make network work in small memory)
142 support_qemu_networking :: Bool
143 support_qemu_networking  = False
144
145 -- armv7 platform to build for
146 -- Currently available: gem5, pandaboard
147 armv7_platform :: String
148 --armv7_platform = "gem5"
149 armv7_platform = "pandaboard"
150
151 -- on pandaboard, build a heterogenous image and let the cortex-A9 set up and start the
152 -- cortex-M3 processor (build targets "heteropanda_slave" and "heteropanda_master_image")
153 heteropanda :: Bool
154 heteropanda = False
155
156 -- enable network tracing
157 trace_network_subsystem :: Bool
158 trace_network_subsystem = False
159
160 -- May want to disable LRPC to improve trace visuals
161 trace_disable_lrpc :: Bool
162 trace_disable_lrpc = False
163
164 -- use Kaluga
165 use_kaluga_dvm :: Bool
166 use_kaluga_dvm = True
167
168 -- Domain and driver debugging
169 global_debug :: Bool
170 global_debug = False
171
172 e1000n_debug :: Bool
173 e1000n_debug = False
174
175 eMAC_debug :: Bool
176 eMAC_debug = False
177
178 rtl8029_debug :: Bool
179 rtl8029_debug = False
180
181 ahcid_debug :: Bool
182 ahcid_debug = False
183
184 libahci_debug :: Bool
185 libahci_debug = False
186
187 vfs_debug :: Bool
188 vfs_debug = False
189
190 ethersrv_debug :: Bool
191 ethersrv_debug = False
192
193 netd_debug :: Bool
194 netd_debug = False
195
196 libacpi_debug :: Bool 
197 libacpi_debug = False
198
199 acpi_interface_debug :: Bool
200 acpi_interface_debug = False
201
202 lpc_timer_debug :: Bool
203 lpc_timer_debug = False
204
205 lwip_debug :: Bool
206 lwip_debug = False
207
208 libpci_debug :: Bool
209 libpci_debug = False
210
211 usrpci_debug :: Bool
212 usrpci_debug = False
213
214 timer_debug :: Bool
215 timer_debug = False
216
217 eclipse_kernel_debug :: Bool
218 eclipse_kernel_debug = False
219
220 skb_debug :: Bool
221 skb_debug = False
222
223 skb_client_debug :: Bool
224 skb_client_debug = False
225
226 flounder_debug :: Bool
227 flounder_debug = False
228
229 flounder_failed_debug :: Bool
230 flounder_failed_debug = False
231
232 webserver_debug :: Bool
233 webserver_debug = False
234
235 sqlclient_debug :: Bool
236 sqlclient_debug = False
237
238 sqlite_debug :: Bool
239 sqlite_debug = False
240
241 sqlite_backend_debug :: Bool
242 sqlite_backend_debug = False
243
244 nfs_debug :: Bool
245 nfs_debug = False
246
247 rpc_debug :: Bool
248 rpc_debug = False
249
250 loopback_debug :: Bool
251 loopback_debug = False
252
253 octopus_debug :: Bool
254 octopus_debug = False
255
256 term_debug :: Bool
257 term_debug = False
258
259 serial_debug :: Bool
260 serial_debug = False
261
262 -- Deadlock debugging
263 debug_deadlocks :: Bool
264 debug_deadlocks = False
265
266 -- Partitioned memory server
267 memserv_percore :: Bool
268 memserv_percore = False
269
270 -- Lazy THC implementation (requires use_fp = True)
271 lazy_thc :: Bool
272 lazy_thc | elem "armv7" architectures   = False
273      | elem "armv5" architectures   = False
274      | elem "xscale" architectures  = False
275          | otherwise                    = True
276
277 -- Enable capability tracing debug facility
278 caps_trace :: Bool
279 caps_trace = False
280
281 -- Mapping Database configuration options (this affects lib/mdb/)
282 -- enable extensive tracing of mapping db implementation
283 mdb_trace :: Bool
284 mdb_trace = False
285
286 -- enable tracing of top level mdb_insert, mdb_remove calls
287 mdb_trace_no_recursive :: Bool
288 mdb_trace_no_recursive = False
289
290 -- fail on invariant violations
291 mdb_fail_invariants :: Bool
292 mdb_fail_invariants = True
293
294 -- check invariants before/after mdb_insert/mdb_remove.
295 mdb_check_invariants :: Bool
296 mdb_check_invariants = False
297
298 -- recheck invariants at each tracing point
299 mdb_recheck_invariants :: Bool
300 mdb_recheck_invariants = False
301
302 -- enable extensive tracing of mapping db implementation (userspace version)
303 mdb_trace_user :: Bool
304 mdb_trace_user = False
305
306 -- fail on invariant violations
307 mdb_fail_invariants_user :: Bool
308 mdb_fail_invariants_user = True
309
310 -- recheck invariants at each tracing point
311 mdb_recheck_invariants_user :: Bool
312 mdb_recheck_invariants_user = True
313
314 -- check invariants before/after mdb_insert/mdb_remove.
315 mdb_check_invariants_user :: Bool
316 mdb_check_invariants_user = True
317
318 -- Select scheduler
319 data Scheduler = RBED | RR deriving (Show,Eq)
320 scheduler :: Scheduler
321 scheduler = RBED
322
323 -- Physical Address Extensions (PAE)-enabled paging on x86-32
324 pae_paging :: Bool
325 pae_paging = False
326
327 -- Page Size Extensions (PSE)-enabled paging on x86-32
328 -- Always enabled when pae_paging == True, regardless of value
329 pse_paging :: Bool
330 pse_paging = False
331
332 -- No Execute Extensions (NXE)-enabled paging on x86-32
333 -- May not be True when pae_paging == False
334 nxe_paging :: Bool
335 nxe_paging = False
336
337 oneshot_timer :: Bool
338 oneshot_timer = False
339
340 -- Enable hardware VM support for AMD's Secure Virtual Machine (SVM)
341 -- If disabled, Intel's VMX hardware is supported instead
342 config_svm :: Bool
343 config_svm = True
344
345 -- Enable the use of only Arrakis domains (with arrakismon)
346 -- If disabled, use normal VM-guests (with vmkitmon)
347 config_arrakismon :: Bool
348 config_arrakismon = True
349
350 defines :: [RuleToken]
351 defines = [ Str ("-D" ++ d) | d <- [  
352              if microbenchmarks then "CONFIG_MICROBENCHMARKS" else "",
353              if trace then "CONFIG_TRACE" else "",
354              if support_qemu_networking then "CONFIG_QEMU_NETWORK" else "",
355              if trace_network_subsystem then "NETWORK_STACK_TRACE" else "",
356              if trace_disable_lrpc then "TRACE_DISABLE_LRPC" else "",
357              if global_debug then "GLOBAL_DEBUG" else "",
358              if e1000n_debug then "E1000N_SERVICE_DEBUG" else "",
359              if ahcid_debug then "AHCI_SERVICE_DEBUG" else "",
360              if libahci_debug then "AHCI_LIB_DEBUG" else "",
361              if vfs_debug then "VFS_DEBUG" else "",
362              if eMAC_debug then "EMAC_SERVICE_DEBUG" else "",
363              if rtl8029_debug then "RTL8029_SERVICE_DEBUG" else "",
364              if ethersrv_debug then "ETHERSRV_SERVICE_DEBUG" else "",
365              if netd_debug then "NETD_SERVICE_DEBUG" else "",
366              if libacpi_debug then "ACPI_DEBUG_OUTPUT" else "",
367              if acpi_interface_debug then "ACPI_BF_DEBUG" else "",
368              if lpc_timer_debug then "LPC_TIMER_DEBUG" else "",
369              if lwip_debug then "LWIP_BARRELFISH_DEBUG" else "",
370              if libpci_debug then "PCI_CLIENT_DEBUG" else "",
371              if usrpci_debug then "PCI_SERVICE_DEBUG" else "",
372              if timer_debug then "TIMER_CLIENT_DEBUG" else "",
373              if eclipse_kernel_debug then "ECLIPSE_KERNEL_DEBUG" else "",
374              if skb_debug then "SKB_SERVICE_DEBUG" else "",
375              if skb_client_debug then "SKB_CLIENT_DEBUG" else "",
376              if flounder_debug then "FLOUNDER_DEBUG" else "",
377              if flounder_failed_debug then "FLOUNDER_FAILED_DEBUG" else "",
378              if webserver_debug then "WEBSERVER_DEBUG" else "",
379              if sqlclient_debug then "SQL_CLIENT_DEBUG" else "",
380              if sqlite_debug then "SQL_SERVICE_DEBUG" else "",
381              if sqlite_backend_debug then "SQL_BACKEND_DEBUG" else "",
382              if nfs_debug then "NFS_CLIENT_DEBUG" else "",
383              if rpc_debug then "RPC_DEBUG" else "",
384              if loopback_debug then "LOOPBACK_DEBUG" else "",
385              if octopus_debug then "DIST_SERVICE_DEBUG" else "",
386              if term_debug then "TERMINAL_LIBRARY_DEBUG" else "",
387              if serial_debug then "SERIAL_DRIVER_DEBUG" else "",
388              if debug_deadlocks then "CONFIG_DEBUG_DEADLOCKS" else "",
389              if memserv_percore then "CONFIG_MEMSERV_PERCORE" else "",
390              if lazy_thc then "CONFIG_LAZY_THC" else "",
391              if pae_paging then "CONFIG_PAE" else "",
392              if pse_paging then "CONFIG_PSE" else "",
393              if nxe_paging then "CONFIG_NXE" else "",
394              if libc == "oldc" then "CONFIG_OLDC" else "CONFIG_NEWLIB",
395              if oneshot_timer then "CONFIG_ONESHOT_TIMER" else "",
396              if config_svm then "CONFIG_SVM" else "",
397              if config_arrakismon then "CONFIG_ARRAKISMON" else "",
398              if use_kaluga_dvm then "USE_KALUGA_DVM" else "",
399              if heteropanda then "HETEROPANDA" else "",
400              if caps_trace then "TRACE_PMEM_CAPS" else ""
401              ], d /= "" ]
402
403 -- Sets the include path for the libc
404 libcInc :: String
405 libcInc = if libc == "oldc" then "/include/oldc"
406           else "/lib/newlib/newlib/libc/include"
407
408 -- Sets the include path for lwIP
409 lwipInc :: String
410 lwipInc = "/lib/lwip/src/include"
411 lwipxxxInc :: String
412 lwipxxxInc = "/lib/lwip/src/include/ipv4"
413
414 -- some defines depend on the architecture/compile options
415 arch_defines :: Options -> [RuleToken]
416 arch_defines opts
417     -- enable config flags for interconnect drivers in use for this arch
418     = [ Str ("-D" ++ d)
419        | d <- ["CONFIG_INTERCONNECT_DRIVER_" ++ (map toUpper n)
420                | n <- optInterconnectDrivers opts]
421       ]
422     -- enable config flags for flounder backends in use for this arch
423     ++ [ Str ("-D" ++ d)
424        | d <- ["CONFIG_FLOUNDER_BACKEND_" ++ (map toUpper n)
425                | n <- optFlounderBackends opts]
426       ]
427
428 -- newlib common compile flags (maybe put these in a config.h file?)
429 newlibAddCFlags :: [String]
430 newlibAddCFlags = [ "-DPACKAGE_NAME=\"newlib\"" ,
431                     "-DPACKAGE_TARNAME=\"newlib\"",
432                     "-DPACKAGE_VERSION=\"1.19.0\"",
433                     "-DPACKAGE_BUGREPORT=\"\"",
434                     "-DPACKAGE_URL=\"\"",
435                     "-D_I386MACH_ALLOW_HW_INTERRUPTS",
436                     "-DMISSING_SYSCALL_NAMES",
437                     "-D_WANT_IO_C99_FORMATS",
438                     "-D_COMPILING_NEWLIB",
439                     "-D_WANT_IO_LONG_LONG",
440                     "-D_WANT_IO_LONG_DOUBLE",
441                     "-D_MB_CAPABLE",
442                     "-D__BSD_VISIBLE"]