# # Makefile fragment for JOS kernel. # This is NOT a complete makefile; # you must run GNU make in the top-level directory # where the GNUmakefile is located. # OBJDIRS += kern KERN_LDFLAGS := $(LDFLAGS) -Ttext F0100020 -nostdlib INIT=init ENV=env PMAP=pmap ## Only build files if they exist. ## ## entry.S must be first, so that it's the ## first code in the text segment!!! ## ## Note that we also snatch the use of a couple handy source files ## from the lib directory, to avoid gratuitous code duplication. ## KERN_SRCFILES := kern/entry.S \ kern/$(INIT).c \ kern/console.c \ kern/monitor.c \ kern/$(PMAP).c \ kern/$(ENV).c \ kern/kclock.c \ kern/picirq.c \ kern/trap.c \ kern/trapentry.S \ kern/lab3.S \ kern/sched.c \ kern/syscall.c \ lib/printf.c \ lib/printfmt.c \ lib/readline.c \ lib/string.c KERN_SRCFILES := $(foreach file, $(KERN_SRCFILES), \ $(shell test -f $(file) && echo $(file))) KERN_OBJFILES := $(patsubst %.c, $(OBJDIR)/%.o, \ $(patsubst %.S, $(OBJDIR)/%.o, $(KERN_SRCFILES))) KERN_BINFILES := KERN_BINFILES := $(addprefix $(OBJDIR)/, $(KERN_BINFILES)) # How to build the kernel itself $(OBJDIR)/kern/kernel: $(KERN_OBJFILES) $(KERN_BINFILES) @echo ld $@ @$(LD) -o $@ $(KERN_LDFLAGS) $(KERN_OBJFILES) $(GCC_LIB) -b binary $(KERN_BINFILES) @$(OBJDUMP) -S $@ > $@.asm @$(NM) -n $@ > $@.sym # How to build the Bochs disk image $(OBJDIR)/kern/bochs.img: $(OBJDIR)/kern/kernel $(OBJDIR)/boot/boot @echo mk $(OBJDIR)/kern/bochs.img @dd if=/dev/zero of=$(OBJDIR)/kern/bochs.img~ count=10000 2>/dev/null @dd if=$(OBJDIR)/boot/boot of=$(OBJDIR)/kern/bochs.img~ conv=notrunc 2>/dev/null @dd if=$(OBJDIR)/kern/kernel of=$(OBJDIR)/kern/bochs.img~ seek=1 conv=notrunc 2>/dev/null @mv $(OBJDIR)/kern/bochs.img~ $(OBJDIR)/kern/bochs.img all: $(OBJDIR)/kern/bochs.img