|
| 1 | +IMAGE = pipeos.img |
| 2 | +all: $(IMAGE) |
| 3 | + |
| 4 | +# '$(V)' controls whether the lab makefiles print verbose commands (the |
| 5 | +# actual shell commands run by Make), as well as the "overview" commands |
| 6 | +# (such as '+ cc lib/readline.c'). |
| 7 | +# |
| 8 | +# For overview commands only, run 'make all'. |
| 9 | +# For overview and verbose commands, run 'make V=1 all'. |
| 10 | +V = 0 |
| 11 | +ifeq ($(V),1) |
| 12 | +compile = $(CC) $(CPPFLAGS) $(CFLAGS) $(DEPCFLAGS) $(1) |
| 13 | +link = $(LD) $(LDFLAGS) $(1) |
| 14 | +run = $(1) $(3) |
| 15 | +else |
| 16 | +compile = @/bin/echo " " $(2) $< && $(CC) $(CPPFLAGS) $(CFLAGS) $(DEPCFLAGS) $(1) |
| 17 | +link = @/bin/echo " " $(2) $(patsubst %.full,%,$@) && $(LD) $(LDFLAGS) $(1) |
| 18 | +run = @$(if $(2),/bin/echo " " $(2) $(3) &&,) $(1) $(3) |
| 19 | +endif |
| 20 | + |
| 21 | +-include build/rules.mk |
| 22 | + |
| 23 | + |
| 24 | +# Object sets |
| 25 | + |
| 26 | +BOOT_OBJS = $(OBJDIR)/bootstart.o $(OBJDIR)/boot.o |
| 27 | + |
| 28 | +KERNEL_OBJS = $(OBJDIR)/k-exception.o $(OBJDIR)/kernel.o \ |
| 29 | + $(OBJDIR)/k-hardware.o $(OBJDIR)/k-loader.o $(OBJDIR)/lib.o |
| 30 | +KERNEL_LINKER_FILES = link/kernel.ld link/shared.ld |
| 31 | + |
| 32 | +PROCESS_BINARIES = $(OBJDIR)/p-pipewriter $(OBJDIR)/p-pipereader |
| 33 | +PROCESS_BINARIES_FULL = $(patsubst %,%.full,$(PROCESS_BINARIES)) |
| 34 | +PROCESS_LIB_OBJS = $(OBJDIR)/lib.o $(OBJDIR)/process.o |
| 35 | +PROCESS_OBJS = $(patsubst %,%.o,$(PROCESS_BINARIES)) $(PROCESS_LIB_OBJS) |
| 36 | + |
| 37 | + |
| 38 | +# Generic rules for making object files |
| 39 | + |
| 40 | +$(PROCESS_OBJS): $(OBJDIR)/%.o: %.c $(BUILDSTAMPS) |
| 41 | + $(call compile,-O1 -DWEENSYOS_PROCESS -c $< -o $@,COMPILE) |
| 42 | + |
| 43 | +$(OBJDIR)/%.o: %.c $(BUILDSTAMPS) |
| 44 | + $(call compile,-DWEENSYOS_KERNEL -c $< -o $@,COMPILE) |
| 45 | + |
| 46 | +$(OBJDIR)/boot.o: $(OBJDIR)/%.o: boot.c $(BUILDSTAMPS) |
| 47 | + $(call compile,-Os -fomit-frame-pointer -c $< -o $@,COMPILE) |
| 48 | + |
| 49 | +$(OBJDIR)/%.o: %.S $(BUILDSTAMPS) |
| 50 | + $(call compile,-c $< -o $@,ASSEMBLE) |
| 51 | + |
| 52 | + |
| 53 | +# Specific rules for WeensyOS |
| 54 | + |
| 55 | +$(OBJDIR)/kernel.full: $(KERNEL_OBJS) $(PROCESS_BINARIES) $(KERNEL_LINKER_FILES) |
| 56 | + $(call link,-T $(KERNEL_LINKER_FILES) -nostdlib -o $@ $(KERNEL_OBJS) -b binary $(PROCESS_BINARIES),LINK) |
| 57 | + |
| 58 | +$(PROCESS_BINARIES_FULL): \ |
| 59 | +$(OBJDIR)/p-%.full: $(OBJDIR)/p-%.o $(PROCESS_LIB_OBJS) \ |
| 60 | + link/p-%.ld link/shared.ld |
| 61 | + $(call link,-T link/p-$*.ld link/shared.ld -nostdlib -o $@ $< $(PROCESS_LIB_OBJS),LINK) |
| 62 | + |
| 63 | +$(OBJDIR)/%: $(OBJDIR)/%.full |
| 64 | + $(call run,$(OBJDUMP) -S $< >$@.asm) |
| 65 | + $(call run,$(NM) -n $< >$@.sym) |
| 66 | + $(call run,$(OBJCOPY) -j .text -j .rodata -j .data -j .bss $<,STRIP,$@) |
| 67 | + |
| 68 | +$(OBJDIR)/bootsector: $(BOOT_OBJS) link/boot.ld link/shared.ld |
| 69 | + $(call link,-T link/boot.ld link/shared.ld -nostdlib -o $@.full $(BOOT_OBJS),LINK) |
| 70 | + $(call run,$(OBJDUMP) -S $@.full >$@.asm) |
| 71 | + $(call run,$(NM) -n $@.full >$@.sym) |
| 72 | + $(call run,$(OBJCOPY) -S -O binary -j .text $@.full $@) |
| 73 | + |
| 74 | +$(OBJDIR)/mkbootdisk: build/mkbootdisk.c $(BUILDSTAMPS) |
| 75 | + $(call run,$(HOSTCC) -I. -o $(OBJDIR)/mkbootdisk,HOSTCOMPILE,build/mkbootdisk.c) |
| 76 | + |
| 77 | +pipeos.img: $(OBJDIR)/mkbootdisk $(OBJDIR)/bootsector $(OBJDIR)/kernel |
| 78 | + $(call run,$(OBJDIR)/mkbootdisk $(OBJDIR)/bootsector $(OBJDIR)/kernel > $@,CREATE $@) |
| 79 | + |
| 80 | + |
| 81 | +run-%: run-qemu-% |
| 82 | + @: |
| 83 | + |
| 84 | +run-qemu-%: run-$(QEMUDISPLAY)-% |
| 85 | + @: |
| 86 | + |
| 87 | +run-graphic-%: %.img check-qemu |
| 88 | + $(call run,$(QEMU_PRELOAD) $(QEMU) $(QEMUOPT) $(QEMUIMG),QEMU $<) |
| 89 | + |
| 90 | +run-console-%: %.img check-qemu |
| 91 | + $(call run,$(QEMU_PRELOAD) $(QEMU) $(QEMUOPT) -curses $(QEMUIMG),QEMU $<) |
| 92 | + |
| 93 | +run-monitor-%: %.img check-qemu |
| 94 | + $(call run,$(QEMU_PRELOAD) $(QEMU) $(QEMUOPT) -monitor stdio $(QEMUIMG),QEMU $<) |
| 95 | + |
| 96 | +run-gdb-%: run-gdb-$(QEMUDISPLAY)-% |
| 97 | + @: |
| 98 | + |
| 99 | +run-gdb-graphic-%: %.img check-qemu |
| 100 | + $(call run,$(QEMU_PRELOAD) $(QEMU) $(QEMUOPT) -gdb tcp::1234 $(QEMUIMG) &,QEMU $<) |
| 101 | + $(call run,sleep 0.5; gdb -x .gdbinit,GDB) |
| 102 | + |
| 103 | +run-gdb-console-%: %.img check-qemu |
| 104 | + $(call run,$(QEMU_PRELOAD) $(QEMU) $(QEMUOPT) -curses -gdb tcp::1234 $(QEMUIMG),QEMU $<) |
| 105 | + |
| 106 | +run: run-qemu-$(basename $(IMAGE)) |
| 107 | +run-qemu: run-qemu-$(basename $(IMAGE)) |
| 108 | +run-graphic: run-graphic-$(basename $(IMAGE)) |
| 109 | +run-console: run-console-$(basename $(IMAGE)) |
| 110 | +run-monitor: run-monitor-$(basename $(IMAGE)) |
| 111 | +run-quit: run-quit-$(basename $(IMAGE)) |
| 112 | +run-gdb: run-gdb-$(basename $(IMAGE)) |
| 113 | +run-gdb-graphic: run-gdb-graphic-$(basename $(IMAGE)) |
| 114 | +run-gdb-console: run-gdb-console-$(basename $(IMAGE)) |
| 115 | +run-graphic-gdb: run-gdb-graphic-$(basename $(IMAGE)) |
| 116 | +run-console-gdb: run-gdb-console-$(basename $(IMAGE)) |
| 117 | + |
| 118 | + |
| 119 | +# Kill all my qemus |
| 120 | +kill: |
| 121 | + -killall -u $$(whoami) $(QEMU) |
| 122 | + @sleep 0.2; if ps -U $$(whoami) | grep $(QEMU) >/dev/null; then killall -9 -u $$(whoami) $(QEMU); fi |
0 commit comments