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 -fcheck-new 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 \ crc32.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/arp.o \ net/em/em.o \ net/ether.o \ net/fs.o \ net/if.o \ net/ip.o \ net/lo/lo.o \ net/packet.o \ net/ping.o \ net/socket.o \ net/tcp.o \ net/udp.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