417 lines
13 KiB
Haskell
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
|
|
]
|