aboutsummaryrefslogtreecommitdiff
path: root/bam.lua
blob: d3c428a5aaf5c30b7b6e84cc012c35810c2ec85f (plain) (blame)
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
--
-- 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)

	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, 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)