sortix-mirror/kernel/Makefile
Jonas 'Sortie' Termansen 5e7605fad2 Implement threading primitives that truly sleep.
The idle thread is now actually run when the system is idle because it
truly goes idle. The idle thread is made power efficient by using the hlt
instruction rather than a busy loop.

The new futex(2) system call is used to implement fast user-space mutexes,
condition variables, and semaphores. The same backend and design is used as
kutexes for truly sleeping kernel mutexes and condition variables.

The new exit_thread(2) flag EXIT_THREAD_FUTEX_WAKE wakes a futex.

Sleeping on clocks in the kernel now uses timers for true sleep.

The interrupt worker thread now truly sleeps when idle.

Kernel threads are now named.

This is a compatible ABI change.
2021-06-23 22:10:47 +02:00

242 lines
4.6 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
LINK_OBJECTS=\
$(CRTI_OBJ) $(CRTBEGIN_OBJ) $(OBJS) $(LIBS) $(CRTN_OBJ) $(CRTEND_OBJ) 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