makefile的相关知识

1.首先是makefile的基本语法:

目标文件列表:依赖文件列表

<tab>命令列表

一个makefile文件主要含有一系列的规则,每条规则包含一下的内容

‘目标文件列表’,即make最终需要创建的文件,如可执行的文件;目标也可以是要执行的动作。

·"依赖文件列表",通常是编译目文件所需要的其他文件

“命令列表”是make执行的动作,通常是把指定的相关文件编译成为目标文件的编译命令,每个命令占一行,并且每个命令的起始字符必须为tab字符

3.除非特别指定,否则make的工作目录就是当前目录。“目标文件列表”是需要创建的二进制文件或目标文件,“依赖文件列表”实在创建“目标文件列表”时需要用到的一个或多个文件的列表,命令序列是创建“目标文件列表”文件所需要执行的步骤,比如编译命令

例如有如下的一个makefile文件


#一个简单的Makefile例子
test:peog.o code.o
	gcc -o test prog.o code.o
peog.o:prog.c peog.h code.h
	gcc -c peog.c -o prog.o
code.o:code.c code.h
	gcc -c code.c -o code.o
clean:
	rm -f *.o
	

上面的makefile文件中共定义了四个目标:test prog.o code.o和 clean。目标从每行的最左边开始,后面紧跟: 若有与之相关的依赖文件,就放在:的后面并以空格隔开。在下一行写下将要执行的命令


在一个Makefile文件中,可以使用斜杠(\)将一个单独的命令行写成多行但注意\号的后面不能有任何的字符


一般情况下,调用make命令课输入:$make target


taeget是Makefile文件中定义的目标之一,如果省略Target,make就将生成Makefiel文件中定义的第一个目标,对于上面例子,单独一个Make等价于下面的语句


$make test

这是因为test是makefile文件中定义的第一个目标,make首先将其读入然后从第一行开始执行,把第一个目标test作为他的最终目标,所有后面的目标的更新都会影响到test的更新。第一条规则说明只要文件的test的时间比文件prog.o或code.o中的任何一个早,下一行的编译命令就将被执行

在检查文件peog.o和code.o的修改时间以前,make会在下面的行中寻找以prog.o和code.o为目标的规则,在第三行中找到了关于peog.o的规则,该文件的依赖文件是prog.c、prog.h和code.h


同样,make命令会在后面的规则行中继续查找这些文件的规则,如果找不到,则开始检查这些文件的修改时间,如果这些文件中的任何一个的修改时间比peog.o的新,make将执行下面的命令:

gcc –c prog.c –o prog.o

以同样的方法,接下来对code.o做类似的检查。依赖文件是code.h和code.c。当make执行完所有这些嵌套的规则后,make将处理最顶层的test规则。如果关于prog.o和code.o的两个规则中任何一个规则被执行,至少其中一个.o文件就会比test新,就要执行test的指令,因此peog.o和code.o将被连接成为test执行文件。

例子的最后给了一个clean命令,这个比较常用:也是一种专用的目标,用来清除所有的目标模块。

下面给出一个Makefile的范例:


说实在,下面的代码我也没有搞懂啊

#
#arch/arm/Makefile
#

LINKFLAGS	:=-p -X -T arch/arm/vmlinux.lds
OBJCOPYFLAGS:=-O binary -R .note -R .comment -S
GZFLAGS		:=-9
CFLAGS		:+=-Uarm -fno-common -pipe

CFLAGS_BOOT :=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float
CFLAGS +=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float
AFLAGS +=$(apcs-y) $(arch-y) -mno-fpu -msoft-float

symlinks: include/asm-arm/.arch include/asm-arm/.proc
.PHONY: maketools
maketools: include/asm-arm/.arch include/asm-arm/.proc \
include/asm-arm/constants.h include/linux/version.h checkbin
@$(MAKETOOLS)

下面的这几个现在还没有完全弄明白:

注解:

#
# Make "config" the default target if there is no configuration file or
# "depend" the target if there is no top-level dependency information.
#

继续下一行:

DRIVERS y += drivers/char/char o \
<span style="white-space:pre">	</span>drivers/media/media.o

巨集:

CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
-fno-strict-aliasing -fno-common

法则:

init/version.o: init/version.c include/linux/compile.h
$(CC) $(CFLAGS) $(CFLAGS_KERNEL) -c init/version.c

下面是找到的另一个参考实例:(别人写的,我不会)但是比较具有代表性

CREATER_PATH=/usr/var/creator/examples
INCLUDE_PATH1=$(CREATER_PATH)/src/common
INCLUDE_PATH2=$(CREATER_PATH)/src/gnu
#我猜上面应该是包含的路径

PREFIX=/usr/local
CC=$(PREFIX)//bin/arm-elf-gcc
LD=$(PREFIX)/bin/arm-elf-ld
CFLAGS= -nostartfiles -g -I$(INCLUDE_PATH1) -I$(INCLUDE_PATH2) -I. -O0
AFLAGS=-mapcs-32 -msoft-float -mno-fpu $(CFLAGS)
LFLAGS= -Wl,-elf2flt,-M,-Map=$@.map
OBJS= demo.o sbek.o driver.o

all:$(OBJS) head_ram.o head_rom.o
$(CC) -Tdemo.ld -Wl,-M,-Map=demo_ram.map -o "demo_ram.axf" $(OBJS) head_ram.o
$(CREATOR_PATH)/lib/arm7_gnu_2953.a
arm-elf-objcopy -O binary -S demo_ram.axf demo_ram.bin
$(CC) -Tdemo.ld -Wl,-M,-Map=demo_rom.map -o "demo_rom.axf" $(OBJS) head_rom.o
$(CREATOR_PATH)/lib/arm7_gnu_2953.a
arm-elf-objcopy -O binary -S demo_rom.axf demo_rom.bin

.c.o:
	$(CC) $(CFLAGS) -c -o $@ $<
head_ram.o : head.s
	$(CC) $(AFLAGS) head.s -c -o head_ram.o
head_rom.o : head.s
	$(CC) $(AFLAGS) -Wa,--defsym=LOADER=0 head.s -c -o head_rom.o
.PHONY : clean
clean:
rm *.bin *.axf *.o *.s

下面是一些解释:

(1)CREATOR_PATH=/usr/var/creator/examples

此列定义了我们相关档案的路径主目录的置换名称为CREATOR_PATH

(2)INCLUDE_PATH1=$(CREATOR_PATH)/src/common
INCLUDE_PATH2=$( ) g CREATOR_PATH)/src/gnu

这个是定义include的置换名称:

(3)VPATH = $(CREATOR_PATH) /src/common:
$(CREATOR_PATH)/src/lib: $(CREATOR_PATH)/src/gnu

这个也是置换名称 但是VPATH是make内置的寻找档案的路径

makefile在make是预期所在的路径中找不到相关的档案时则会去找VPATH中指定的路径

(4)PREFIX=/usr/local
CC=$(PREFIX)/bin/arm-elf-gcc
LD=$(PREFIX)/bin/arm-elf-ld

用来定义compiler跟linker的路径

(5)CFLAGS= -nostartfiles -g -I$(INCLUDE PATH1_PATH1)

I$(INCLUDE_PATH2) -I. -O0

CFLAGS=

这个是设定给compiler使用的参数置换名称

-nostartfiles

在link时不使用系统标准的startup (不是很懂)

-g

产生OS原生格式的(stabs,COFF,XOOF,DWARF)的除错信息,GDB需要这些讯息才可以工作。大部分的系统都会使用stabs格式。但是产生的额外的出错信息可能会让其他的debugger无法读取。

-I

路径,此参数用以指定header file的路径

-O

最佳化的控制,-O0代表不最佳化,这个选项是预设值

(6)AFLAGS=-mapcs-32 -msoft-float -mno-fpu $(CFLAGS)
AFLAGS = -map

基本上,GCC Cmopiler 出来的程序可以支持相当多的平台,ARM只是其中的一个,座椅在设定中对于ARM专用部分我们可以可以独立起来置换为参数AFLAGS,以便以后平台的移植。

-mapcs-32

产生给有32bit程序计数器处理器的程序

-msoft-float

产生含有浮点函数呼叫的输出

-mno-fpu

跟上面一样,通用与SPARC

(7)LFLAGS= -Wl,-elf2flt,-M,-Map=$@.map

设定用于linker使用的参数置换名称

-WI

选项参数将这些选项传到linker,而且各选项之间,以逗号隔开

(8)OBJS= demo.o sbrk.o driver.o

OBJS=

定义主要的(物件档案)的置换名称

(9)

all: $(OBJS) head_ram.o head_rom.o
	$(CC) -Tdemo.ld -Wl,-M,-Map=demo_ram.map -o "demo_ram.axf" $(OBJS) head_ram.o
$(CREATOR_PATH)/lib/arm7_gnu_2953.a
	arm-elf-objcopy -O binary -S demo_ram.axf demo_ram.bin
	$(CC) -Tdemo ld .ld -Wl,-M,-Map=demo rom map _rom.map -o "demo rom axf _rom.axf" $(OBJS)
	head_rom.o
$(CREATOR_PATH)/lib/arm7_gnu_2953.a
	arm-elf-obj py copy -O binary -S demo rom.axf demo rom.bin

这个demo程序除了定义在OBJ变量内的几个档案外,还必须包含我们选择的target的相关程序,也可以称之为驱动程序,一般是以汇编编写的,因为这几个文件和target相关,就将之独立出来

之前曾经提到过,一个makefile的第一个target称之为goal,在demo中就是all,而要达到goal,就要几个先决条件,也就是:demo,sbrk.o,driver.o,head-ram.o和
head-rom.o


在这个没有你的世界里,爱你,叶铮

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值