Makefile (6369B)
1 -include local.mk 2 3 X64 ?= yes 4 5 ifeq ("$(X64)","yes") 6 BITS = 64 7 XOBJS = kobj/vm64.o 8 XFLAGS = -m64 -DX64 -mcmodel=kernel -mtls-direct-seg-refs -mno-red-zone 9 LDFLAGS = -m elf_x86_64 -nodefaultlibs 10 QEMU ?= qemu-system-x86_64 11 else 12 XFLAGS = -m32 13 LDFLAGS = -m elf_i386 -nodefaultlibs 14 QEMU ?= qemu-system-i386 15 endif 16 17 OPT ?= -O0 18 19 OBJS := \ 20 kobj/bio.o\ 21 kobj/console.o\ 22 kobj/exec.o\ 23 kobj/file.o\ 24 kobj/fs.o\ 25 kobj/ide.o\ 26 kobj/ioapic.o\ 27 kobj/kalloc.o\ 28 kobj/kbd.o\ 29 kobj/lapic.o\ 30 kobj/log.o\ 31 kobj/main.o\ 32 kobj/mp.o\ 33 kobj/acpi.o\ 34 kobj/picirq.o\ 35 kobj/pipe.o\ 36 kobj/proc.o\ 37 kobj/spinlock.o\ 38 kobj/string.o\ 39 kobj/swtch$(BITS).o\ 40 kobj/syscall.o\ 41 kobj/sysfile.o\ 42 kobj/sysproc.o\ 43 kobj/timer.o\ 44 kobj/trapasm$(BITS).o\ 45 kobj/trap.o\ 46 kobj/uart.o\ 47 kobj/vectors.o\ 48 kobj/vm.o\ 49 $(XOBJS) 50 51 ifneq ("$(MEMFS)","") 52 # build filesystem image in to kernel and use memory-ide-device 53 # instead of mounting the filesystem on ide1 54 OBJS := $(filter-out kobj/ide.o,$(OBJS)) kobj/memide.o 55 FSIMAGE := fs.img 56 endif 57 58 # Cross-compiling (e.g., on Mac OS X) 59 #TOOLPREFIX = i386-jos-elf- 60 61 # Using native tools (e.g., on X86 Linux) 62 #TOOLPREFIX = 63 64 CC = $(TOOLPREFIX)gcc 65 AS = $(TOOLPREFIX)gas 66 LD = $(TOOLPREFIX)ld 67 OBJCOPY = $(TOOLPREFIX)objcopy 68 OBJDUMP = $(TOOLPREFIX)objdump 69 CFLAGS = -fno-pic -static -fno-builtin -fno-strict-aliasing -Wall -MD -ggdb -fno-omit-frame-pointer 70 CFLAGS += -ffreestanding -fno-common -nostdlib -Iinclude -gdwarf-2 $(XFLAGS) $(OPT) 71 CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) 72 ASFLAGS = -fno-pic -gdwarf-2 -Wa,-divide -Iinclude $(XFLAGS) 73 74 xv6.img: out/bootblock out/kernel.elf fs.img 75 dd if=/dev/zero of=xv6.img count=10000 76 dd if=out/bootblock of=xv6.img conv=notrunc 77 dd if=out/kernel.elf of=xv6.img seek=1 conv=notrunc 78 79 xv6memfs.img: out/bootblock out/kernelmemfs.elf 80 dd if=/dev/zero of=xv6memfs.img count=10000 81 dd if=out/bootblock of=xv6memfs.img conv=notrunc 82 dd if=out/kernelmemfs.elf of=xv6memfs.img seek=1 conv=notrunc 83 84 # kernel object files 85 kobj/%.o: kernel/%.c 86 @mkdir -p kobj 87 $(CC) $(CFLAGS) -c -o $@ $< 88 89 kobj/%.o: kernel/%.S 90 @mkdir -p kobj 91 $(CC) $(ASFLAGS) -c -o $@ $< 92 93 # userspace object files 94 uobj/%.o: user/%.c 95 @mkdir -p uobj 96 $(CC) $(CFLAGS) -c -o $@ $< 97 98 uobj/%.o: ulib/%.c 99 @mkdir -p uobj 100 $(CC) $(CFLAGS) -c -o $@ $< 101 102 uobj/%.o: ulib/%.S 103 @mkdir -p uobj 104 $(CC) $(ASFLAGS) -c -o $@ $< 105 106 out/bootblock: kernel/bootasm.S kernel/bootmain.c 107 @mkdir -p out 108 $(CC) -fno-builtin -fno-pic -m32 -nostdinc -Iinclude -O -o out/bootmain.o -c kernel/bootmain.c 109 $(CC) -fno-builtin -fno-pic -m32 -nostdinc -Iinclude -o out/bootasm.o -c kernel/bootasm.S 110 $(LD) -m elf_i386 -nodefaultlibs -N -e start -Ttext 0x7C00 -o out/bootblock.o out/bootasm.o out/bootmain.o 111 $(OBJDUMP) -S out/bootblock.o > out/bootblock.asm 112 $(OBJCOPY) -S -O binary -j .text out/bootblock.o out/bootblock 113 tools/sign.pl out/bootblock 114 115 out/entryother: kernel/entryother.S 116 @mkdir -p out 117 $(CC) $(CFLAGS) -fno-pic -nostdinc -I. -o out/entryother.o -c kernel/entryother.S 118 $(LD) $(LDFLAGS) -N -e start -Ttext 0x7000 -o out/bootblockother.o out/entryother.o 119 $(OBJCOPY) -S -O binary -j .text out/bootblockother.o out/entryother 120 $(OBJDUMP) -S out/bootblockother.o > out/entryother.asm 121 122 INITCODESRC = kernel/initcode$(BITS).S 123 out/initcode: $(INITCODESRC) 124 @mkdir -p out 125 $(CC) $(CFLAGS) -nostdinc -I. -o out/initcode.o -c $(INITCODESRC) 126 $(LD) $(LDFLAGS) -N -e start -Ttext 0 -o out/initcode.out out/initcode.o 127 $(OBJCOPY) -S -O binary out/initcode.out out/initcode 128 $(OBJDUMP) -S out/initcode.o > out/initcode.asm 129 130 ENTRYCODE = kobj/entry$(BITS).o 131 LINKSCRIPT = kernel/kernel$(BITS).ld 132 out/kernel.elf: $(OBJS) $(ENTRYCODE) out/entryother out/initcode $(LINKSCRIPT) $(FSIMAGE) 133 $(LD) $(LDFLAGS) -T $(LINKSCRIPT) -o out/kernel.elf $(ENTRYCODE) $(OBJS) -b binary out/initcode out/entryother $(FSIMAGE) 134 $(OBJDUMP) -S out/kernel.elf > out/kernel.asm 135 $(OBJDUMP) -t out/kernel.elf | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > out/kernel.sym 136 137 MKVECTORS = tools/vectors$(BITS).pl 138 kernel/vectors.S: $(MKVECTORS) 139 perl $(MKVECTORS) > kernel/vectors.S 140 141 ULIB = uobj/ulib.o uobj/usys.o uobj/printf.o uobj/umalloc.o 142 143 fs/%: uobj/%.o $(ULIB) 144 @mkdir -p fs out 145 $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o $@ $^ 146 $(OBJDUMP) -S $@ > out/$*.asm 147 $(OBJDUMP) -t $@ | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > out/$*.sym 148 149 fs/forktest: uobj/forktest.o $(ULIB) 150 @mkdir -p fs 151 # forktest has less library code linked in - needs to be small 152 # in order to be able to max out the proc table. 153 $(LD) $(LDFLAGS) -N -e main -Ttext 0 -o fs/forktest uobj/forktest.o uobj/ulib.o uobj/usys.o 154 $(OBJDUMP) -S fs/forktest > out/forktest.asm 155 156 out/mkfs: tools/mkfs.c include/fs.h 157 gcc -Werror -Wall -o out/mkfs tools/mkfs.c 158 159 # Prevent deletion of intermediate files, e.g. cat.o, after first build, so 160 # that disk image changes after first build are persistent until clean. More 161 # details: 162 # http://www.gnu.org/software/make/manual/html_node/Chained-Rules.html 163 .PRECIOUS: uobj/%.o 164 165 UPROGS=\ 166 fs/cat\ 167 fs/echo\ 168 fs/forktest\ 169 fs/grep\ 170 fs/init\ 171 fs/kill\ 172 fs/ln\ 173 fs/ls\ 174 fs/mkdir\ 175 fs/rm\ 176 fs/sh\ 177 fs/stressfs\ 178 fs/usertests\ 179 fs/wc\ 180 fs/zombie\ 181 182 fs/README: README 183 @mkdir -p fs 184 cp README fs/README 185 186 fs.img: out/mkfs README $(UPROGS) 187 out/mkfs fs.img README $(UPROGS) 188 189 -include */*.d 190 191 clean: 192 rm -rf out fs uobj kobj 193 rm -f kernel/vectors.S xv6.img xv6memfs.img fs.img .gdbinit 194 195 # run in emulators 196 197 bochs : fs.img xv6.img 198 if [ ! -e .bochsrc ]; then ln -s tools/dot-bochsrc .bochsrc; fi 199 bochs -q 200 201 # try to generate a unique GDB port 202 GDBPORT = $(shell expr `id -u` % 5000 + 25000) 203 # QEMU's gdb stub command line changed in 0.11 204 QEMUGDB = $(shell if $(QEMU) -help | grep -q '^-gdb'; \ 205 then echo "-gdb tcp::$(GDBPORT)"; \ 206 else echo "-s -p $(GDBPORT)"; fi) 207 ifndef CPUS 208 CPUS := 2 209 endif 210 QEMUOPTS = -net none -hda xv6.img -hdb fs.img -smp $(CPUS) -m 512 $(QEMUEXTRA) 211 212 qemu: fs.img xv6.img 213 $(QEMU) -serial mon:stdio $(QEMUOPTS) 214 215 qemu-memfs: xv6memfs.img 216 $(QEMU) xv6memfs.img -smp $(CPUS) 217 218 qemu-nox: fs.img xv6.img 219 $(QEMU) -nographic $(QEMUOPTS) 220 221 .gdbinit: tools/gdbinit.tmpl 222 sed "s/localhost:1234/localhost:$(GDBPORT)/" < $^ > $@ 223 224 qemu-gdb: fs.img xv6.img .gdbinit 225 @echo "*** Now run 'gdb'." 1>&2 226 $(QEMU) -serial mon:stdio $(QEMUOPTS) -S $(QEMUGDB) 227 228 qemu-nox-gdb: fs.img xv6.img .gdbinit 229 @echo "*** Now run 'gdb'." 1>&2 230 $(QEMU) -nographic $(QEMUOPTS) -S $(QEMUGDB) 231