Makefile教程
1,执行文件生成过程:
(编译) (链接)
源码----------->中间代码-------------->执行文件
2,规则:
target ... : prerequisites ...
command
(target:目标文件,prerequisites:依赖文件,command:编译命令)
3,基本示例说明:
1:(objects:定义变量,引用格式为$(objects),相当于C语言中的宏定义;"\" 表示换行)
2:(隐晦规则:只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到
一个whatever.o,那么 whatever.c,就会是whatever.o的依赖文件。并且 cc -c whatever.c
也会被推导出来)
3:(edit执行文件,依赖于($(objects)))
4:(.PHONY:表示clean是个伪目标文件)
5:(Makefile中的命令,必须要以[Tab]键开始)
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)
4,makefile定义:
1》makefile文件名为:Makefile或者makefile
2》其中规则包含了:显式规则,隐晦规则,变量定义,文件指示,注释("#")
3》MAKEFILES环境变量的定义,make把这个变量中的值做一个include的动作
4》通配符:“*”,“?”,“[...]”
5》VPATH文件搜索,例:VPATH = src:../headers 包含两个路径src 和 headers
5,多目标:
[email protected]表示目标的集合
6,静态模式:
objects = foo.o bar.o
$(objects) : %.o:% .c (意思为:objects目标文件都是以.o结尾的,并且依赖文件为.c)
7,自动生成依赖性:
cc -M main.c (自动搜索main.c所需要的头文件)
8,常用赋值方式:
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
9,常用函数:
$(function arguments)
"function"是函数名,"arguments"是该函数的参数,参数和函数名之间用空格或Tab隔开
1》字符串替换和分析函数
在文本"text"中使用"to"替换每一处"from"
$(subst from, to, text);
寻找"text"中符合格式"pattern"的字,用"replacement"替换它们
$(patsubst pattern, replacement,text);
$(patsubst %.c, %.o, x.c.c bar.c) //结果为x.c.o bar.o
//去掉前导和结尾空格,并将中间的多个空格压缩为单个空格
$(strip string)
$(strip a b c) //结果为a b c
//在字符串"in"中搜寻"find",如果找到,则返回值是"find",否则返回值为空
$(findstring find, in)
$(findstring a, a b c) //返回"a"
$(findstring a, b c) //返回" "
//返回"text"中由空格隔开且匹配格式"pattern..."的字,去掉不符合格式"pattern
//..."的字
$(filter pattern..., text)
$(filter %.c %.s, foo.c bar.c baz.s ugh.h) //返回值"foo.c bar.c baz.s"
//返回"text"中由空格隔开且不匹配格式"pattern..."的字,去掉符合格式"pattern
//..."的字
$(filter-out pattern..., text)
$(filter %.c %.s, foo.c bar.c baz.s ugh.h) //返回值"ugh.h"
//将"list"中的字按字母顺序排序,并去掉重复的字,输出由单个空格隔开的字的列表
$(sort list)
$(sort foo bar lose) //返回bar foo lose
2》文件名函数
//抽取"names..."中每一个文件名的路径部分,文件名的路径部分包括从文件名的首字符
//到最后一个斜杠之前的一切字符
$(dir names...)
$(dir src/foo.c hacks) //返回"src/ ./"
//抽取"names..."中每一个文件名中除去路径部分外的一切字符
$(notdir names...)
$(notdir src/foo.c hacks) //返回"foo.c hacks"
//抽取"names..."中每一个文件名的后缀
$(suffix names...)
$(suffix src/foo.c src-1/bar.c hacks) //返回".c .c"
//抽取"names..."中每一个文件名除后缀外的一切字符
$(basename names...)
$(basename src/foo.c src-1/bar hacks) //返回"src/foo src-1/bar hacks"
3》其它函数
//变量"variable"是一个查询变量的名称,不是对该变量的引用
$(origin variable)
//函数shell是make与外部环境的通信工具,函数shell的执行结果和控制台上执行
//"command arguments"的结果相似
$(shell command arguments)
10,图片示例:
11,如果printk没有输出到控制台可以用dmesg查看