--------------------------------------------------------
Makefile
--------------------------------------------------------
一,合理地组织文件
我们将散乱的文件归类到不同的文件夹下
整体布局:
boot 目录:
kernel、lib、include 目录:
二,Makefile 初体验
简单而言,Makefile 就是“依赖关系 + 变量”,正确使用变量,确定依赖关系,就已经算是会使用 Makefile 了!
# ----------------------------
# Makefile for boot
# Jack Zheng 11.27
# ----------------------------
# makefile variable ..
ASM = nasm
ASMFLAGS = -I boot/include
# excute the conmand by Target
TINIXBOOT = boot/boot.bin boot/loader.bin
# all phony targets
.PHONY : everything clean all
# default starting position!
everything : $(TINIXBOOT)
clean :
rm -f $(TINIXBOOT)
all : clean everything
boot/boot.bin : boot/boot.asm boot/include/fat12hdr.inc
$(ASM) $(ASMFLAGS) -o $@ $<
boot/loader.bin : boot/loader.asm boot/include/fat12hdr.inc \
boot/include/pm.inc boot/include/lib.inc
$(ASM) $(ASMFLAGS) -o $@ $<
# finish ----------------------------
这个 Makefile 文件会将 boot 目录下的 boot.asm 和 loader.asm 编译为 boot.bin 和 loader.bin!
Make successful!
三,我们要的 Makefile
当把 Makefile 写在父目录(相对)时,我们要安排好目录查找位置,有两种目录需要我们安排:1,文件编译时候依赖的头文件需要我们在编译命令中用 -I 来指定! 2,Makefile 文件本身的查找目录!
# ----------------------------
# Makefile for Tinix
# Jack Zheng 11.27
# ----------------------------
# entry of Tinix
ENTRYPOINT = 0x30400
# offset of Tinix
ENTRYOFFSET = 0x400
# paramters for command!
ASM = nasm
DASM = ndisasm
CC = gcc
LD = ld
ASMBFLAGS = -I boot/include
ASMKFLAGS = -I include -f elf
CFLAGS = -I include -c -fno-builtin
LDFLAGS = -s -Ttext $(ENTRYPOINT)
DASMFLAGS = -u -o $(ENTRYPOINT) -e $(ENTRYOFFSET)
#
TINIXBOOT = boot/boot.bin boot/loader.bin
TINIXKERNEL = kernel.bin
OBJS = kernel/kernel.o kernel/start.o lib/klib.o \
lib/string.o
DASMOUTPUT = kernel.bin.asm
# all phony
.PHONY : everything final image clean clean2 clean3 realclean disasm all buildimg
everything : $(TINIXBOOT) $(TINIXKERNEL)
all : realclean everything
final : all clean
image : final buildimg
# clean the bin file!
realcealn : clean clean2 clean3
# ----
# clean
# ----
clean :
rm -f $(OBJS)
clean2 :
rm -f $(TINIXBOOT)
clean3 :
rm -f $(TINIXKERNEL)
disasm : $(DASM) $(DASMFLAGS) $(TINIXKERNEL) > $(DASMOUTPUT)
# ----
# mount the img and write filr to img , final unmount!
# dir 'mnt' and IMG must exit!
# ----
buildimg :
mount TINIX.IMG ./mnt -o loop
cp -f boot/loader.bin ./mnt
cp -f kernel.bin ./mnt
umount ./mnt
# create boot.bin and loader.bin!
boot/boot.bin : boot/boot.asm boot/include/fat12hdr.inc
$(ASM) $(ASMBFLAGS) -o $@ $<
boot/loader.bin : boot/loader.asm boot/include/fat12hdr.inc boot/include/pm.inc boot/include/lib.inc
$(ASM) $(ASMBFLAGS) -o $@ $<
# create kernel.bin!
$(TINIXKERNEL) : $(OBJS)
$(LD) $(LDFLAGS) -o $(TINIXKERNEL) $(OBJS)
# create obj files!
kernel/kernel.o : kernel/kernel.asm
$(ASM) $(ASMKFLAGS) -o $@ $<
kenel/start.o : kernel/start.c ./include/type.h ./include/const.h ./include/protect.h
$(CC) $(CFLAGS) -o $@ $<
lib/klib.o : lib/klib.asm
$(ASM) $(ASMKFLAGS) -o $@ $<
lib/string.o : lib/string.asm
$(ASM) $(ASMKFLAGS) -o $@ $<
# finish ----------------------------
successful!
运行:
OK,到此我们的 Makefile 告一段落,下一节我们试验将中断建立起来!