文章地址: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. HTML基础用 表格做报表

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. svnkit 异常:Exception in thread "main" org.tmatesoft.svn.core.SVNException: svn: E200030: SQLite error

    https://stackoverflow.com/questions/16063105/org-tmatesoft-sqljet-core-sqljetexception-busy-error-co ...

  3. vue 父组件数据修改,子组件数据未修改

    页面: 父组件  <myfeedback></myfeedback>  子组件  <news></news> myfeedback.vue <te ...

  4. python基础:1.位、字节、字的关系

    1.位,简称b,或bit,比特,数据存储的最小单位.每个二进制数字0或1就是一个位(bit),网络通信常用bps,bit per second ,每秒传输多少位 2.字节,简称byte, 1byte ...

  5. 基于dokcer的zoookeeper集群安装

    编写docker-compose.ymlversion: '3.1' services: zoo1: image: zookeeper restart: always hostname: zoo1 p ...

  6. 常见Serialize技术探秘(ObjectXXStream、XML、JSON、JDBC byte编码、Protobuf)

    目前业界有各种各样的网络输出传输时的序列化和反序列化方案,它们在技术上的实现的初衷和背景有较大的区别,因此在设计的架构也会有很大的区别,最终在落地后的:解析速度.对系统的影响.传输数据的大小.可维护性 ...

  7. 如何在浏览器上安装 VueDevtools工具

    火狐浏览器直接打开附加组件中,搜索 VueDevtools,找到安装即可. 谷歌浏览器--更多工具--扩展程序--打开下载好的VueDevtools整体拖进去就行了

  8. BZOJ 1954: Pku3764 The xor-longest Path(贪心+trie)

    传送门 解题思路 \(trie\)的一个比较经典的应用,首先把每个点到根的异或和算出,然后建一棵\(trie\)把所有权值插入到\(Trie\)中,之后枚举所有结点,在\(Trie\)上贪心的跑统计答 ...

  9. [CSP-S模拟测试]:w(树上DP)

    题目背景 $\frac{1}{4}$遇到了一道水题,双完全不会做,于是去请教小$D$.小$D$看了${0.607}^2$眼就切掉了这题,嘲讽了$\frac{1}{4}$一番就离开了.于是,$\frac ...

  10. C# 后台报错输出到日志

    1.C# 方法 /// <summary> /// 异常处理 /// </summary> /// <returns></returns> public ...