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,图片示例:

Makefile教程Makefile教程

11,如果printk没有输出到控制台可以用dmesg查看