介绍我的Makefile学习日志
1、最简单也是最核心的规则
target: prerequisites
command
任何一个Makefile里面总能找到一个类似于这样结构语句,比如:
edit:main.o kbd.o command.o display.o
cc -o edit main.o kbd.o command.o display.o
或者:
all: .all-packages
.all-packages: .check-BIOS
$(XDC) --jobs=1 -PR $(PACKAGE_DIR)/ti/sdo/codecs
第一个比较简单target对应edit,就是要生成的二进制文件,prerequisites是生成target文件所以来的文件,比如main.o kbd.o command.o display.o,而command就是要执行的shell命令了,这条命令就是单纯的gcc编译命令,很简单。
对于第二个,我们看到all:.all-packages,很显然生成all可执行文件需要.all-packages,而后面一句也指明要生成.all-packages需要.check-BIOS,后面是一条shell命令,里面的$(XDC)是Makefile前面定义的宏,后面的是参数,之类的,当宏被替换掉后,该句仍是一条可执行的shell脚本
2、make
一般情况下我们直接运行make命令,make命令会自动查找Makefile文件,而其入口就是上面所说的符合其规则的第一条,比如:
edit:main.o kbd.o command.o
cc -o edit main.o kbd.o command.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
clean:
rm edit main.o kbd.o command.o
当我们直接运行make时候,他会默认生成edit,根据后面的依赖去查找其他文件,当我们使用make clean时候,他会直接跳到clean除执行,clean在这里类似于一个标签,指明了make的入口
3、隐藏规则
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
.PHONY : clean
clean :
rm edit $(objects)
上面看到,为了少些点*.o文件名,使用了宏定义,而且后面*.o文件也没有为每一个文件写一条命令,这就是Makefile的隐藏规则,它默认为*.o执行了“cc -c *.c 依赖文件”命令,这是Makefile的自动推导,这些很好的简化了Makefile的写法和工作量
4、自动化变量
$<
规则的第一个依赖文件名 $@ 所有目标集合
$^
规则的所有依赖文件列表,使用空格分隔
还有其他的,没用到,凡是$开头的基本都是自动化变量,可以自己网上查找资料
5、函数调用
这个太强到了,调用方法:$()或者${},示例:
comma:= ,
empty:=
space:= $(empty) $(empty)
foo:= a b c
bar:= $(subst $(space),$(comma),$(foo))
在这个示例中,$(comma)的值是一个逗号。$(space)使用了$(empty)定义了一个空格,$(foo)的值是“a b c”,$(bar)的定义用,调用了函数“subst”,这是一个替换函数,这个函数有三个参数,第一个参数是被替换字串,第二个参数是替换字串,第三个参数是替换操作作用的字串。这个函数也就是把$(foo)中的空格替换成逗号,所以$(bar)的值是“a,b,c” 对于其他的函数,在网上有很多列表!
阅读(1378) | 评论(0) | 转发(0) |