1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
--
-- Redefine output function to put everything in build/
--
function BuildOutput(mode)
local basepath = mode and ("build/" .. mode) or "build"
return function (settings, fname)
if fname:sub(1, 4) == "src/" or fname:sub(1, 4) == "res/" then
fname = fname:sub(5)
end
local out = PathJoin(basepath, PathBase(fname) .. settings.config_ext)
return out
end
end
--
-- Define custom settings
--
local host_settings = NewSettings()
local common_settings = NewSettings()
if os.getenv('CC') and string.match(os.getenv('CC'), '.*analyzer$') then
print("Detected clang-analyzer")
SetDriversGCC(host_settings)
host_settings.cc.exe_c = 'CCC_CC=gcc ' .. os.getenv('CC')
host_settings.cc.exe_cxx = 'CCC_CXX=g++ ' .. os.getenv('CXX')
SetDriversGCC(common_settings)
common_settings.cc.flags:Add('-U__linux__')
common_settings.cc.exe_c = 'CCC_CC=i586-elf-gcc ' .. os.getenv('CC')
common_settings.cc.exe_cxx = 'CCC_CXX=i586-elf-g++ ' .. os.getenv('CXX')
common_settings.link.exe = 'CCC_CC=i586-elf-gcc ' .. os.getenv('CC')
else
common_settings.cc.exe_c = "i586-elf-gcc"
common_settings.cc.exe_cxx = "i586-elf-g++"
common_settings.link.exe = "i586-elf-gcc"
end
host_settings.cc.Output = BuildOutput(nil)
host_settings.cc.extension = ".host.o"
host_settings.cc.includes:Add("src/lib/include/proto",
"src/common/include")
host_settings.link.extension = ".bin"
common_settings.compile.mappings['s'] = function(settings, input)
local output = settings.cc.Output(settings, input) .. settings.cc.extension
AddJob(output, "nasm " .. input,
"nasm -felf -g -o " .. output .. " " .. input)
AddDependency(output, input)
return output
end
common_settings.cc.Output = BuildOutput(nil)
common_settings.cc.includes:Add("src/common/include", ".")
common_settings.cc.flags:Add("-m32",
"-ffreestanding",
"-std=gnu99",
"-Wall", "-Wextra", "-Werror",
"-Wno-unused-parameter",
"-Wno-unused-function")
common_settings.link.extension = ".bin"
common_settings.link.flags:Add("-ffreestanding",
"-nostdlib")
common_settings.link.libs:Add("gcc")
common_settings.link.Output = BuildOutput(nil)
local user_settings = TableDeepCopy(common_settings)
user_settings.cc.includes:Add('src/lib/include')
local base_settings = {
host_settings = host_settings,
common_settings = common_settings,
user_settings = user_settings
}
--
-- Require build scripts for all components
--
local fonts = require('res/fonts/bam')(base_settings)
local keymaps = require('res/keymaps/bam')(base_settings)
local function cdrom(name, settings)
for _, s in pairs(settings) do
s.cc.Output = BuildOutput(name)
s.link.Output = BuildOutput(name)
end
local common = require('src/common/bam')(settings)
local kernel = require('src/kernel/bam')(settings, common)
local lib = require('src/lib/bam')(settings, common)
local sysbin = require('src/sysbin/bam')(settings, lib)
local bin = require('src/bin/bam')(settings, lib)
if name == "dev" then
dev_kernel = kernel
end
local cdrom = "cdrom." .. name .. ".iso"
AddJob(cdrom, "building ISO", "./make_cdrom.sh " .. name)
AddDependency(cdrom, kernel.bin, sysbin, bin, fonts, keymaps)
AddDependency(cdrom, Collect('src/syslua/*.lua'))
--
-- Script for running tests
--
local tests = {
require('src/tests/slab_test/bam')(settings),
require('src/tests/ktests/bam')(settings, common, kernel.obj),
require('src/tests/utests/bam')(settings, kernel.bin, lib)
}
PseudoTarget("test." .. name, tests)
return cdrom
end
local dev_settings = TableDeepCopy(base_settings)
for _, s in pairs(dev_settings) do
s.cc.flags:Add("-g", "-O0")
end
local dev_cdrom = cdrom("dev", dev_settings)
local rel_settings = TableDeepCopy(base_settings)
for _, s in pairs(rel_settings) do
s.cc.flags:Add("-Os", "-flto")
s.link.flags:Add("-Os", "-flto", "-Wl,--gc-sections")
-- Maybe do this, goes with --gc-sections
-- s.cc.flags:Add("-ffunction-sections", "-fdata-sections")
end
local rel_cdrom = cdrom("rel", rel_settings)
DefaultTarget(dev_cdrom)
|