【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}

Makefile浅尝的更多相关文章

  1. 浅尝ECMAScript6

    浅尝ECMAScript6 简介 ECMAScript6 是最新的ECMAScript标准,于2015年6月正式推出(所以也称为ECMAScript 2015),相比于2009年推出的es5, es6 ...

  2. 浅尝key-value数据库(二)——MongoDB的优与劣

    浅尝key-value数据库(二)——MongoDB的优与劣 MongoDB的名字取自英文单词"humongous"的中间五个字母,是一个C++开发的基于分布式文件存储的数据库开源 ...

  3. 浅尝key-value数据库(三)——MongoDB的分布式

    浅尝key-value数据库(三)——MongoDB的分布式 测试了单机MongoDB的随机读和写入性能,这一节来讲一讲MongoDB的分布式. MongoDB的分布式分成两种,一种是Replicat ...

  4. 浅尝key-value数据库(一)——一览NoSQL

    浅尝key-value数据库(一)——一览NoSQL 最近由于一个项目的关系,研究了一下key-value数据库这个最近很火的概念.本系列从项目需求的角度分析并测试了几个key-value数据库的性能 ...

  5. Python图形界面开发编程:wxPython(浅尝篇)

    Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 ...

  6. 浅尝Go语言GC

    大家好,我是小栈君,因为个人和工作的缘故,所以拖更了一点时间,但是关于拖更的内容小栈君会在后续的时间中补回来,还希望大家继续支持和关注小栈君.当然,在国内疫情稍微减缓的情况下,小栈君在这里也多说两句, ...

  7. 浅尝装饰器和AOP

    [写在前面] 参考文章:https://www.cnblogs.com/huxi/archive/2011/03/01/1967600.html[从简单的例子入手进行讲解,由浅入深,很到位] 装饰器部 ...

  8. 浅尝Spring注解开发_自定义注册组件、属性赋值、自动装配

    Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含自定义扫描组件.自定义导入组件.手动注册组件.自动注入方法和参数.使用Spring容器底层组件等 配置 @Confi ...

  9. 浅尝Spring注解开发_Bean生命周期及执行过程

    Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含Bean生命周期.自定义初始化方法.Debug BeanPostProcessor执行过程及在Spring底层中的应 ...

随机推荐

  1. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---26

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  2. C#执行CMD命令并接收返回结果的实现方法

    using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using ...

  3. CentOS 7下安装配置FTP

    安装vsftpd yum install -y vsftpd 编辑ftp配置文件 vi /etc/vsftpd/vsftpd.conf anonymous_enable=NO #anonymous_e ...

  4. EOJ Monthly 2018.7

    准备继续大学acm啦 又要开始愉快的码码码啦 第一次在华东师大OJ上面做题 看来EOJ上的积分体质是假的,我怎么一把上红??? A.数三角形 神tm的防AK题放在A,出题人很不友好啊... 先写了个暴 ...

  5. codeigniter 使用

    CodeIgniter系列 记录count和分页 对于某个表的不带条件的count,可以简单的用 $total = $this->db->count_all($table_name) 来获 ...

  6. Jsp2.0自定义标签(第三天)——EL表达式的使用

    1.提出问题: 我们经常会看到这样的jsp页面代码: 浏览器显示: 为什么会在页面输出:Hello World  ,${per}究竟是如何找到“Hello World”的呢? 2.分析问题: 要想解决 ...

  7. iOS7自定义back按钮和pop交互手势

    Clambake for iPhone有一个回退按钮在所有的导航条上.这是一个简单的没有文字箭头. 实现一个自定义按钮是简单的.类似这个设置controller 的navigationItem一个le ...

  8. weblogic的集群与配置图文

      一.Weblogic的集群 还记得我们在第五天教程中讲到的关于Tomcat的集群吗? 两个tomcat做node即tomcat1, tomcat2,使用Apache HttpServer做请求派发 ...

  9. 12.【nuxt起步】-接口请求重构

    用store把api数据交互部分重构出来,让前端更轻一点 新建 /store/gettter.js /store/actions.js /server/config/index.js Index.js ...

  10. Mockito图书馆

    转载:https://static.javadoc.io/org.mockito/mockito-core/2.12.0/org/mockito/Mockito.html#42 org.mockito ...