Makefile浅尝

【0】README

  • makefile定义: 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要一先编译,哪些文件需要后编译,哪些文件需要重新编译;

    【1】看个荔枝

    这里写图片描述

荔枝解析-Analysis:

loader.bin : loader.asm include/load.inc include/fat12hdr.inc include/pm.inc 
    $(ASM) $(ASMFLAGS) -o $@ $<
  • A1)比如以上这个makefile的最后两行,翻译出来就是:
    • 1)要想得到loader.bin ,需要执行 $(ASM) $(ASMFLAGS) -o $@ $< ;
    • 2) loader.bin 依赖于 以下文件:loader.asm、 include/load.inc 、include/fat12hdr.inc 、include/pm.inc ;
    • 3)当以上依赖文件 有一个比 loader.bin 新时,command 才被执行;
  • A2)那么 $(ASM) $(ASMFLAGS) -o $@ $< 又表示什么呢?

      $@ 代表 target  == loader.bin;
      $< 代表 prerequisites 的第一个名字  == loader.asm;
      所以,这行就等价于 nasm -o loader.bin loader.asm ;
  • A3)后面有冒号的还有:

      # All Phony Targets
      .PHONY : everything clean all
      # Default starting position
      everything : $(TARGET)
      clean :  rm -f $(TARGET) 
      all : clean everything

    everything + clean + all 叫做动作名称而已;
    如果运行 make clean, 将会执行 rm -f ${TARGET} == rm -f boot.bin loader.bin

这里写图片描述

  • A4)make everything == make
    因为 直接输入 make的话,这是 make程序 会从第一个名字所代表的动作开始执行, 而第一个动作名称是everything;

这里写图片描述

  • A5) make 指令, 默认的makefile文件是 Makefile,而如果要指定特定的makefile, 加上-f 参数;如make all -f Makefile.boot ;
  • A6) 对头文件目录的指定 -I include ;
  • A7)当要确定文件的依赖关系时,利用 GCC 提供的参数 -M 可以自动生成依赖关系, 然后将依赖关系copy 到 makefile中就可以了;
  • A8)查找依赖关系 gcc 和 nasm 都是用 参数 -M;
    这里写图片描述

【2】我的 Makefile

  • 2.1)荔枝一,我们只编译boot 文件
    这里写图片描述
  • 2.2)荔枝二,编译boot+loader文件,并将loader拷贝到系统软盘
    这里写图片描述
    这里写图片描述

      ASM             = nasm
      BOOT_T          = boot.bin
      IMAGE_T         = a.img
      LOADER_T        = loader.bin
      .PHONY: image clean build_img
      image : ${BOOT_T} ${LOADER_T} build_img
      clean :
              rm -f $(LOADER_T) ${BOOT_T}           
      # loader : ${LOADER_
      #  boot :       $(BOOT_T)          
      build_img:
              dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc
              sudo mount -o loop a.img /mnt/floppy/
              sudo cp -f loader.bin /mnt/floppy/
              sudo umount /mnt/floppy/      
      boot.bin : boot.asm
              $(ASM) -o $@ $<
      loader.bin: loader.asm
              $(ASM) -o $@ $< 

  • 2.3)荔枝三,编译boot+loader文件,并将loader拷贝到系统软盘 (注意,这里加入了文件依赖)
    这里写图片描述
    这里写图片描述
    这里写图片描述
    这里写图片描述

      ASM             = nasm
        2 ASMDIR          = boot/include/
        3
        4 BOOT_T          = boot/boot.bin
        5
        6 IMAGE_T         = a.img
        7
        8 LOADER_T        = boot/loader.bin
        9
       10 .PHONY: image clean build_img
       11
       12 image : ${BOOT_T} ${LOADER_T} build_img
       13
       14 clean :
       15         rm -f $(LOADER_T) ${BOOT_T}
       16
       17 # loader : ${LOADER_
       18 #  boot :       $(BOOT_T)
       19
       20 build_img:
       21         dd if=boot/boot.bin of=a.img bs=512 count=1 conv=notrunc
       22         sudo mount -o loop a.img /mnt/floppy/
       23         sudo cp -f boot/loader.bin /mnt/floppy/
       24         sudo umount /mnt/floppy/
       25
       26 boot/boot.bin : boot/boot.asm ${ASMDIR}load.inc ${ASMDIR}fat12hdr.inc
       27         $(ASM) -I ${ASMDIR}  -o $@ $<
       28 boot/loader.bin: boot/loader.asm ${ASMDIR}fat12hdr.inc ${ASMDIR}load.inc ${ASMDIR}pm.inc
       29         $(ASM) -I${ASMDIR} -o $@ $<

  • 2.4)荔枝四,编译boot+loader文件,并将loader和os kernel 拷贝到系统软盘
    Alert):本Makefile文件很有代表性,参见https://github.com/pacosonTang/Orange-s-OS/blob/master/Makefile
    这里写图片描述
    这里写图片描述

      ASM  = nasm
    
      ASMDIR   = boot/include/
    
      GCC  = gcc
    
      LD   = ld
    
    
    
      BOOT_T   = boot/boot.bin
    
      IMAGE_T = a.img
    
      LOADER_T = boot/loader.bin
    
      KERNEL_T    = kernel/kernel.o kernel/start.o
    
      LIB_T    = lib/kliba.o lib/string.o
    
      FINAL_T  = kernel/kernel.bin
    
    
    
      .PHONY: image clean build_img
    
    
    
      image : ${BOOT_T} ${LOADER_T} ${KERNEL_T} ${LIB_T} ${FINAL_T} build_img
    
    
    
      clean :
    
      rm -f $(LOADER_T) ${BOOT_T} ${KERNEL_T} ${LIB_T} ${FINAL_T}
    
    
    
      # loader : ${LOADER_
    
      # boot :    $(BOOT_T)
    
    
    
      build_img:
    
      dd if=boot/boot.bin of=a.img bs=512 count=1 conv=notrunc
    
      sudo mount -o loop a.img /mnt/floppy/
    
      sudo cp -f boot/loader.bin /mnt/floppy/
    
      sudo cp -f kernel/kernel.bin /mnt/floppy/
    
      sudo umount /mnt/floppy/
    
    
    
      boot/boot.bin : boot/boot.asm ${ASMDIR}load.inc ${ASMDIR}fat12hdr.inc
    
      $(ASM) -I ${ASMDIR} -o $@ $<
    
      boot/loader.bin: boot/loader.asm ${ASMDIR}fat12hdr.inc ${ASMDIR}load.inc ${ASMDIR}pm.inc
    
      $(ASM) -I ${ASMDIR} -o $@ $<
    
      kernel/kernel.o: kernel/kernel.asm
    
      $(ASM) -f elf -o $@ $<
    
      kernel/start.o: kernel/start.c include/type.h include/const.h include/protect.h
    
      $(GCC) -I include/ -c -fno-builtin -o $@ $<
    
      lib/kliba.o: lib/kliba.asm
    
      $(ASM) -f elf -o $@ $<
    
      lib/string.o: lib/string.asm
    
      $(ASM) -f elf -o $@ $<
    
      kernel/kernel.bin: ${KERNEL_T}
    
      ${LD} -s -Ttext 0x30400 -o $@ ${KERNEL_T} ${LIB_T}

转载于:https://www.cnblogs.com/pacoson/p/4845946.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值