冬天OS(五):Makefile

--------------------------------------------------------

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 告一段落,下一节我们试验将中断建立起来!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柔弱胜刚强.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值