OBJS = \
	async.o \
	bio.o \
	bootdata.o \
	cga.o \
	cilk.o \
	condvar.o \
	console.o \
	cpprt.o \
	crange.o \
	e1000.o \
	exec.o \
	file.o \
	fmt.o \
	fs.o \
        idle.o \
	ioapic.o \
	lapic.o \
	hwvm.o \
	hz.o \
	kalloc.o \
	kmalloc.o \
	kbd.o \
	main.o \
	memide.o \
	mp.o \
	net.o \
	pci.o \
	picirq.o \
	pipe.o \
	proc.o \
	gc.o \
        radix.o \
	rnd.o \
	sampler.o \
	sched.o \
        sperf.o \
	spinlock.o \
	swtch.o \
	string.o \
	syscall.o \
	sysfile.o \
	sysproc.o \
	uart.o \
	vm.o \
	trap.o \
	trapasm.o \
	wq.o \
	script.o \
	incbin.o
OBJS := $(addprefix $(O)/kernel/, $(OBJS))

KERN = $(O)/kernel.elf
ALL += $(KERN)

$(O)/kernel/%.o: CFLAGS+=-mcmodel=kernel -DXV6_KERNEL
$(O)/kernel/%.o: CXXFLAGS+=-mcmodel=kernel -DXV6_KERNEL

$(KERN): $(O)/kernel/boot.o $(OBJS) $(LDEPS) kernel/kernel.ld
	@echo "  LD     $@"
	$(Q)mkdir -p $(@D)
	$(Q)$(LD) $(LDFLAGS) -T kernel/kernel.ld -z max-page-size=4096 -e start \
		-o $@ $(O)/kernel/boot.o $(OBJS) -L$(O) $(LFLAGS)

$(O)/kernel/%.o: lib/%.cc
	@echo "  CXX    $@"
	$(Q)mkdir -p $(@D)
	$(Q)$(CXX) $(CXXFLAGS) -c -o $@ $<

$(O)/kernel/incbin.o: ASFLAGS+=-DMAKE_OUT=$(O)
$(O)/kernel/incbin.o: $(O)/kernel/initcode $(O)/kernel/bootother $(O)/fs.img

$(O)/kernel/initcode: TTEXT = 0x0
$(O)/kernel/bootother: TTEXT = 0x7000
$(O)/kernel/%: kernel/%.S
	@echo "  CC     $@"
	$(Q)mkdir -p $(@D)
	$(Q)$(CC) $(CFLAGS) -nostdinc -I. -c $< -o $@.o
	$(Q)$(LD) $(LDFLAGS) -N -e start -Ttext $(TTEXT) -o $@.out $@.o
	$(Q)$(OBJCOPY) -S -O binary $@.out $@

$(O)/kernel/asmdefines.S: kernel/asmdefines.c
	@echo "  CXX    $@"
	$(Q)mkdir -p $(@D)
	$(Q)$(CXX) -S $(CXXFLAGS) -o $@ $<

$(O)/include/asmdefines.h: $(O)/kernel/asmdefines.S
	@echo "  GEN    $@"
	$(Q)mkdir -p $(@D)
	$(Q)sed -n 's/remove\$$//p' $(O)/kernel/asmdefines.S > $@
$(O)/kernel/trapasm.o: $(O)/include/asmdefines.h

.PRECIOUS: $(O)/kernel/%.o
-include $(O)/kernel/*.d
