Added makefile for kernel and modules
This commit is contained in:
parent
864d8593a6
commit
1bd5e5d464
|
@ -0,0 +1,143 @@
|
|||
# Settings for architecture
|
||||
|
||||
DEFAULT_HOST!=../default-host.sh
|
||||
HOST?=DEFAULT_HOST
|
||||
HOSTARCH!=../target-triplet-to-arch.sh $(HOST)
|
||||
|
||||
# Compiler and linker flags.
|
||||
|
||||
CFLAGS?=-g3
|
||||
CPPFLAGS?=
|
||||
LDFLAGS?=
|
||||
LIBS?=
|
||||
|
||||
# Destination directories in sysroot.
|
||||
|
||||
DESTDIR?=
|
||||
PREFIX?=/usr/local
|
||||
EXEC_PREFIX?=$(PREFIX)
|
||||
BOOTDIR?=$(PREFIX)/boot
|
||||
INCLUDEDIR?=$(PREFIX)/include
|
||||
|
||||
# Updated compiler flags
|
||||
|
||||
CFLAGS:=$(CFLAGS) -ffreestanding -D__is_kernel -Iinclude -Wall -Wextra -Werror
|
||||
CPPFLAGS:=$(CPPFLAGS)
|
||||
LDFLAGS:=$(LDFLAGS)
|
||||
LIB_INCLUDE_FLAGS=-L./lib/so
|
||||
LIBS:=$(LIBS) -nostdlib -lgcc -lklib #-lk -lgcc
|
||||
|
||||
# Current architecture directory
|
||||
|
||||
ARCHDIR=arch/$(HOSTARCH)
|
||||
|
||||
# Directory for architecture
|
||||
|
||||
include $(ARCHDIR)/make.config
|
||||
|
||||
# Updated compiler flags with architecture settings added
|
||||
|
||||
CFLAGS:=$(CFLAGS) $(KERNEL_ARCH_CFLAGS)
|
||||
CPPFLAGS:=$(CPPFLAGS) $(KERNEL_ARCH_CPPFLAGS)
|
||||
LDFLAGS:=$(LDFLAGS) $(KERNEL_ARCH_LDFLAGS)
|
||||
LIBS:=$(LIBS) $(KERNEL_ARCH_LIBS)
|
||||
|
||||
# Main kernel objects and architecture objects
|
||||
|
||||
KERNEL_OBJS=\
|
||||
$(KERNEL_ARCH_OBJS) \
|
||||
kernel/kernel.o \
|
||||
|
||||
# Module directories
|
||||
|
||||
SPECIAL_DIRS=arch include kernel lib
|
||||
MODULE_DIRS=$(filter-out $(SPECIAL_DIRS), $(wildcard *))
|
||||
MODULE_DIRS:=$(filter-out $(wildcard Makefile*), $(MODULE_DIRS))
|
||||
|
||||
# Module Makefile, knows how to build each module
|
||||
|
||||
MODULE_MAKEFILE=Makefile.Module
|
||||
|
||||
# Module objects
|
||||
|
||||
MODULE_OBJS=$(foreach MODULE, $(MODULE_DIRS), $(wildcard $(MODULE)/*.o))
|
||||
|
||||
# Overall objects
|
||||
|
||||
OBJS= \
|
||||
$(ARCHDIR)/crti.o \
|
||||
$(ARCHDIR)/crtbegin.o \
|
||||
$(KERNEL_OBJS) \
|
||||
$(ARCHDIR)/crtend.o \
|
||||
$(ARCHDIR)/crtn.o \
|
||||
|
||||
# Link list, embeds C run time objects and kernel objects.
|
||||
|
||||
LINK_LIST= \
|
||||
$(LDFLAGS) \
|
||||
$(ARCHDIR)/crti.o \
|
||||
$(ARCHDIR)/crtbegin.o \
|
||||
$(KERNEL_OBJS) \
|
||||
$(ARCHDIR)/crtend.o \
|
||||
$(ARCHDIR)/crtn.o \
|
||||
|
||||
.PHONY: all clean install install-headers install-kernel module_all \
|
||||
module_clean library_all library_clean
|
||||
.SUFFIXES: .o .c .S
|
||||
|
||||
all: os.kernel
|
||||
|
||||
module_all:
|
||||
@echo
|
||||
$(foreach MODULE, $(MODULE_DIRS), \
|
||||
cp $(MODULE_MAKEFILE) $(MODULE)/Makefile; \
|
||||
$(MAKE) -C $(MODULE); \
|
||||
$(RM) $(MODULE)/Makefile; \
|
||||
echo; \
|
||||
)
|
||||
|
||||
module_clean:
|
||||
@echo
|
||||
$(foreach MODULE, $(MODULE_DIRS), \
|
||||
cp $(MODULE_MAKEFILE) $(MODULE)/Makefile; \
|
||||
$(MAKE) -C $(MODULE) clean; \
|
||||
$(RM) $(MODULE)/Makefile; \
|
||||
echo; \
|
||||
)
|
||||
|
||||
library_all:
|
||||
$(MAKE) -C lib
|
||||
|
||||
library_clean:
|
||||
$(MAKE) -C lib clean
|
||||
|
||||
os.kernel: library_all module_all $(OBJS) $(ARCHDIR)/linker.ld
|
||||
$(CC) -T $(ARCHDIR)/linker.ld -o $@ $(CFLAGS) $(LINK_LIST) $(MODULE_OBJS) \
|
||||
$(LIB_INCLUDE_FLAGS) $(LIBS)
|
||||
grub-file --is-x86-multiboot os.kernel
|
||||
|
||||
$(ARCHDIR)/crtbegin.o $(ARCHDIR)/crtend.o:
|
||||
OBJ=`$(CC) $(CFLAGS) $(LDFLAGS) -print-file-name=$(@F)` && cp "$$OBJ" $@
|
||||
|
||||
.c.o:
|
||||
$(CC) -MD -c $< -o $@ -std=gnu11 $(CFLAGS) $(CPPFLAGS)
|
||||
|
||||
.S.o:
|
||||
$(CC) -MD -c $< -o $@ $(CFLAGS) $(CPPFLAGS)
|
||||
|
||||
clean: library_clean module_clean
|
||||
rm -f os.kernel
|
||||
rm -f $(OBJS) *.o */*.o */*/*.o
|
||||
rm -f $(OBJS:.o=.d) *.d */*.d */*/*.d
|
||||
|
||||
install: install-headers install-kernel
|
||||
|
||||
install-headers:
|
||||
mkdir -p $(DESTDIR)$(INCLUDEDIR)
|
||||
cp -R --preserve=timestamps include/. $(DESTDIR)$(INCLUDEDIR)/.
|
||||
|
||||
install-kernel: os.kernel
|
||||
mkdir -p $(DESTDIR)$(BOOTDIR)
|
||||
cp os.kernel $(DESTDIR)$(BOOTDIR)
|
||||
|
||||
-include $(OBJS:.o=.d)
|
|
@ -0,0 +1,48 @@
|
|||
# Stand-alone directories
|
||||
|
||||
SRC_DIR := src
|
||||
OBJ_DIR := obj
|
||||
INCLUDE_DIRS := ../include ../include/kernel ./include
|
||||
|
||||
# MOD_OBJ - Module Object. Its name will be the same as the module so it is
|
||||
# a good idea to automate that.
|
||||
|
||||
CURR_DIR = $(notdir $(shell pwd))
|
||||
MOD_OBJ := $(CURR_DIR).o
|
||||
|
||||
# Library dependencies
|
||||
|
||||
LIB_INCLUDE_DIRS := ../lib/include
|
||||
|
||||
# Module sources and their object files
|
||||
|
||||
SRC = $(wildcard $(SRC_DIR)/*.c)
|
||||
OBJ := $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
|
||||
|
||||
# Compiler settings
|
||||
|
||||
HFLAGS = -MMD
|
||||
CFLAGS+=-c
|
||||
|
||||
# Include directories
|
||||
|
||||
INCFLAGS = $(foreach TMP, $(LIB_INCLUDE_DIRS), -I$(TMP))
|
||||
INCFLAGS += $(foreach TMP, $(INCLUDE_DIRS), -I$(TMP))
|
||||
|
||||
.PHONY: all clean
|
||||
|
||||
all: $(MOD_OBJ)
|
||||
|
||||
$(MOD_OBJ): $(OBJ) | $(MOBJ_DIR)
|
||||
$(AR) rcs $@ $(OBJ)
|
||||
|
||||
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
|
||||
$(CC) $< -o $@ $(CFLAGS) $(HFLAGS) $(INCFLAGS)
|
||||
|
||||
$(OBJ_DIR) $(MOBJ_DIR):
|
||||
mkdir -p $@
|
||||
|
||||
clean:
|
||||
@$(RM) -rv $(OBJ_DIR) $(MOBJ_DIR)
|
||||
|
||||
-include $(OBJ:.o=.d)
|
|
@ -0,0 +1,8 @@
|
|||
#include "kernel/screen.h"
|
||||
|
||||
void kmain(void) {
|
||||
|
||||
screen_init();
|
||||
screen_write("aa", 2);
|
||||
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
#include "screen.h"
|
||||
#include "serial.h"
|
||||
|
||||
void kmain(void) {
|
||||
|
||||
screen_init();
|
||||
screen_write("buna ziua", sizeof("buna ziua") - 1);
|
||||
|
||||
serial_init(COM1);
|
||||
serial_write(COM1, "buna ziua", sizeof("buna ziua") - 1);
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
# Upper directories
|
||||
|
||||
ROOT_DIR := ../
|
||||
SCRIPTS_DIR = $(ROOT_DIR)/scripts/
|
||||
|
||||
# Directories containing modules
|
||||
|
||||
MODULE_DIR = $(wildcard */)
|
||||
MODULE_INC_DIR = include/
|
||||
|
||||
MODULE_DIR := $(filter-out $(MODULE_INC_DIR), $(MODULE_DIR))
|
||||
|
||||
# Makefile for each module
|
||||
|
||||
MAKEFILE = $(SCRIPTS_DIR)/Makefile.Module
|
||||
|
||||
all:
|
||||
@echo
|
||||
@$(foreach MODULE, $(MODULE_DIR), \
|
||||
cp $(MAKEFILE) $(MODULE)/Makefile; \
|
||||
$(MAKE) -C $(MODULE); \
|
||||
$(RM) $(MODULE)/Makefile; \
|
||||
echo; \
|
||||
)
|
||||
|
||||
|
||||
clean:
|
||||
@echo
|
||||
@$(foreach MODULE, $(MODULE_DIR), \
|
||||
cp $(MAKEFILE) $(MODULE)/Makefile; \
|
||||
$(MAKE) -C $(MODULE) clean; \
|
||||
$(RM) $(MODULE)/Makefile; \
|
||||
echo; \
|
||||
)
|
Loading…
Reference in New Issue