码迷,mamicode.com
首页 > 系统相关 > 详细

Linux内核系列—12.e.操作系统开发之Makefile

时间:2016-04-20 21:32:56      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

先来看一个简单的Makefile,我们把它放在目录/boot下,可以用来编译boot.bin和loader.bin。

# Makefile for boot

# Programs, flags, etc.
ASM		= nasm
ASMFLAGS	= -I include/

# This Program
TARGET		= boot.bin loader.bin

# All Phony Targets
.PHONY : everything clean all

# Default starting position
everything : $(TARGET)

clean :
	rm -f $(TARGET)

all : clean everything

boot.bin : boot.asm include/load.inc include/fat12hdr.inc
	$(ASM) $(ASMFLAGS) -o $@ $<

loader.bin : loader.asm include/load.inc include/fat12hdr.inc include/pm.inc
	$(ASM) $(ASMFLAGS) -o $@ $<

以字符#开头的行是注释。=用来定义变量,这里的ASM和ASMFLAGS就是两个变量,要注意的是,使用它们的时候要用$(ASM)和$(ASMFLAGS),而不是它们的原型。

.PHONY暂时不管,来看一下Makefile的最重要的语法:

target : prerequisites
            command

上面这样的形式代表两层意思:

1.要想得到target,需要执行命令command。

2.target依赖prerequisites,当prerequisites中至少有一个文件比target文件新时,command才被执行。

比如这个Makefile的最后两行,翻译出来就是:

1.要想得到loader.bin,需要执行“$(ASM) $(ASMFLAGS) -o $@ $<”。

2.loader.bin依赖于以下文件:

a.loader.asm

b.include/load.inc

c.include/pm.inc

d.include/fat12hdr.inc

当它们中至少有一个比loader.bin新时,command被执行。

$@代表target;$<代表prerequisites的第一个名字。联系前面我们说过的$(ASM)和$(ASMFLAGS),这个命令行便等价于:

nasm -o loader.bin loader.asm

在Makefile中我们容易注意到,不但boot.bin和loader.bin两个文件后面有冒号,everything、clean和all后面也有冒号,可是它们3个并不是3个文件,仅仅是动作名称而已。如果运行“make clean”,将会执行“rm -f $(TARGET)”,也即“rm -f boot.bin loader.bin”。

all后面跟着的是clean和everything,这表明如果执行“make all”,clean和everything所表示的动作将分别被执行。下面就是make all执行的结果:

>make all

rm -f boot.bin loader.bin

nasm -I include/ -o boot.bin boot.asm

nasm -I include/ -o loader.bin loader.asm

刚才的关键字.PHONY,其实是表示它后面的名字并不是文件,而仅仅是一种行为的标号。

 

未完。。。

 

编译方法:

make

make image

运行结果:

技术分享

 

源码

Linux内核系列—12.e.操作系统开发之Makefile

标签:

原文地址:http://www.cnblogs.com/joey-hua/p/5414096.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!