makefile学习记录

一.环境变量MAKEFILES和include的区别
  1.环境变量MAKEFILES所制定的makefile文件中的"目标"不会被作为make执行的终极"目标".
  2.环境变量所定义的文件列表是否存在不会导致make错误,也不退出
  3.在执行make时,首先读取的是环境变量MAKEFILES所指定的文件列表,之后才是工作目录下的makefile.
    include所指定的文件是在make发现此关键词时,暂停正在读取的文件而转去读取include所指定的文件.

二.自动环境变量$?
  1.$?表示依赖文件列表中被改变的所有文件

三.通配符的缺陷
  1.通配符包括"*" "?" "[...]",与bash用法和含义完全相同
  2.Makefile中通配符用在规则的目标,依赖,命令中.除此之外,不能使用通配符.只能用函数(如wildcard)代替.
 
四.目录搜寻(对工作目录的搜索永远处于最优先地位)
  1.环境变量VPATH,指定依赖文件的搜索路径.定义VPATH时,使用空格或者:讲多个目录隔开
  2.关键字vpath,为不同类型的文件(由文件名区分)指定不同的搜索目录.
        1.vpath PATTERN DIR
             所有符合模式PATTERN的文件指定搜索目录DIR,多个目录使用空格或者:隔开

          vpath %.h ../header     #表示在Makefile中出现的.h文件,如果当前目录下找不到,则到../header目录下寻找

        2.vpath PATTERN
             清除之前为符合模式PATTERN的文件设置的搜索路径
        3.vpath
             清除所有已被设置的文件搜索路径
五.bash#... 的含义

  例子: sh hello.sh a b
   $# 是传给脚本的参数个数    2
   $0 是脚本本身的名字    hello.sh
   $1 是传递给该shell脚本的第一个参数    a
   $2 是传递给该shell脚本的的第二个参数    b
   $@ 是传给脚本的所有参数列表    "a" "b" #可以做for ... in..
   $* 是以一个单字符串显示所有向脚本传递的参数    "a b"
   $$ 是脚本运行的当前进程ID号
   $? 是显示最后命令的退出状态,0表示没错误,其他值表示有错误.

六.Makefile 里3个非常变量


   $@ 目标文件
   $^ 所有依赖的文件
   $< 第一个依赖文件

七.库文件
   在编译选项按照 -lNAME 规则
   manke在执行规则时会在当前目录下搜索一个名字为libNAME.so的文件,
   如果当前目录不存在这样的文件,则make会继续按照VPATH和vpath指定目录搜索
   如果还是不存在,make将搜索系统库文件默认目录,顺序是/lib   /usr/lib   PREFIX/lib(在Linux中为/usr/local/lib,其他系统可能不同)
   如果libNAME.so还是找不到,则make会按照上述顺序查找名字为libNAME.a的文件
   如添加libdvbstatck.so时,应该是-ldvbstack

八.伪目标
   当时用make命令指定此目标时,这个目标所在规则定义的命令.无论目标文件是否存在都会被无条件执行 .
   作用:
       1.伪目标,不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令.有时也可将伪目标作为一个标签.
       2.用在make的并行和递归执行中.
    SUBDIRS= foo bar hee
        subdirs:
            for dir in $(SUBDIRS);do \
                      $(MAKE) -C $$dir;\
                done
       3.当伪目标作为伪目标的依赖时,则相当于子程序,是每次都要执行的



九.
   如果一个规则没有命令 或者 依赖,并且他的目标不是一个存在的文件名.在执行次规则时,目标总会被认为是最新的.


十.Makefile的特殊目标
   .PHONY  他的所有依赖都被当做伪目标
   .SUFFIXES 的所有依赖指出了

















你可能感兴趣的:(linux,嵌入式,makefile)