zoukankan      html  css  js  c++  java
  • Makefile浅尝

    【0】README

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

    ##**【1】看个荔枝** ![这里写图片描述](http://img.blog.csdn.net/20150929113435039)

    荔枝解析-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拷贝到系统软盘** ![这里写图片描述](http://img.blog.csdn.net/20150929113531994) ![这里写图片描述](http://img.blog.csdn.net/20150929113541804)
    	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拷贝到系统软盘 (注意,这里加入了文件依赖)** ![这里写图片描述](http://img.blog.csdn.net/20150929113555815) ![这里写图片描述](http://img.blog.csdn.net/20150929113602601) ![这里写图片描述](http://img.blog.csdn.net/20150929113609623) ![这里写图片描述](http://img.blog.csdn.net/20150929113617323)
    	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 ![这里写图片描述](http://img.blog.csdn.net/20150929113633881) ![这里写图片描述](http://img.blog.csdn.net/20150929113640829)
    	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}
  • 相关阅读:
    “孤立”用户
    MongoDB 维护Replica Set
    Design7:数据删除设计
    abap取中值的函数
    REPLACE...IN.....WITH.... 的使用
    ABAP中RETURN与EXIT语句的区别
    在一个程序中调用另一个程序并且传输数据到选择屏幕执行这个程序
    Extract Datasets
    事件
    计算字符串长度的实例
  • 原文地址:https://www.cnblogs.com/pacoson/p/4845946.html
Copyright © 2011-2022 走看看