1*5df5d799SfslongjinSUBDIR_ROOTS := . 2ead838bfSfslongjinDIRS := . $(shell find $(SUBDIR_ROOTS) -type d) 340a551d1SfslongjinGARBAGE_PATTERNS := *.o *.s~ *.s *.S~ *.c~ *.h~ kernel 4ead838bfSfslongjinGARBAGE := $(foreach DIR,$(DIRS),$(addprefix $(DIR)/,$(GARBAGE_PATTERNS))) 5f479f321Sfslongjin 640a551d1SfslongjinDIR_LIB=lib 740a551d1Sfslongjinlib_patterns := *.a 840a551d1SfslongjinLIB_FILES := $(foreach DIR,$(DIR_LIB),$(addprefix $(DIR)/,$(lib_patterns))) 959b4e6f6Sfslongjin 100e8bf69dSfslongjin 11574f3232Sfslongjin# 控制操作系统使用的中断控制器 _INTR_8259A_ _INTR_APIC_ 12574f3232SfslongjinPIC := _INTR_APIC_ 13*5df5d799SfslongjinCFLAGS = $(GLOBAL_CFLAGS) -D $(PIC) -I $(shell pwd) 14574f3232Sfslongjin 1559b4e6f6SfslongjinASFLAGS := --64 1659b4e6f6Sfslongjin 17279de4c7SfslongjinLD_LIST := head.o 18279de4c7SfslongjinOBJ_LIST := head.o 19f479f321Sfslongjin 20279de4c7Sfslongjin 21*5df5d799Sfslongjinkernel_subdirs := common/libELF 22*5df5d799Sfslongjin 23*5df5d799Sfslongjin 24*5df5d799Sfslongjin 25*5df5d799Sfslongjin 26f479f321Sfslongjin 27f479f321Sfslongjinhead.o: head.S 28f479f321Sfslongjin gcc -E head.S > head.s # 预处理 2959b4e6f6Sfslongjin as $(ASFLAGS) -o head.o head.s 30d9d83335Sfslongjin#gcc -mcmodel=large -fno-builtin -m64 -c head.S -o head.o 31f479f321Sfslongjin 3206cfb1ceSfslongjinentry.o: exception/entry.S 3306cfb1ceSfslongjin gcc -E exception/entry.S > exception/entry.s 3459b4e6f6Sfslongjin as $(ASFLAGS) -o exception/entry.o exception/entry.s 3506cfb1ceSfslongjin 364473ff59Sfslongjinprocs.o: process/proc.S 374473ff59Sfslongjin gcc -E process/proc.S > process/proc.s 384473ff59Sfslongjin as $(ASFLAGS) -o process/procs.o process/proc.s 394473ff59Sfslongjin 40eff673edSfslongjin 41eff673edSfslongjin 42ead838bfSfslongjinmain.o: main.c 43ead838bfSfslongjin# -fno-builtin: 不使用C语言内建函数 44ead838bfSfslongjin# The -m64 option sets int to 32bits and long and pointer to 64 bits and generates code for AMD’s x86-64 architecture. 4559b4e6f6Sfslongjin gcc $(CFLAGS) -c main.c -o main.o 46ead838bfSfslongjin 47ead838bfSfslongjin 48ead838bfSfslongjinprintk.o: common/printk.c 4959b4e6f6Sfslongjin gcc $(CFLAGS) -c common/printk.c -o common/printk.o 5006cfb1ceSfslongjin 5106cfb1ceSfslongjintrap.o: exception/trap.c 5259b4e6f6Sfslongjin gcc $(CFLAGS) -c exception/trap.c -o exception/trap.o 5340a551d1Sfslongjin 54eff673edSfslongjinirq.o: exception/irq.c 5559b4e6f6Sfslongjin gcc $(CFLAGS) -c exception/irq.c -o exception/irq.o 56eff673edSfslongjin 57d5eb9e8aSfslongjin 58eff673edSfslongjin 5940a551d1Sfslongjinmm.o: mm/mm.c 6059b4e6f6Sfslongjin gcc $(CFLAGS) -c mm/mm.c -o mm/mm.o 61ead838bfSfslongjin 6236ad7a10Sfslongjinslab.o: mm/slab.c 6336ad7a10Sfslongjin gcc $(CFLAGS) -c mm/slab.c -o mm/slab.o 6436ad7a10Sfslongjin 6567633eb0Sfslongjinprocess.o: process/process.c 6659b4e6f6Sfslongjin gcc $(CFLAGS) -c process/process.c -o process/process.o 6705dc7ac7Sfslongjin 6805dc7ac7Sfslongjinsched.o: sched/sched.c 6905dc7ac7Sfslongjin gcc $(CFLAGS) -c sched/sched.c -o sched/sched.o 7005dc7ac7Sfslongjin 71d3a5048fSfslongjinsyscall.o: syscall/syscall.c 7259b4e6f6Sfslongjin gcc $(CFLAGS) -c syscall/syscall.c -o syscall/syscall.o 7367633eb0Sfslongjin 7460dc9f49Sfslongjinsmp.o: smp/smp.c 7560dc9f49Sfslongjin gcc $(CFLAGS) -c smp/smp.c -o smp/smp.o 760b0cce93Sfslongjin 775197253dSfslongjinapu_boot.o: smp/apu_boot.S 785197253dSfslongjin gcc -E smp/apu_boot.S > smp/apu_boot.s # 预处理 795197253dSfslongjin as $(ASFLAGS) -o smp/apu_boot.o smp/apu_boot.s 805197253dSfslongjin 81ad51f8b6Sfslongjincpu.o: common/cpu.c 82ad51f8b6Sfslongjin gcc $(CFLAGS) -c common/cpu.c -o common/cpu.o 83ad51f8b6Sfslongjin 849828aff9Sfslongjinsoftirq.o: exception/softirq.c 859828aff9Sfslongjin gcc $(CFLAGS) -c exception/softirq.c -o exception/softirq.o 869828aff9Sfslongjin 87979bb355Sfslongjinfat32.o: filesystem/fat32/fat32.c 88979bb355Sfslongjin gcc $(CFLAGS) -c filesystem/fat32/fat32.c -o filesystem/fat32/fat32.o 89979bb355Sfslongjin 909b382dabSfslongjinMBR.o: filesystem/MBR.c 919b382dabSfslongjin gcc $(CFLAGS) -c filesystem/MBR.c -o filesystem/MBR.o 929b382dabSfslongjin 937d3c1b09SfslongjinVFS.o: filesystem/VFS/VFS.c 947d3c1b09Sfslongjin gcc $(CFLAGS) -c filesystem/VFS/VFS.c -o filesystem/VFS/VFS.o 957d3c1b09Sfslongjin 96279de4c7Sfslongjin# IPI的代码 97edb21695Sfslongjinifeq ($(ARCH), __x86_64__) 98279de4c7SfslongjinOBJ_LIST += ipi.o 99279de4c7SfslongjinLD_LIST += arch/x86_64/x86_64_ipi.o 100279de4c7Sfslongjinipi.o: arch/x86_64/x86_64_ipi.c 101279de4c7Sfslongjin gcc $(CFLAGS) -c arch/x86_64/x86_64_ipi.c -o arch/x86_64/x86_64_ipi.o 102279de4c7Sfslongjin 103279de4c7Sfslongjinendif 104279de4c7Sfslongjin 105d5eb9e8aSfslongjin# 驱动程序 106574f3232Sfslongjin# 中断处理芯片的驱动程序 107e64be7b4Sfslongjinifeq ($(PIC), _INTR_8259A_) 108574f3232Sfslongjinpic.o: driver/interrupt/8259A/8259A.c 109574f3232Sfslongjin gcc $(CFLAGS) -c driver/interrupt/8259A/8259A.c -o driver/interrupt/pic.o 110e64be7b4Sfslongjinelse 111574f3232Sfslongjinpic.o: driver/interrupt/apic/apic.c 112574f3232Sfslongjin gcc $(CFLAGS) -c driver/interrupt/apic/apic.c -o driver/interrupt/pic.o 113574f3232Sfslongjinendif 114574f3232Sfslongjin 115574f3232Sfslongjinmultiboot2.o: driver/multiboot2/multiboot2.c 116574f3232Sfslongjin gcc $(CFLAGS) -c driver/multiboot2/multiboot2.c -o driver/multiboot2/multiboot2.o 117574f3232Sfslongjin 118e64be7b4Sfslongjinacpi.o: driver/acpi/acpi.c 119e64be7b4Sfslongjin gcc $(CFLAGS) -c driver/acpi/acpi.c -o driver/acpi/acpi.o 120e64be7b4Sfslongjin 12171d6af78Sfslongjinps2_keyboard.o: driver/keyboard/ps2_keyboard.c 12271d6af78Sfslongjin gcc $(CFLAGS) -c driver/keyboard/ps2_keyboard.c -o driver/keyboard/ps2_keyboard.o 123832442afSfslongjin 12471d6af78Sfslongjinps2_mouse.o: driver/mouse/ps2_mouse.c 12571d6af78Sfslongjin gcc $(CFLAGS) -c driver/mouse/ps2_mouse.c -o driver/mouse/ps2_mouse.o 126b3cbd3caSfslongjin 127046bce39Sfslongjinata.o: driver/disk/ata.c 128046bce39Sfslongjin gcc $(CFLAGS) -c driver/disk/ata.c -o driver/disk/ata.o 129046bce39Sfslongjin 13008fa7b53Sfslongjinpci.o: driver/pci/pci.c 13108fa7b53Sfslongjin gcc $(CFLAGS) -c driver/pci/pci.c -o driver/pci/pci.o 13208fa7b53Sfslongjin 133741aa09bSfslongjinahci.o: driver/disk/ahci/ahci.c 134741aa09bSfslongjin gcc $(CFLAGS) -c driver/disk/ahci/ahci.c -o driver/disk/ahci/ahci.o 135741aa09bSfslongjin 136401df84dSfslongjinrtc.o: driver/timers/rtc/rtc.c 137401df84dSfslongjin gcc $(CFLAGS) -c driver/timers/rtc/rtc.c -o driver/timers/rtc/rtc.o 138401df84dSfslongjin 139d887f9a0SfslongjinHPET.o: driver/timers/HPET/HPET.c 140d887f9a0Sfslongjin gcc $(CFLAGS) -c driver/timers/HPET/HPET.c -o driver/timers/HPET/HPET.o 141d887f9a0Sfslongjin 1429828aff9Sfslongjintimer.o: driver/timers/timer.c 1439828aff9Sfslongjin gcc $(CFLAGS) -c driver/timers/timer.c -o driver/timers/timer.o 1449828aff9Sfslongjin 14522359344SfslongjinOBJ_LIST += uart.o 14622359344SfslongjinLD_LIST += driver/uart/uart.o 14722359344Sfslongjinuart.o: driver/uart/uart.c 14822359344Sfslongjin gcc $(CFLAGS) -c driver/uart/uart.c -o driver/uart/uart.o 14922359344Sfslongjin 150b3cbd3caSfslongjin 151279de4c7Sfslongjinall: kernel 152*5df5d799Sfslongjin 153*5df5d799Sfslongjin ld -b elf64-x86-64 -z muldefs -o kernel head.o main.o $(shell find . -name "*.o") -T link.lds 154279de4c7Sfslongjin objcopy -I elf64-x86-64 -O elf64-x86-64 -R ".comment" -R ".eh_frame" kernel ../bin/kernel/kernel.elf 155279de4c7Sfslongjin 1564473ff59Sfslongjinkernel: head.o entry.o procs.o main.o printk.o trap.o mm.o slab.o irq.o pic.o process.o sched.o syscall.o multiboot2.o cpu.o acpi.o ps2_keyboard.o ps2_mouse.o ata.o pci.o ahci.o smp.o apu_boot.o rtc.o HPET.o softirq.o timer.o fat32.o MBR.o VFS.o $(OBJ_LIST) 157*5df5d799Sfslongjin 158*5df5d799Sfslongjin @list='$(kernel_subdirs)'; for subdir in $$list; do \ 159*5df5d799Sfslongjin echo "make all in $$subdir";\ 160*5df5d799Sfslongjin cd $$subdir;\ 161*5df5d799Sfslongjin $(MAKE) all CFLAGS="$(CFLAGS)";\ 162*5df5d799Sfslongjin cd ..;\ 163*5df5d799Sfslongjin done 164*5df5d799Sfslongjin 165*5df5d799Sfslongjin 166279de4c7Sfslongjin 167279de4c7Sfslongjin 168f479f321Sfslongjinclean: 169ead838bfSfslongjin rm -rf $(GARBAGE)