14a3724df5212ea4e7455c6d2c0a32734779e209
[monolithium.git] / common.mk
1 #
2 # common.mk
3 #
4 # Copyright (C) 2018 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 ARCH := i686-elf
21
22 # Directories
23 SRCDIR       := src
24 OBJDIR       := obj
25 DEPDIR       := dep
26 TOOLSDIR     := tools
27 TOOLSROOTDIR := root
28
29 PROJECT_ROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
30 export PATH  := $(PROJECT_ROOT)/$(TOOLSDIR)/$(TOOLSROOTDIR)/bin:$(PATH)
31
32 # Compilers and tools
33 CC   := $(ARCH)-gcc
34 ASM  := nasm
35 LINK := $(ARCH)-ld
36
37 ifeq ($(DEBUG), yes)
38     CFLAGS += -g -DDEBUG
39 else
40     CFLAGS += -O3
41 endif
42
43 ifeq ($(LINK_WITH_LIBGCC), yes)
44         LIBGCCDIR := $(shell PATH=$(PATH) $(CC) -print-file-name=)
45         LDFLAGS   += -L "$(LIBGCCDIR)" -lgcc
46 endif
47
48 # Output files
49 OUTPUTS := $(OUTPUT_KERNEL) $(OUTPUT_PROGRAM) $(OUTPUT_DRIVER) $(OUTPUT_STATIC_LIB) $(OUTPUT_DYNAMIC_LIB) $(ADDITIONAL_OBJECTS)
50 DEPENDS := $(shell find $(DEPDIR) -type f -name \*.d)
51 OBJECTS := $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(patsubst $(SRCDIR)/%.asm, $(OBJDIR)/%.o, $(SOURCES)))
52
53 .PHONY: all clean
54
55 all: $(OBJDIR) $(DEPDIR) $(OUTPUTS)
56
57 -include $(DEPENDS)
58
59 clean:
60         rm -f $(OUTPUTS)
61         find $(OBJDIR) -name \*.o -delete
62         find $(DEPDIR) -name \*.d -delete
63
64 $(OBJDIR):
65         mkdir -p $(OBJDIR)
66
67 $(DEPDIR):
68         mkdir -p $(DEPDIR)
69
70 $(OBJDIR)/%.o: $(SRCDIR)/%.c Makefile
71         mkdir -p $(dir $@)
72         mkdir -p $(dir $(@:$(OBJDIR)/%.o=$(DEPDIR)/%.d))
73         $(CC) $(CFLAGS) -MMD -MP -MF $(@:$(OBJDIR)/%.o=$(DEPDIR)/%.d) -o $@ -c $<
74
75 $(OBJDIR)/%.o: $(SRCDIR)/%.asm Makefile
76         mkdir -p $(dir $@)
77         $(ASM) $(ASMFLAGS) -o $@ $<
78
79 $(OUTPUT_KERNEL): $(OBJECTS) $(ADDITIONAL_OBJECTS)
80         $(LINK) -o $@ $(OBJECTS) $(LDFLAGS)
81
82 $(OUTPUT_PROGRAM): $(OBJECTS)
83         $(LINK) -eprocess_startup -o $@ $(OBJECTS) $(LDFLAGS)
84
85 $(OUTPUT_STATIC_LIB): $(OBJECTS)
86         $(AR) rcs $@ $^
87
88 $(OUTPUT_DYNAMIC_LIB) $(OUTPUT_DRIVER): $(OBJECTS)
89         $(LINK) -shared -o $@ $(OBJECTS) $(LDFLAGS)