sortix-mirror/kernel/Makefile
Jonas 'Sortie' Termansen 4e86394e3d Fix the kernel having an .init section linked at a high address.
The .init section for global constructors in the kernel is unused at the
moment as the _init function is never invoked, but its existence means
it got linked at 128 MiB on i686. This address isn't mapped by the
kernel and the bootloader requires the machine to have that much
physical memory. Unfortunately that meant the i686 build didn't work on
machines with less than 129 MiB of memory.
2022-01-12 21:19:53 +01:00

246 lines
4.9 KiB
Makefile

SOFTWARE_MEANT_FOR_SORTIX=1
include ../build-aux/platform.mak
include ../build-aux/compiler.mak
include ../build-aux/version.mak
include ../build-aux/dirs.mak
# Default values in case the user doesn't override these variables.
OPTLEVEL?=$(DEFAULT_OPTLEVEL)
CPPFLAGS?=
CXXFLAGS?=$(OPTLEVEL)
# Base compiler options and definitions.
CPPFLAGS:=$(CPPFLAGS) -I. -Iinclude -D__is_sortix_kernel
CXXFLAGS:=$(CXXFLAGS) -Wall -Wextra -ffreestanding -fbuiltin -std=gnu++11 \
-fno-exceptions -fno-rtti
ifeq ($(PANIC_SHORT),1)
CPPFLAGS:=$(CPPFLAGS) -DPANIC_SHORT
endif
ifdef VERSION
CPPFLAGS:=$(CPPFLAGS) -DVERSIONSTR=\"$(VERSION)\"
endif
# Architecture-dependent options and definitions.
BOOTOBJS:=
ifeq ($(CPU),x86)
X86FAMILY:=1
CPUDIR:=$(CPU)
CPUOBJS:=$(CPUDIR)/boot.o
endif
ifeq ($(CPU),x64)
X86FAMILY:=1
CPUDIR:=$(CPU)
CXXFLAGS:=$(CXXFLAGS) -mno-red-zone -mno-mmx -mno-sse -mno-sse2
CPUOBJS:=$(CPUDIR)/boot.o
endif
ifndef CPUDIR
CPUDIR=.
endif
ifdef X86FAMILY
CPUOBJS:=$(CPUOBJS) \
$(CPUDIR)/memorymanagement.o \
x86-family/memorymanagement.o \
$(CPUDIR)/interrupt.o \
x86-family/interrupt.o \
x86-family/ioport.o \
x86-family/pic.o \
x86-family/gdt.o \
x86-family/idt.o \
$(CPUDIR)/syscall.o \
x86-family/cmos.o \
x86-family/time.o \
x86-family/pat.o \
x86-family/float.o \
x86-family/ps2.o \
x86-family/vbox.o \
x86-family/x86-family.o
endif
# Object files that constitute the kernel.
CRTI_OBJ=$(CPUDIR)/crti.o
CRTBEGIN_OBJ=$(shell $(CXX) $(CXXFLAGS) -print-file-name=crtbegin.o)
CRTEND_OBJ=$(shell $(CXX) $(CXXFLAGS) -print-file-name=crtend.o)
CRTN_OBJ=$(CPUDIR)/crtn.o
LIBS=\
-nostdlib \
-lk \
-lgcc \
OBJS=\
$(CPUOBJS) \
addralloc.o \
alarm.o \
clock.o \
com.o \
copy.o \
descriptor.o \
disk/ahci/ahci.o \
disk/ahci/hba.o \
disk/ahci/port.o \
disk/ata/ata.o \
disk/ata/hba.o \
disk/ata/port.o \
disk/node.o \
dnsconfig.o \
dtable.o \
elf.o \
fcache.o \
fs/full.o \
fsfunc.o \
fs/kram.o \
fs/null.o \
fs/random.o \
fs/user.o \
fs/util.o \
fs/zero.o \
gpu/bga/bga.o \
hostname.o \
identity.o \
initrd.o \
inode.o \
interlock.o \
interrupt.o \
ioctx.o \
io.o \
kb/kblayout.o \
kb/ps2.o \
kernelinfo.o \
kernel.o \
kthread.o \
lfbtextbuffer.o \
libk.o \
linebuffer.o \
log.o \
logterminal.o \
memorymanagement.o \
mouse/ps2.o \
mtable.o \
net/fs.o \
net/socket.o \
op-new.o \
panic.o \
partition.o \
pci-mmio.o \
pci.o \
pipe.o \
poll.o \
process.o \
psctl.o \
ptable.o \
pty.o \
random.o \
refcount.o \
registers.o \
resource.o \
scheduler.o \
segment.o \
signal.o \
sockopt.o \
string.o \
syscall.o \
textbuffer.o \
textterminal.o \
thread.o \
time.o \
timer.o \
tty.o \
uart.o \
user-timer.o \
vga.o \
vgatextbuffer.o \
video.o \
vnode.o \
worker.o \
ALLOBJS=\
$(CRTI_OBJ) \
$(OBJS) \
$(CRTN_OBJ) \
end.o
# TODO: The .init section is linked at 128 MiB on i686 and at 4 MiB on x86_64
# which increases the memory requirement (and isn't mapped) and the _init
# function isn't invoked yet in the kernel anyway.
#LINK_OBJECTS=\
#$(CRTI_OBJ) $(CRTBEGIN_OBJ) $(OBJS) $(LIBS) $(CRTN_OBJ) $(CRTEND_OBJ) end.o
LINK_OBJECTS=$(OBJS) $(LIBS) end.o
# Rules and recipes for building the kernel.
all: kernel
kernel: sortix.bin
.PHONY: all kernel headers clean install install-include-dirs install-headers \
install-kernel install-kernel-binary
headers:
# x64 compilation
ifeq ($(CPU),x64)
sortix-x86_64.bin: $(ALLOBJS)
$(CXX) $(CXXFLAGS) -Wl,-Ttext -Wl,100000 -Wl,-z -Wl,max-page-size=0x1000 $(LINK_OBJECTS) -o $@
sortix.bin: sortix-x86_64.bin
$(OBJCOPY) $< -O elf32-i386-sortix $@
endif
# x86 compilation
ifeq ($(CPU),x86)
sortix.bin: $(ALLOBJS)
$(CXX) $(CXXFLAGS) -Wl,-Ttext -Wl,100000 $(LINK_OBJECTS) -o $@
endif
%: %.kblayout
kblayout-compiler --format=sortix-kblayout-1 --compression=none $< -o $@
# TODO: After releasing Sortix 1.1, change --identifier to -i.
kb/default-kblayout.h: kb/default-kblayout
carray -cgHs -t uint8_t -G SORTIX_KB_DEFAULT_KBLAYOUT_H --identifier=default_kblayout $< -o $@
vgafont.h: vgafont.f16
carray -gHs -t uint8_t -G VGAFONT_H --identifier=vgafont $< -o $@
*.cpp */*.cpp */*/*.cpp: | kb/default-kblayout.h vgafont.h
%.o: %.cpp
$(CXX) -c $< -o $@ $(CPPFLAGS) $(CXXFLAGS)
%.o: %.S
$(CXX) -c $< -o $@ $(CPPFLAGS) $(CXXFLAGS)
clean:
rm -f $(ALLOBJS) sortix.bin
rm -f *.bin *.out *.tmp
rm -f *.o */*.o */*/*.o
rm -f kb/default-kblayout kb/default-kblayout.h
rm -f vgafont.h
# Installation into sysroot
install: install-headers install-kernel
install-include-dirs: headers
mkdir -p $(DESTDIR)$(INCLUDEDIR)
install-headers: install-include-dirs headers
cp -RTv include $(DESTDIR)$(INCLUDEDIR)
install-kernel: install-kernel-binary
install-kernel-binary: sortix.bin
mkdir -p $(DESTDIR)$(BOOTDIR)
cp sortix.bin $(DESTDIR)$(BOOTDIR)/sortix.bin