xv6

port of xv6 to x86-64
git clone http://frotz.net/git/xv6.git
Log | Files | Refs | README | LICENSE

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