文章地址:http://www.cnitblog.com/textbox/archive/2009/10/21/62036.aspx

makefile 主要包含以下几点 
 显式规则 :描述了在何种情况下如何更新一个或者多个被称为目标的文件(Makefile的目标文件)。书写Makefile时需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令(有些规则没有命令,这样的规则只是纯粹的描述了文件之间的依赖关系)。
  隐含规则:它是make根据一类目标文件(典型的是根据文件名的后缀)而自动推导出来的规则。make根据目标文件的名,自动产生目标的依赖文件并使用默认的命令来对目标进行更新(建立一个规则)。简单的说就是  a.c 推出 a.o  或  a.o 推出 a.c   
  变量定义:使用一个字符或字符串代表一段文本串,当定义了一个变量以后,Makefile后续在需要使用此文本串的地方,通过引用这个变量来实现对文本串的使用。第一章的例子中,我们就定义了一个变量“objects”来表示一个.o文件列表。
  Makefile指示符:指示符指明在make程序读取makefile文件过程中所要执行的一个动作。其中包括:

读取一个文件,读取给定文件名的文件,将其内容作为makefile文件的一部分。

决定(通常是根据一个变量的得值)处理或者忽略Makefile中的某一特定部分。

定义一个多行变量。

Makefile注释内容:Makefile中“#”字符后的内容被作为是注释内容(和shell脚本一样)处理。如果此行的第一个非空字符为“#”,那么此行为注释行。注释行的结尾如果存在反斜线(\),那么下一行也被作为注释行。一般在书写Makefile时推荐将注释作为一个独立的行,而不要和Makefile的有效行放在一行中书写。当在Makefile中需要使用字符“#”时,可以使用反斜线加“#”(\#)来实现(对特殊字符“#”的转义),其表示将“#”作为一字符而不是注释的开始标志。
备注:以tab开头的行是以shell脚本执行。

makefile文件名查找顺序 :GNUmakefile”、“makefile”、“Makefile”。 当makefile文件的命名不是这三个任何一个时,需要通过make的“-f”或者“--file”选项来指定make读取的makefile文件.

include 作用:在一个MakefileA中包含其它的makefileB文件,这样就可以使用在MakefileA中就可以使用makefileB中的变量和规则
  include 指示符告诉make暂停读取当前的Makefile,而转去读取“include”指定的一个或者多个文件,完成以后再继续当前Makefile的读取

格式:include foo a.mk b.mk c.mk 
适用场合:
1.        有多个不同的程序,由不同目录下的几个独立的Makefile来描述其重建规则。它们需要使用一组通用的变量定义或者模式规则。通用的做法是将这些共同使用的变量或者模式规则定义在一个文件中(没有具体的文件命名限制),在需要使用的Makefile中使用指示符“include”来包含此文件。

2.        当根据源文件自动产生依赖文件时;我们可以将自动产生的依赖关系保存在另外一个文件中,主Makefile使用指示符“include”包含这些文件。这样的做法比直接在主Makefile中追加依赖文件的方法要明智的多。其它版本的make已经使用这种方式来处理。

注意-include FILENAMES... 与 include FILENAMES... 之间 的区别。 出现错误时候退出继续的区别

条件分支宏
“ifdef”、“ifeq”、“ifndef”和“ifneq” 条件分支的展开是“立即”的

环境变量MAKEFILES 

变量“MAKEFILES”主要用在“make”的递归调用过程中的的通信
注意:“MAKEFILES”定义的包含文件是否存在不会导致make错误

环境变量MAKEFILE_LIST 

MAKEFILES ,include 解析执行之前make读取的文件名将会被自动依次追加到变量“MAKEFILE_LIST”的环境变量中。

其他环境变量

GNU make 还支持一些特殊变量。它们一般都是只读的。 如(.VARIABLES  环境变量  makefile文件中所定义的所有全局变量列表)

自动化变量 :
$*
$@ 
代表规则的目标
$?
$< 
代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件
$^ 代表所有通过目录搜索(VPATH ;GPATH; vpath)得到的依赖文件的完整路径名

动态相关函数:
$$@

objects := $(patsubst %.c,%.o,$(wildcard *.c))   
将目录列表中所有文件名的后缀.c替换为.o。这样我们就可以得到在当前目录可生成的.o文件列表
foo : $(objects)
    cc -o foo $(objects)

规则:
如:

foo.o[目标文件集合] : foo.c defs.h  [依赖文件集合]      # module for twiddling the frobs

cc -c -g foo.c [命令 ; 此行需要以tab键开头] 

格式:
    目标集合:依赖集合
        命令集合

规则重载( 对于“GUNmakefile”中没有此目标的规则 就会执行重载规则 ,如 执行 make 'ABCDEFG' 由于没有制定 ABCDEFG 规则 所以执行重载规则里面的命令)

%: force

@$(MAKE) -f Makefile $@

force: ;

文件名通配符:
*
?
[...]
注意:主要用于文件名通配变量定义中使用的通配符不会被统配处理(只会当成字符串处理,不会展开)

目录搜索机制

是通过"VPATH”;“vpath”;"GPATH"指定的来指定规则中的依赖文件

通过变量“VPATH”可以指定依赖文件的搜索路径,当规则的依赖文件在当前目录不存在时,
make会在此变量所指定的目录下去寻找这些依赖文件
VPATH = src:../headers

选择性搜索(关键字
vpath)它可以为不同类型的文件(由文件名区分)指定不同的搜索目录
vpath %.h ../headers
   以上意思是Makefile中需要的.h文件;如果不能在当前目录下找到,则到目录“../headers”下寻找;%.h”表示所有以“.h”结尾的文件
       vpath %.c foo
       vpath % blish
       vpath %.c bar

表示对所有的.c文件,make依次查找目录:“foo”、blish”、“bar”
       vpath %.c foo:bar

       vpath % blish

对于所有的.c文件make将依次查找目录:“foo”、“bar”、“blish”

Makefile伪目标,强制目标,空目标,特殊目标,多目标,多规则目标

静态模式规则

静态模式规则对一个较大工程的管理非常有用。它可以对整个工程的同一类文件的重建规则进行一次定义,而实现对整个工程中此类文件指定相同的重建规则。可以用来描述整个工程中所有的.o文件的依赖规则和编译命令。通常的做法是将生成同一类目标的模式定义在一个make.rules的文件中。在工程各个模块的Makefile中包含此文件。
格式

TARGETS ...: TARGET-PATTERN: PREREQ-PATTERNS ...

COMMANDS

例如:

files = foo.elc bar.o lose.o

$(filter %.o,$(files)): %.o: %.c

$(CC) -c $(CFLAGS) $< -o $@

$(filter %.elc,$(files)): %.elc: %.el

emacs -f batch-byte-compile $<

它根据相应的.c文件来编译生成“foo.o”和“bar.o”文件:

双冒号规则

Makefile总结(转帖)的更多相关文章

  1. 一个通用的Makefile (转)

    据http://bbs.chinaunix.net/thread-2300778-1-1.html的讨论,发现还是有很多人在问通用Makefile的问题,这里做一个总结.也作为以后的参考.       ...

  2. Ubuntu下比较通用的makefile实例

    本文转自http://blog.chinaunix.net/uid-20608849-id-360294.html  笔者在写程序的时候会遇到这样的烦恼:一个项目中可能会有很多个应用程序,而新建一个应 ...

  3. Mac电脑C语言开发的入门帖

    本文是写给Mac电脑开发新手的入门帖,诸神请退散. C语言 C语言可说是电脑环境中的"镇国神器",从发明至今,虽然C语言的使用者缓慢的减少,但从当前市场应用情况看,尚无一台电脑能够 ...

  4. (转帖整理)Linux下的Autoconf和AutoMake(理论篇) 1

    在搜索网上资料过程中,这是感觉最简洁有效的一篇文章,特进行转帖记录,并根据情况对部分内容进行了修改.原帖传送门:Linux下的Autoconf和AutoMake 1.工具安装在开始使用autoconf ...

  5. Makefile 实例实践

    本文为原创文章,转帖需指明该文链接 目录结构如下: comm/inc/apue.h comm/errorhandler.c atexit.c Makefile 文件内容如下: apue.h   #if ...

  6. CLION 使用自己的makefile来运行

    之前参考过这里和这里,都是说要使用add_custom_target,无奈看不懂 但是前一篇里说它参考的是stackoverflow上的回答,去原帖里发现后来更新的第二高票答案!!!非常好用!!! 在 ...

  7. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  8. 编写一个通用的Makefile文件

    1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...

  9. 编写简单的Makefile文件

    makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c  x.h 表示生成www这个文件需 ...

随机推荐

  1. mongdb 副本集的原理、搭建、应用

    在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成.类似 ...

  2. GO string 的学习

    1.replace func Replace(s, old, new string, n int) string s:原来的字符串 old: 要被替换的久的字符串 new string:要替换旧字符串 ...

  3. Spring入门-框架搭建

    步骤: 导包 四个核心包: 日志包:由于市场上已经有更好的日志包,所以spring不用自己的,而是用apache的日志. 搞对象 由于spring是用来装对象的容器,所以得搞个对象让它装 书写配置文件 ...

  4. vs2005下opengl(glut)的配置记录

    摘自:http://blog.csdn.net/joeblackzqq/article/details/6956959 首先参考了网上的安装配置环境部分:http://blog.csdn.net/Id ...

  5. axios拦截器的使用方法

    很多时候我们需要在发送请求和响应数据的时候做一些页面处理,比如在请求服务器之前先判断以下用户是登录(通过token判断),或者设置请求头header,或者在请求到数据之前页面显示loading等等,还 ...

  6. oracle集合的应用

    union:求并集,公共部分只包含一个 ABC 和AB都没有显示出来 2:union all 相同的数据会包含两个 3:交集 intersect 既包含A又包含B 4:求差集  A集合中的数据B集合中 ...

  7. SPOJ 7258 (后缀自动机)

    转载:http://hzwer.com/4492.html 给一个长度不超过90000的串S,每次询问它的所有不同子串中,字典序第K小的,询问不超过500个. 搞出后缀自动机 dp处理出每个点往下走能 ...

  8. [NOIP2017]逛公园 题解

    我连D1T3都不会我联赛完蛋了 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 N 个点 M 条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口, N 号点是公园的出口,每条边有一个非负 ...

  9. python中得字典和常用函数总结

    字典是python中一种常见得数据类型,用{}表示,并且以键值对得形式存放数据. dic={},其中得key键值是不可变得,类型可以是字符串.其中,列表,字典不可以作为键,键值是不可变得.字符串,元组 ...

  10. bzoj 2242: [SDOI2011]计算器 & BSGS算法笔记

    这题的主要难点在于第三问该如何解决 于是就要知道BSGS是怎样的一种方法了 首先BSGS是meet in the middle的一种(戳下面看) http://m.blog.csdn.net/blog ...