diff options
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 328 |
1 files changed, 20 insertions, 308 deletions
@@ -1,319 +1,31 @@ -# -# Makefile for the 20245 operating system. -# -######################################## -# Compilation/assembly definable options -######################################## +.PHONY: build clean qemu +.SILENT: -# -# General options: -# CLEAR_BSS include code to clear all BSS space -# GET_MMAP get BIOS memory map via int 0x15 0xE820 -# OS_CONFIG OS-related (vs. just standalone) variations -# FORCE_INLINING force "inline" functions to be inlined even if -# we aren't compiling with at least -O2 -# MAKE_IDENTITY_MAP Compile vmtables.c with an "identity" page -# map table for the first 4MB of the address space. -# +QEMU = qemu-system-i386 +QEMUOPTS = -drive file=bin/disk.img,index=0,media=disk,format=raw -GEN_OPTIONS = -DCLEAR_BSS -DGET_MMAP -DOS_CONFIG - -# -# Debugging options: -# ANNOUNCE_ENTRY announce entry and exit from kernel functions -# RPT_INT_UNEXP report any 'unexpected' interrupts -# RPT_INT_MYSTERY report interrupt 0x27 specifically -# TRACE_CX context restore tracing -# SANITY=n enable "sanity check" level 'n' (0/1/2/3/4) -# T_* tracing options (see below) -# -# Some modules have their own internal debugging options, described -# in their introductory comments. -# -# Define SANITY as 0 for minimal runtime checking (critical errors only). -# If not defined, SANITY defaults to 9999. -# - -DBG_OPTIONS = -DRPT_INT_UNEXP -# DBG_OPTIONS += -DTRACE_CX - -# -# T_ options are used to define bits in a "tracing" bitmask, to allow -# checking of individual conditions. The following are defined: -# -# T_PCB PCB alloc/dealloc -# T_VM VM-related tasks -# T_QUE PCB queue manipulation -# T_SCH, T_DSP Scheduler and dispatcher -# T_SCALL, T_SRET System call entry and exit -# T_EXIT Process exit actions -# T_FORK, T_EXEC Fork and exec actions -# T_INIT Module init function tracing -# T_KM, T_KMFR, T_KMIN Kmem module tracing -# T_SIO, T_SIOR, T_SIOW General SIO module checks -# T_USER, T_ELF User module operations -# -# You can add compilation options "on the fly" by using EXTRAS=thing -# on the command line. For example, to compile with -H (to show the -# hierarchy of #includes): -# -# make EXTRAS=-H -# - -TRACE_OPTIONS = -DT_INIT -DT_USER -DT_ELF -DT_KMIN -DT_VM - -USER_OPTIONS = $(GEN_OPTIONS) $(DBG_OPTIONS) $(TRACE_OPTIONS) $(EXTRAS) - -############################################################## -# YOU SHOULD NOT NEED TO CHANGE ANYTHING BELOW THIS POINT!!! # -############################################################## - -# -# Compilation/assembly control -# - -# -# We only want to include from the common header directory -# -INCLUDES = -I./include - -# -# All our object code will live here -# -BUILDDIR = build -LIBDIR = $(BUILDDIR)/lib - -# -# Things we need to convert to object form -# -SUBDIRS := - -# -# Compilation/assembly/linking commands and options -# -CPP = cpp -CPPFLAGS = $(USER_OPTIONS) -nostdinc $(INCLUDES) - -# -# Compiler/assembler/etc. settings for 32-bit binaries -# -CC = gcc -pipe -CFLAGS = -m32 -fno-pie -std=c99 -fno-stack-protector -fno-builtin -Wall -Wstrict-prototypes -MD $(CPPFLAGS) -# CFLAGS += -O2 - -AS = as -ASFLAGS = --32 - -LD = ld -LDFLAGS = -melf_i386 -no-pie -nostdlib -L$(LIBDIR) - -AR = ar -#ARFLAGS = rvU -ARFLAGS = rsU - -# other programs we use -OBJDUMP = objdump -OBJCOPY = objcopy -NM = nm -READELF = readelf -PERL = perl - -# delete target files if there is an error, or if make is interrupted -.DELETE_ON_ERROR: - -# don't delete intermediate files -.PRECIOUS: %.o $(BUILDDIR)/boot/%.o $(BUILDDIR)/kernel/%.o \ - $(BUILDDIR)/lib/%.o $(BUILDDIR)/user/%.o - -# -# Update $(BUILDDIR)/.vars.X if variable X has changed since the last time -# 'make' was run. -# -# Rules that use variable X should depend on $(BUILDDIR)/.vars.X. If -# the variable's value has changed, this will update the vars file and -# force a rebuild of the rule that depends on it. -# - -$(BUILDDIR)/.vars.%: FORCE - echo "$($*)" | cmp -s $@ || echo "$($*)" > $@ - -.PRECIOUS: $(BUILDDIR)/.vars.% - -.PHONY: FORCE - -# -# Transformation rules - these ensure that all necessary compilation -# flags are specified -# -# Note use of 'cpp' to convert .S files to temporary .s files: this allows -# use of #include/#define/#ifdef statements. However, the line numbers of -# error messages reflect the .s file rather than the original .S file. -# (If the .s file already exists before a .S file is assembled, then -# the temporary .s file is not deleted. This is useful for figuring -# out the line numbers of error messages, but take care not to accidentally -# start fixing things by editing the .s file.) -# -# The .c.X rule produces a .X file which contains the original C source -# code from the file being compiled mixed in with the generated -# assembly language code. Can be helpful when you need to figure out -# exactly what C statement generated which assembly statements! -# - -.SUFFIXES: .S .b .X .i - -.c.X: - $(CC) $(CFLAGS) -g -c -Wa,-adhln $*.c > $*.X - -.c.s: - $(CC) $(CFLAGS) -S $*.c - -#.S.s: -# $(CPP) $(CPPFLAGS) -o $*.s $*.S - -#.S.o: -# $(CPP) $(CPPFLAGS) -o $*.s $*.S -# $(AS) $(ASFLAGS) -o $*.o $*.s -a=$*.lst -# $(RM) -f $*.s - -.s.b: - $(AS) $(ASFLAGS) -o $*.o $*.s -a=$*.lst - $(LD) $(LDFLAGS) -Ttext 0x0 -s --oformat binary -e begtext -o $*.b $*.o - -#.c.o: -# $(CC) $(CFLAGS) -c $*.c - -.c.i: - $(CC) -E $(CFLAGS) -c $*.c > $*.i - -# -# Location of the QEMU binary -# -QEMU = /home/course/csci352/bin/qemu-system-i386 - -# try to generate a unique GDB port -GDBPORT = $(shell expr `id -u` % 5000 + 25000) - -# QEMU's gdb stub command line changed in 0.11 -QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \ - then echo "-gdb tcp::$(GDBPORT)"; \ - else echo "-s -p $(GDBPORT)"; fi) - -# options for QEMU -# -# run 'make' with -DQEMUEXTRA=xxx to add option 'xxx' when QEMU is run -# -# does not include a '-serial' option, as that may or may not be needed -QEMUOPTS = -drive file=disk.img,index=0,media=disk,format=raw $(QEMUEXTRA) - -######################################## -# RULES SECTION -######################################## - -# -# All the individual parts -# - -# -# We have a bit of a chicken/egg problem here. When we create the -# user.img file, a new version of include/userids.h is generated -# in build/new_userids.h; this is compared to the existing userids.h -# file, and if they differ, it is copied into include/userids.h. -# This, unfortunately, should trigger a rebuild of anything that -# includes <userids.h>, but that is all of the user/*.c files along -# with kernel/kernel.c. We could move the user.img creation earlier, -# which would automatically be incorporated into the build of the -# kernel, but it wouldn't automatically trigger recreating the -# userland stuff. We settle for having the build process tell the -# user that a rebuild is required. -# - -all: lib bootstrap kernel userland util user.img disk.img - -# Rules etc. for the various sections of the system -include lib/Make.mk -include boot/Make.mk -include user/Make.mk -include kernel/Make.mk -include util/Make.mk - -# -# Rules for building the disk image -# - -disk.img: $(BUILDDIR)/kernel/kernel.b $(BUILDDIR)/boot/boot user.img BuildImage - ./BuildImage -d usb -o disk.img -b $(BUILDDIR)/boot/boot \ - $(BUILDDIR)/kernel/kernel.b 0x10000 \ - user.img 0x30000 - -# -# Rules for running with QEMU -# - -# how to create the .gdbinit config file if we need it -.gdbinit: util/gdbinit.tmpl - sed "s/localhost:1234/localhost:$(GDBPORT)/" < $^ > $@ - -# "ordinary" gdb -gdb: - gdb -q -n -x .gdbinit - -# gdb with the super-fancy Text User Interface -gdb-tui: - gdb -q -n -x .gdbinit -tui - -qemu: disk.img +qemu: bin/disk.img $(QEMU) -serial mon:stdio $(QEMUOPTS) -qemu-nox: disk.img - $(QEMU) -nographic $(QEMUOPTS) - -qemu-gdb: disk.img .gdbinit - @echo "*** Now run 'gdb'." 1>&2 - $(QEMU) -serial mon:stdio $(QEMUOPTS) -S $(QEMUGDB) - -qemu-nox-gdb: disk.img .gdbinit - @echo "*** Now run 'gdb'." 1>&2 - $(QEMU) -nographic $(QEMUOPTS) -S $(QEMUGDB) - -# -# Create a printable namelist from the kernel file -# -# kernel.nl: only global symbols -# kernel.nll: all symbols -# - -kernel.nl: $(BUILDDIR)/kernel/kernel - nm -Bng $(BUILDDIR)/kernel/kernel.o | pr -w80 -3 > kernel.nl - -kernel.nll: $(BUILDDIR)/kernel/kernel - nm -Bn $(BUILDDIR)/kernel/kernel.o | pr -w80 -3 > kernel.nll - -# -# Generate a disassembly -# - -kernel.dis: $(BUILDDIR)/kernel/kernel - objdump -d $(BUILDDIR)/kernel/kernel > kernel.dis - -# -# Cleanup etc. -# clean: - rm -rf $(BUILDDIR) .gdbinit *.nl *.nll *.lst *.i *.X *.dis + rm -fr .zig-cache + rm -fr bin + +build: + zig build -realclean: clean - rm -f LOG *.img $(UTIL_BIN) +bin/boot.bin: build + cd bin && \ + objcopy -S -O binary -j .text boot boot.bin -# -# Automatically generate dependencies for header files included -# from C source files. -# -$(BUILDDIR)/.deps: $(foreach dir, $(SUBDIRS), $(wildcard $(BUILDDIR)/$(dir)/*.d)) - @mkdir -p $(@D) - $(PERL) util/mergedep.pl $@ $^ +bin/user.img: build + cd bin && \ + ./mkblob init shell --include $(BUILDDIR)/.deps +bin/disk.img: build bin/boot.bin bin/user.img + cd bin && \ + ./BuildImage -d usb -o disk.img -b boot.bin \ + kernel 0x10000 user.img 0x40000 -.PHONY: all clean realclean |