#以下通过一个简单的示例说明Makefile的基本语法,以#号开头的表示批注
#以下为变量定义
ASM := nasm
CC := gcc
LD := ld
ASMFLAGS := -f elf
CFLAGS := -c
LDFLAGS := -s
#注:以上这些变量都是隐式规则中的变量,可以不用自己定义
BIN := foobar
OBJS := foo.o bar.o
#可以调用常用函数来定义变量,如字符串替换函数
#SRC:=pmtest5.asm
#BIN:=$(subst .asm,.bin,$(SRC))
.PHONY :all realclean everything final
#.PHONY显式的指明all等是伪目标,而伪目标的特点是一定会被执行
all : realclean everything
everything : $(BIN)
final : all clean
#all表示编译所有的内容,是执行make时默认的目标
#clean 表示清除所有目标文件
#realclean 表示清除所有文件
#以下为正式程序clean :
rm -f $(OBJS)
realclean :
rm -f $(OBJS) $(BIN)
$(BIN) : $(OBJS)
$(LD) $(LDFLAGS) -o $(BIN) $(OBJS)
#以上面这个例子来说明Makefile的基本组成单位:规则,其写法如下
#target:prerequisite
#command
#target表示目标,prerequisite表示当前目标依赖的文件,command表示命令
#真实命令必须以Tab键开头,我写完一保存tab键就没了,大家写的时候一定要注意
#加Tab键哦
#target依赖于$(OBJS),当target不是伪目标时,make会自动比较目标文件和源文件的
#新旧程度,只有当$(OBJS)中至少有一个文件比target新时,command才被执行
foo.o : foo.asm
$(ASM) $(ASMFLAGS) -o $@ $<
#像$@,$<这种变量称为自动变量,类似于C语言中的局部变量只在本目标内有效
#$@:表示当前目标,在上面这个例子其为foo.o
#$<表示当前目标依赖的第一个文件,在上面这个例子其为foo.asm
#再说一下nasm,gcc等的标准格式,如下:
#GCC 选项参数(可有多个,以空格隔开) 输出文件(只有一个) 源文件(可有多个)
bar.o: bar.c
$(CC) $(CFLAGS) -o $@ $<
#其实上面这条规则可以不写,因为Makefile的隐式规则会自动推导bar.o这个目标的依赖
#目标和生成命令
#make会在自己的隐式规则库中寻找可以使用的规则,若找不到。便会报错,在这个例
#子中,make调用的隐式规则是把*.o目标的依赖文件置成*.c文件,并用GCC的编译命令
#来生成*.o目标文件
#而在上面这个规则中make调用的隐式规则是
#%.o :%.c
#$(CC) $(CFLAGS) -o $@ $<