aos/hake/ArchDefaults.hs
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

417 lines
13 KiB
Haskell

--------------------------------------------------------------------------
-- Copyright (c) 2007-2010, ETH Zurich.
-- All rights reserved.
--
-- This file is distributed under the terms in the attached LICENSE file.
-- If you do not find this file, copies can be found by writing to:
-- ETH Zurich D-INFK, Universitaetstasse 6, CH-8092 Zurich. Attn: Systems Group.
--
-- Default architecture-specific definitions for Barrelfish
--
--------------------------------------------------------------------------
module ArchDefaults where
import Data.List
import HakeTypes
import System.FilePath
import qualified Config
commonFlags = [ Str s | s <- [ "-fno-builtin",
"-nostdinc",
"-U__linux__",
"-Ulinux",
"-Wall",
"-Wshadow",
"-Wmissing-declarations",
"-Wmissing-field-initializers",
"-Wtype-limits",
"-Wredundant-decls",
"-Werror" ] ]
commonCFlags = [ Str s | s <- [ "-std=c99",
"-Wstrict-prototypes",
"-Wold-style-definition",
"-Wmissing-prototypes" ] ]
++ [ Str (if Config.use_fp then "-fno-omit-frame-pointer" else "") ]
commonCxxFlags = [ Str s | s <- [ "-nostdinc++",
"-fexceptions",
"-nodefaultlibs",
"-fasynchronous-unwind-tables",
"-DLIBCXX_CXX_ABI=libcxxabi",
"-I" ] ]
++ [ NoDep SrcTree "src" "/include/cxx" ]
++ [ Str (if Config.use_fp then "-fno-omit-frame-pointer" else "") ]
cFlags = [ Str s | s <- [ "-Wno-packed-bitfield-compat" ] ]
++ commonCFlags
cxxFlags = [ Str s | s <- [ "-Wno-packed-bitfield-compat" ] ]
++ commonCxxFlags
cDefines options = [ Str ("-D"++s) | s <- [ "BARRELFISH",
"BF_BINARY_PREFIX=\\\"\\\""
]
]
++ Config.defines
++ Config.arch_defines options
cStdIncs arch archFamily =
[ NoDep BFSrcTree "src" "/include",
NoDep BFSrcTree "src" ("/include/arch" </> archFamily),
NoDep BFSrcTree "src" ("/include/target" </> archFamily),
NoDep InstallTree arch "/include",
NoDep BFSrcTree "src" ".",
NoDep SrcTree "src" ".",
NoDep BuildTree arch "." ]
ldFlags arch =
map Str Config.cOptFlags ++
[ In InstallTree arch "/lib/crt0.o",
In InstallTree arch "/lib/crtbegin.o",
Str "-fno-builtin",
Str "-nostdlib" ]
ldCxxFlags arch =
map Str Config.cOptFlags ++
[ In InstallTree arch "/lib/crt0.o",
In InstallTree arch "/lib/crtbegin.o",
Str "-fno-builtin",
Str "-nostdlib" ]
kernelLibs arch =
[ In InstallTree arch "/lib/libcompiler-rt.a" ]
-- Libraries that are linked to all applications.
stdLibDeps =
[
"aos",
"c",
"compiler-rt",
"errno",
"collections"
]
stdCxxLibDeps = ["cxx"] ++ stdLibDeps
stdLibs arch =
-- Library OS now added in appGetOptionsForArch based on options field 'libraryOs'.
-- Archive files should be added to stdLibDeps.
[ In InstallTree arch "/lib/crtend.o" ]
stdCxxLibs arch =
[ ]
++ stdLibs arch
options arch archFamily = Options {
optArch = arch,
optArchFamily = archFamily,
optFlags = cFlags,
optCxxFlags = cxxFlags,
optDefines = [ Str "-DBARRELFISH" ] ++ Config.defines,
optIncludes = cStdIncs arch archFamily,
optDependencies =
[ Dep InstallTree arch "/include/errors/errno.h",
Dep InstallTree arch "/include/barrelfish_kpi/capbits.h",
Dep InstallTree arch "/include/asmoffsets.h",
Dep InstallTree arch "/include/trace_definitions/trace_defs.h" ],
optLdFlags = ldFlags arch,
optLdCxxFlags = ldCxxFlags arch,
optLibDep = stdLibDeps,
optLibs = stdLibs arch,
optCxxLibDep = stdCxxLibDeps,
optCxxLibs = stdCxxLibs arch,
optInterconnectDrivers = ["lmp", "ump", "multihop", "local"],
optFlounderBackends = ["lmp", "ump", "multihop", "local"],
extraFlags = [],
extraCxxFlags = [],
extraDefines = [],
extraIncludes = [],
extraDependencies = [],
extraLdFlags = [],
optSuffix = [],
optInstallPath = OptionsPath {
optPathBin = "/sbin",
optPathLib = "/lib"
}
}
------------------------------------------------------------------------
--
-- Now, commands to actually do something
--
------------------------------------------------------------------------
--
-- C compiler
--
cCompiler :: String -> String -> [String] -> Options -> String ->
String -> String -> [RuleToken]
cCompiler arch compiler opt_flags opts phase src obj =
let incls = (extraIncludes opts) ++ (optIncludes opts)
flags = (optFlags opts)
++ (optDefines opts)
++ [ Str f | f <- extraFlags opts ]
++ [ Str f | f <- extraDefines opts ]
deps = (optDependencies opts) ++ (extraDependencies opts)
in
[ Str compiler ] ++ flags ++ (map Str opt_flags)
++ concat [ [ NStr "-I", i ] | i <- incls ]
++ [ Str "-o", Out arch obj,
Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src ]
++ deps
--
-- the C preprocessor, like C compiler but with -E
--
cPreprocessor :: String -> String -> [String] -> Options -> String ->
String -> String -> [RuleToken]
cPreprocessor arch compiler opt_flags opts phase src obj =
let incls = (extraIncludes opts) ++ (optIncludes opts)
flags = (optFlags opts)
++ (optDefines opts)
++ [ Str f | f <- extraFlags opts ]
++ [ Str f | f <- extraDefines opts ]
deps = (optDependencies opts) ++ (extraDependencies opts)
cOptFlags = opt_flags \\ ["-g"]
in
[ Str compiler ] ++ flags ++ (map Str cOptFlags)
++ concat [ [ NStr "-I", i ] | i <- incls ]
++ [ Str "-o", Out arch obj,
Str "-E", In (if phase == "src" then SrcTree else BuildTree) phase src ]
++ deps
--
-- C++ compiler
--
cxxCompiler arch cxxcompiler opt_flags opts phase src obj =
let incls = (extraIncludes opts) ++ (optIncludes opts)
flags = (optCxxFlags opts)
++ (optDefines opts)
++ [ Str f | f <- extraCxxFlags opts ]
++ [ Str f | f <- extraDefines opts ]
deps = (optDependencies opts) ++ (extraDependencies opts)
in
[ Str cxxcompiler ] ++ flags ++ (map Str opt_flags)
++ concat [ [ NStr "-I", i ] | i <- incls ]
++ [ Str "-o", Out arch obj,
Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src ]
++ deps
--
-- Create C file dependencies
--
makeDepend arch compiler opts phase src obj depfile =
let incls = (extraIncludes opts) ++ (optIncludes opts)
flags = (optFlags opts)
++ (optDefines opts)
++ [ Str f | f <- extraFlags opts ]
++ [ Str f | f <- extraDefines opts ]
in
[ Str ('@':compiler) ] ++ flags
++ concat [ [ NStr "-I", i ] | i <- incls ]
++ (optDependencies opts) ++ (extraDependencies opts)
++ [ Str "-M -MF",
Out arch depfile,
Str "-MQ", NoDep BuildTree arch obj,
Str "-MQ", NoDep BuildTree arch depfile,
Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src
]
--
-- Create C++ file dependencies
--
makeCxxDepend arch cxxcompiler opts phase src obj depfile =
let incls = (extraIncludes opts) ++ (optIncludes opts)
flags = (optCxxFlags opts)
++ (optDefines opts)
++ [ Str f | f <- extraCxxFlags opts ]
++ [ Str f | f <- extraDefines opts ]
in
[ Str ('@':cxxcompiler) ] ++ flags
++ concat [ [ NStr "-I", i ] | i <- incls ]
++ (optDependencies opts) ++ (extraDependencies opts)
++ [ Str "-M -MF",
Out arch depfile,
Str "-MQ", NoDep BuildTree arch obj,
Str "-MQ", NoDep BuildTree arch depfile,
Str "-c", In (if phase == "src" then SrcTree else BuildTree) phase src
]
--
-- Compile a C program to assembler
--
cToAssembler :: String -> String -> [String] -> Options -> String -> String ->
String -> String -> [ RuleToken ]
cToAssembler arch compiler opt_flags opts phase src afile objdepfile =
let incls = (extraIncludes opts) ++ (optIncludes opts)
flags = (optFlags opts)
++ (optDefines opts)
++ [ Str f | f <- extraFlags opts ]
++ [ Str f | f <- extraDefines opts ]
deps = [ Dep BuildTree arch objdepfile ] ++
(optDependencies opts) ++
(extraDependencies opts)
in
[ Str compiler ] ++ flags ++ (map Str opt_flags)
++ concat [ [ NStr "-I", i ] | i <- incls ]
++ [ Str "-o ", Out arch afile,
Str "-S ", In (if phase == "src" then SrcTree else BuildTree) phase src ]
++ deps
--
-- Assemble an assembly language file
--
assembler :: String -> String -> [ String ] -> Options -> String ->
String -> [ RuleToken ]
assembler arch compiler opt_flags opts src obj =
let incls = (extraIncludes opts) ++ (optIncludes opts)
flags = (optFlags opts)
++ (optDefines opts)
++ [ Str f | f <- extraFlags opts ]
++ [ Str f | f <- extraDefines opts ]
deps = (optDependencies opts) ++ (extraDependencies opts)
in
[ Str compiler ] ++ flags ++ (map Str opt_flags)
++ concat [ [ NStr "-I", i ] | i <- incls ]
++ [ Str "-o ", Out arch obj, Str "-c ", In SrcTree "src" src ]
++ deps
--
-- Create a library from a set of object files
--
archive :: String -> Options -> [String] -> [String] -> String -> String -> [ RuleToken ]
archive arch opts objs libs name libname =
[ Str "rm -f ", Out arch libname ]
++
[ NL, Str "ar crT ", Out arch libname ]
++
[ In BuildTree arch o | o <- objs ]
++
if libs == [] then []
else [ In BuildTree arch a | a <- libs ]
++
[ NL, Str "ranlib ", Out arch libname ]
--
-- Link an executable, explicitly stating libraries and modules
--
linker :: String -> String -> Options -> [String] -> [String] -> [String] -> String -> [RuleToken]
linker arch compiler opts objs libs mods bin =
[ Str compiler ]
++ (optLdFlags opts)
++
(extraLdFlags opts)
++
[ Str "-o", Out arch bin ]
++
[ In BuildTree arch o | o <- objs ]
++
[Str "-Wl,--start-group"]
++
[ In BuildTree arch l | l <- libs ]
++
[Str "-Wl,--whole-archive"] ++ [ In BuildTree arch l | l <- mods ] ++ [Str "-Wl,--no-whole-archive"]
++
[ In BuildTree arch l | l <- libs ]
++
(optLibs opts)
++
[Str "-Wl,--end-group"]
--
-- Link an executable, libs and mods are not passed, but later resolved
-- using the application name "app" and the library dependency tree
--
ldtLinker :: String -> String -> Options -> [String] -> String -> String -> [RuleToken]
ldtLinker arch compiler opts objs app bin =
[ Str compiler ]
++ (optLdFlags opts)
++
(extraLdFlags opts)
++
[ Str "-o", Out arch bin ]
++
[ In BuildTree arch o | o <- objs ]
++
[Str "-Wl,--start-group"]
++
[ Ldt BuildTree arch app ]
++
(optLibs opts)
++
[Str "-Wl,--end-group"]
--
-- Link an executable
--
cxxlinker :: String -> String -> Options -> [String] -> [String] -> [String] -> String -> [RuleToken]
cxxlinker arch cxxcompiler opts objs libs mods bin =
[ Str cxxcompiler ]
++ (optLdCxxFlags opts)
++
(extraLdFlags opts)
++
[ Str "-o", Out arch bin ]
++
[ In BuildTree arch o | o <- objs ]
++
[ In BuildTree arch l | l <- libs ]
++
[Str "-Wl,--start-group -Wl,--whole-archive"] ++ [ In BuildTree arch l | l <- mods ] ++ [Str "-Wl,--no-whole-archive"]
++
(optCxxLibs opts)
++
[Str "-Wl,--end-group"]
--
-- Link an executable
--
ldtCxxlinker :: String -> String -> Options -> [String] -> String -> String -> [RuleToken]
ldtCxxlinker arch cxxcompiler opts objs app bin =
[ Str cxxcompiler ]
++
(optLdCxxFlags opts)
++
(extraLdFlags opts)
++
[ Str "-o", Out arch bin ]
++
[ In BuildTree arch o | o <- objs ]
++
[Str "-Wl,--start-group"]
++
[ Ldt BuildTree arch app ]
++
(optCxxLibs opts)
++
[Str "-Wl,--end-group"]
--
-- Strip debug symbols from an executable
--
strip :: String -> String -> Options -> String -> String ->
String -> [RuleToken]
strip arch objcopy opts src debuglink target =
[ Str objcopy,
Str "-g",
NStr "--add-gnu-debuglink=", In BuildTree arch debuglink,
In BuildTree arch src,
Out arch target
]
--
-- Extract debug symbols from an executable
--
debug :: String -> String -> Options -> String -> String -> [RuleToken]
debug arch objcopy opts src target =
[ Str objcopy,
Str "--only-keep-debug",
In BuildTree arch src,
Out arch target
]