【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. 反射的基本使用以及原理(Class获取方式)

    1.什么是反射技术? 动态获取指定类以及类中的内容(成员),并运行其内容. 应用程序已经运行,无法在其中进行new对象的建立,就无法使用对象.这时可以根据配置文件的类全名去找对应的字节码文件,并加载进 ...

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

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

  3. AC日记——3的幂的和 51nod 1013

    3的幂的和 思路: 矩阵快速幂:   sn-1      3 1        sn   *          = 1     0 1  1 来,上代码: #include <cstdio> ...

  4. 洛谷——P2205 [USACO13JAN]画栅栏Painting the Fence

    题目描述 Farmer John has devised a brilliant method to paint the long fence next to his barn (think of t ...

  5. Careercup | Chapter 1

    1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot us ...

  6. Google Cloud服务免费申请试用以及使用教程

    简介 Google Cloud Platform lets you build and host applications and websites, store data, and analyze ...

  7. 如何使用Ext.create() 调用一个窗体

    Ext.define("Scripts.Code.QM.OutgoingQuality.OQC.ReinspRequest.view.DefectContentsDetailInfoWind ...

  8. ios notification

    apps can use local or push notifications to let people know when interesting things happen, such as: ...

  9. 让arclist标签也支持currentstyle属性 完美解决

    1.查找到: $channelid = $ctag->GetAtt('channelid'); 在下面插入:$currentstyle = $ctag->GetAtt('currentst ...

  10. JSON API:用 JSON 构建 API 的标准指南中文版

    译文地址:https://github.com/justjavac/json-api-zh_CN 假设你和你的团队以前争论过使用什么方式构建合理 JSON 响应格式, 那么 JSON API 就是你的 ...