16c0d82d9fdfed3d1e38290ca707ce8103007ece
[monolithium.git] / kernel / Makefile
1 #
2 # Makefile
3 #
4 # Copyright (C) 2016 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5 #
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as
8 # published by the Free Software Foundation, either version 3 of the
9 # License, or (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 #
19
20 # Settings
21 DEBUG  = yes
22 ACPICA = yes
23
24 # Compilers and tools
25 CC = i686-elf-gcc
26 ASM = nasm
27 LINK = i686-elf-ld
28
29 # Directories
30 SRCDIR = src
31 OBJDIR = obj
32 DEPDIR = dep
33
34 LIBGCC_DIR = $(shell $(CC) -print-file-name=)
35
36 # Flags
37 CFLAGS = -Wall -Werror -Wno-strict-aliasing -ffreestanding -nostdlib -I include -I .. -I ../crt/include
38 ASMFLAGS = -felf
39 LDFLAGS = -T link.ld -L $(LIBGCC_DIR) -L ../crt -lgcc -lmlcrt
40
41 ifeq ($(DEBUG), yes)
42     CFLAGS += -g
43 else
44     CFLAGS += -O3
45 endif
46
47 # Input and output files
48 SOURCES =  $(wildcard $(SRCDIR)/*.c)
49 SOURCES += $(wildcard $(SRCDIR)/memory/*.c)
50 SOURCES += $(wildcard $(SRCDIR)/exec/*.c)
51 SOURCES += $(shell find $(SRCDIR)/drivers -type f -name \*.c)
52 SOURCES += $(wildcard $(SRCDIR)/*.asm)
53
54 ifeq ($(ACPICA), yes)
55     CFLAGS += -I include/acpica -D ACPICA
56     SOURCES += $(shell find $(SRCDIR)/acpica -type f -name \*.c)
57 endif
58
59 DEPENDS = $(shell find $(DEPDIR) -type f -name \*.d)
60 OBJECTS = $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(patsubst $(SRCDIR)/%.asm, $(OBJDIR)/%.o, $(SOURCES)))
61
62 .PHONY: all clean
63
64 all: $(OBJDIR) $(DEPDIR) monolithium
65
66 clean:
67         find $(OBJDIR) -name \*.o -delete
68         find $(DEPDIR) -name \*.d -delete
69         rm monolithium
70
71 -include $(DEPENDS)
72
73 $(OBJDIR):
74         mkdir -p $(OBJDIR)
75
76 $(DEPDIR):
77         mkdir -p $(DEPDIR)
78
79 $(OBJDIR)/%.o: $(SRCDIR)/%.c Makefile
80         mkdir -p $(dir $@)
81         mkdir -p $(dir $(@:$(OBJDIR)/%.o=$(DEPDIR)/%.d))
82         $(CC) $(CFLAGS) -MMD -MP -MF $(@:$(OBJDIR)/%.o=$(DEPDIR)/%.d) -o $@ -c $<
83
84 $(OBJDIR)/%.o: $(SRCDIR)/%.asm
85         mkdir -p $(dir $@)
86         $(ASM) $(ASMFLAGS) -o $@ $<
87
88 monolithium: $(OBJDIR)/boot/boot.o $(OBJECTS)
89         $(LINK) -o $@ $(OBJECTS) $(LDFLAGS)