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