2015-06-06 18:07 2396人阅读 评论(1) 收藏 举报
 分类:
C/C++(132)  Linux & MAC(19) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

终于答辩结束,有空来水水博客,今天总结一下Makefile中的常用规则,技巧,基本涵盖了日常应用, 如有不全希望大家留言添加~ 本文主要内容:

一. Makefile/makefile规则及举例

二. make的工作方式

三、makefile中的常用自动化变量与通配符

四、makefile自动生成依赖性关系

五、 调用命令

1. 显示命令

2. 命令出错

3. 命令执行

六、 变量

1. 变量定义

2. 变量引用

3. 变量替换

七、 条件判断

八、 常用函数

1. 字符串处理函数

2. 文件名操作函数

3. if

4. foreach

5. shell

九、 指定make的目标

更全更多文档请见《跟我一起写Makefile》陈皓78页的pdf。

一. Makefile/makefile规则及举例:

makefile由规则组成,每条规则告诉make两件事: 文件的依赖关系 & 如何生成目标文件。
e.g 
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
# 定义变量, 反斜杠(\)是换行符的意思。

edit : $(objects)
# targets : prerequisites 冒号前表示目标文件, 冒号后为依赖文件(prerequisites)
cc -o edit $(objects)
# 编译命令, 每个target下都需要配一行command(使用了隐晦规则除外)

main.o : defs.h
# 本来是main.o: main.c defs.h, 根据make 的“隐晦规则”可以省略main.c,只列出其所需的头文件
# 根据make 的“隐晦规则”隐含了cc -c main.c
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h

.PHONY : clean 
#.PHONY 意思表示 clean 是一个“伪目标”, 我们并不生成“clean”这个文件。 #可以用“make clean”运行“clean”这个目标。
clean :
rm edit $(objects)

二. make的工作方式:
1、读入所有的 Makefile。
2、读入被 include 的其它 Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系和文件生成时间,决定哪些目标要重新生成。
7、执行生成命令。

三、makefile中的常用自动化变量与通配符:
makefile中支持的3个通配符: *,?,[...]
$@: 目标集
$<: 第一个依赖文件
$^: 所有依赖文件
$?: 所有比目标新的依赖集合

objects = *.o
objects := $(wildcard *.o)

四、自动生成依赖性关系
在Makefile中如果要对每个文件编写依赖关系会非常麻烦, 为了避免这个过程, 我们可以用c/c++编译器的"-M"功能, 即自动寻找源文件中包含的头文件, 并生成依赖关系。 
如 cc -M Main.c 的输出是 main.o: main.c defs.h
PS:GNU的编译器(gcc/g++)需要用-MM参数, 如gcc -MM main.c, 不然"-M"会把一些标准库的头文件也引进来。

这部分内容我们就不详细讲了,因为在CoMake2中已经有了更好的集成。

五、 调用命令
1. 显示命令
@echo running...
这在调试整个make流程时很有用, 可以用make -n 或make --just-print之显示命令,但不执行命令。 也就是可以看到我们写的makefile真正执行起来的顺序流程。

2. 命令出错
忽略错误继续执行: make -k 或 make b--keep-going
全局忽略错误: make -i 或 make --ignore-errors
某一句忽略错误: 在前面加一个减号, 如-rm -f *.o

3. 命令执行
exec:
cd subdir; export variable=value;\ %将变量value以"variable"传递到subdir, 如果传递所有变量, 只需一个export就行
$(MAKE);\ % 嵌套执行make;
mkdir subsubdir

PS:make -w 可以查看当前工作目录

六、 变量
1. 变量定义:
大小写敏感
不许含有:,#,=,空格
变量声明时需要赋值,
用=幅值不一定是用已经幅好值的变量,也可以引用后面定义的变量;
用:=幅值, 只能引用已经幅值过的变量进行幅值; 
赋值运算符A?=B表示, 若A被定义过,则不做,否则A赋值为B;
A+=B表示,变量幅值时字符串的追加;

2. 变量引用:
$(var)

3. 变量替换:
foo:= a.o b.o c.o
希望赋值bar为a.c, b.c, c.c, 有两种方法:
方法一: bar := $(foo:.o=.c)#将foo中所有以.o结尾的".o"字串全替换为".c"
方法二: bar := $(foo:%.o=%.c)

七、 条件判断
语法: 
libs_for_gcc = -lgnu
ifeq($(UNAME),Linux)
LINUX := 1
else ifeq($(UNAME),Darwin)
OSX := 1
endif

类似地, 还有三个关键字: ifneq,ifdef和ifndef
注意,条件表达式中不要放自动化变量, 如$@,因为自动化变量只在运行时才有,而make在读取Makefile时就会根据条件表达式的值选择语句。

八、 常用函数
函数调用方法:
$(<function> <args>)
1. 字符串处理函数:
$(subst <from>,<to>,<text>) 将<text>中的<from>替换成<to>
$(patsubst <fromP>,<toP>,<text>) 将<text>中符合模式<fromP>的部分替换成<toP>
$(strip <text>) 去<text>中开头和结尾的空字符
$(findstring <find>,<from>) 在<from>中找<find>; 找到返回<find>, 否则返回空字符串
$(filter <pattern>,<text>) 从text中过滤出符合pattern模式的项
$(filter-out <pattern>,<text>) 反过滤
$(sort <list>) 排序

2. 文件名操作函数:
$(dir <text>) 取目录
$(suffix <text>) 取后缀名
$(addsuffix <suffix>,<names>) 加后缀
$(addprefix <prefix>,<names>) 加前缀
$(join <list1>,<list2>) list1, list2对应元素进行concatenate

3. if
$(if <condition>, <then>, <else>)

4. foreach
$(foreach <var>,<list>,<text>)

5. shell
执行shell命令
e.g $(shell find . -name '*.$(suffix_name)')

九、 常用指定make的目标功能:
all: 编译所有目标
clean: 删除所有被make创建的文件
install: 安装已编译好的程序, 就是将目标执行文件拷贝到指定目标中去
print: 列出改变了的源文件
tar: 把原程序打包备份为一个tar文件

参考材料: 《跟我一起写Makefile》
PS:其实还有别的参考,但是感觉这篇文档已经足够涵盖makefile常用内容了。

 
from: http://blog.csdn.net/abcjennifer/article/details/46390309

Makefile 快速入门的更多相关文章

  1. makefile快速入门

    前言 在linux上开发c/c++代码,基本都会使用make和makefile作为编译工具.我们也可以选择cmake或qmake来代替,不过它们只负责生成makefile,最终用来进行编译的依然是ma ...

  2. Make 和 Makefile快速入门

    前言 一个项目,拥有成百上千的源程序文件,编译链接这些源文件都是有规则的.Makefile是整个工程的编译规则集合,只需要一个make命令,就可以实现“自动化编译”.make是一个解释makefile ...

  3. Linux快速入门04-扩展知识

    这部分是快速学习的最后一部分知识,其中最重要的内容就是源码的打包和软件的安装的学习,由于个人的Linux学习目的就是自己能在阿里云Ubuntu上搭建一个简单的nodejs发布环境. Linux系列文章 ...

  4. CMake快速入门教程-实战

    http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/detai ...

  5. 转:CMake快速入门教程-实战

    CMake快速入门教程:实战 收藏人:londonKu     2012-05-07 | 阅:10128  转:34    |   来源   |  分享               0. 前言一个多月 ...

  6. Emacs快速入门

    Emacs 快速入门 Emacs 启动: 直接打emacs, 如果有X-windows就会开视窗. 如果不想用X 的版本, 就用 emacs -nw (No windows)起动. 符号说明 C-X ...

  7. QuickJS 快速入门 (QuickJS QuickStart)

    1. QuickJS 快速入门 (QuickJS QuickStart) 1. QuickJS 快速入门 (QuickJS QuickStart) 1.1. 简介 1.2. 安装 1.3. 简单使用 ...

  8. NOI Linux 快速入门指南

    目录 关于安装 NOI Linux 系统配置 网络 输入法 编辑器 1. gedit 打开 配置 外观展示 2. vim 打开 配置 使用 makefile 编译运行 1. 编写 makefile 2 ...

  9. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

随机推荐

  1. javascript学习小记(一)

    大四了,课少了许多,突然之间就不知道学什么啦.整天在宿舍混着日子,很想学习就是感觉没有一点头绪,昨天看了电影激战.这种纠结的情绪让我都有点喘不上气啦!一点要找点事情干了,所以决定找个东西开始学习.那就 ...

  2. django-CSRF verification failed. Request aborted

    现象: 解决办法1: 在view.py文件中设置如下: from django.views.decorators.csrf import csrf_exempt @csrf_exempt #再写下面的 ...

  3. PHP中如何连接数据库基本语句

    只是后端修改页面,不需要在前端显示的可以删除原有代码只输入<?php 开始编写语言即可,后面的?>也可以省略 //造一个连接$connect = @mysql_connect(" ...

  4. android的布局管理器

    理论上通过setContentView(view)能够把一个view设置到activity中,但当你有很多个view控件的时候,就需要用android的布局管理器来管理view控件了. android ...

  5. 原生js实现中文时钟

    零.寒暄 终于一个月可以更新两篇博客了,开心.昨天花了大概一天的时间玩了下github,基本的clone和push都搞定了,如果有和我一样的新手没调通的,大家可以交流. 另外,说个题外话,大家发现我的 ...

  6. PE文件结构深入详解

    一.PE结构基础 看了很多PE结构类的东东,要不上来就是整体结构,要不就是一大堆ASM代码,看的我等菜鸟有点难受!所以自己写个帖·学习PE我们先来弄懂几个问题! 1:几个地址的概念 VA:虚拟地址,也 ...

  7. WPF编程学习——布局

    本文目录 1.布局简介 2.面板(Panel) 3.视图框(Viewbox) 4.滚动视图控件(ScrollViewer) 5.公共布局属性 1.布局简介 应用程序界面设计中,合理的元素布局至关重要, ...

  8. 13test05:亲密数

    /*#include<iostream> using namespace std; int main() {int sum[3000]={0}; for(int i=1;i<3000 ...

  9. 【三】php之梗

    1.php没有顶级作用域,所以你没办法在函数内部使用变量(参数传递除外,而且常量是可以的哟),所以你的变量即使是static的也不能在函数外声明函数里用.除非借助global关键字修饰变量才可以.但是 ...

  10. 用VBS将PPT转为图片

    '使用方法:把ppt文件拖放到该文件上. '机器上要安装Powerpoint程序 On Error Resume Next Set ArgObj = WScript.Arguments pptfile ...