Makefile-2
一、命令行参数
-n/--just-print/--dry-run/--recon 只显示命令,但不会执行命令,用于调试 makefile。
-s/--slient/--quiet 禁止命令的显示
-e/--environment-overrides 系统环境变量将覆盖 makefile 中定义的变量
-f/--file 指定 makefile 文件
-t/--touch 只更新目标文件的时间而不编译。
-B/--always-make 重编译所有目标
-C/-directory=<dir> 指定读取 makefile 的目录
--debug=[=<options>] 输出 make 调试信息,如果没有参数则为最简单的调试信息。可以为:
a all 所有的调试信息,最高
b basic 基本调试信息,最低
v verbose 包括哪个 makefile 被解析,不需要被重编译的依赖文件(或是依赖目标)等
i implicit 输出所有的隐含规则
j jobs 输出执行规则中命令的详细信息,如命令的PID,返回码等。
m makefile 输出 make 读取 makefile ,更新 makefile ,执行 makefile 的信息
-d 相当于 --debug=a
-i/--ignore-errors 忽略所有错误
-I/--include-dir=<dir> 指定 makefile 的搜索路径
-j/--jobs[=<jobsnum>] 并行执行
-k/--keep-going 出错也不停止运行
-S/--no-keep-going 取消 -k 的作用
-o/--old-file=<file>/--assume-old=<file> 不重新生成指定的<file>
-p/--print-data-base 输出 makefile 中的所有数据,包括所有的规则和变量。如果只想输出信息而不想执行,可以使用 make -qp,想要查看执行 makefile 前的预设变量和规则,使用 make -p -f /dev/null 。此参数对于学习 makefile 极为重要。
-r/--no-builtin-rules 禁止 make 的所有隐含规则
-R/--no-builtin-variabes 禁止 make 使用任何用于变量上的隐含规则
-w/--print-directory 输出运行 makefile 之前和之后的信息,对于跟踪嵌套调用 make 有用。
--no-print-directory 禁止 -w
--warn-undefined-variables 只要make 发现有未定义的变量,就输出警告。
常用命令前缀:
@ 不显示命令到屏幕上
; 让下一条命令建立在上一条命令执行结果上,如 cd /opt;pwd
- 忽略命令的错误提示
条件判断语句和定义命令序列:
if/ifeq/ifneq/ifdef/ifndef ... else ... endif
define 命令包名 命令列表 endef
常用的约定俗成的伪目标名:
all 所有目标的目标,其功能一般是编译所有的目标
clean 删除所有被 make 创建的文件
install 安装已编译好的程序,其实就是把目标执行文件复制到指定的目录中去
print 列举改变过的源文件
tar 把源程序打包备份
dist 创建一个压缩文件,一般是把 tar 文件压成 Z 文件或 gz 文件
TAGS 更新所有的目标,以备完整的重新编译使用
check 和 test 测试 makefile 的流程
引入其它的 makefile 文件: include <filename>
1、首先寻找 make 执行时有 -I/--include-dir 参数指定的目录
2、寻找 <prefix>/include (一般是 /usr/local/bin 或 /usr/include ) 目录
如果文件没有找到,则 make 会生成一条警告信息,但不会马上出现致使错误,它会继续载入其它的文件,一旦完成 makefile 的读取,make 会再重试这些没有找到或是不能读取的文件,如果还不行,才会出现一条致命错误,如果想让 make 忽略无法读取的文件,可以在 include 前面加上 - 的命令前缀。
依赖文件和目标文件搜索路径:
1、VPATH 环境变量
2、vpath 关键字,它比 VPATH 更灵活,可以指定不同格式的文件在不同的目录下搜索。它的使用有三种形式:
◆ vpath <pattern> <directories>
为符合模式的文件指定搜索目录
◆ vpath <pattern>
清除符合模式文件的搜索目录
◆ vpath
清除所有已被设置好了的文件搜索目录
变量:
makefile 中的变量,更确切的说,类似于是宏,而不是通常意义上的变量。
=/:=/?=/+= 注意这几个变量操作符的区别
override 关键字修饰的变量,可以覆盖运行 makefile 时由命令行设置的变量
设置变量的值时,往往因为空格造成很多问题,这时可以利用 # 完成一些明确声明,如 nullstring :=#结束 space :=$(nullstring) #值为一个空格
自动化变量:
$@ 目标文件集
$% 仅当目标是函数库文件时,表示规则中的目标成员名
$< 依赖文件中的第一个目标名字,如果依赖文件是以模式定义的,则表示符合模式的一系列文件集
$? 所有比目标新的依赖文件集,以空格分隔
$^ 所有依赖文件集,以空格分隔,如果依赖文件中有重复,则去重复
$+ 同上,不去重复
$* 表示目标模式文件的主名部分
$(@D) 表示 $@ 的目录部分(不以斜杠作为结尾)
$(@F) 表示 $@ 的文件部分
其它类似的还有 $(*D)/$(*F)/$(<D)/$(<F)/$(^D)/$(^F)/$(?D)/$(?F)
常用的命令参数变量(默认为空):
CC C编译器,默认为 gcc
CXX C++母夜叉器,默认为 g++
CFLAGS C编译参数
CXXFLAGS C++编译参数
CPPFLAGS C预处理器参数
LDFLAGS 链接器参数(如 ld)
函数:
一、字符串处理函数
1、$(subst <from>,<to>,<text>) 返回 <text> 中的 <from> 替换成 <to> 后的字符串
2、$(patsubst <pattern>,<replacement>,<text>) 同上,模式替换
3、$(strip <string>) 返回去掉 <string> 字符串开头或结尾的空字符
4、$(findstring <find>,<int>) 在 <in>字串中查找<find>,若找到返回 <find>,找不到返回空字符串
5、$(filter <pattern...>,<text>) 返回符合模式 <pattern> 的字串
6、$(filter-out <pattern...>,<text>) 和上面相反,返回不符合模式 <pattern> 的字串
7、$(sort <list>) 对 <list> 中的字串进行升序去重复排序,返回排序后的字串
8、$(word <n>,<text> 返回 <text> 中的第 <n> 个单词,如果 <n> 大于 <text> 的单词数,则返回空字串
9、$(wordlist <s>,<e>,<text>) 同上,取出多个单词,<s> 和 <e> 是数字
10、$(words <text>) 返回 <text> 中单词个数
11、$(firstword <text>) 返回 <text> 中第一个单词
12、$(join <list1>,<list2>) 将 <list2> 中的子串一一对应的加到 <list1> 的子串后面,如果 <list2> 子串数比 <list1> 多,多出来的 <list2> 子串就直接复制过去,函数返回连接过后的字符串
二、文件操作函数
1、$(dir <names...>) 返回文件名序列 <names> 的目录部分
2、$(notdir <names...>) 返回文件名序列 <names> 的非目录部分
3、$(suffix <names...>) 返回文件名序列 <names> 的文件名后缀部分
4、$(basename <names...>) 返回文件名序列 <names> 的文件名前缀部分
5、$(addsuffix <suffix>,<names...>) 返回文件名序列 <names> 加过后缀 <suffix> 的文件名序列
6、$(addprefix <prefix>,<names...>) 返回文件名序列 <names> 加过前缀 <suffix> 的文件名序列
三、条件与循环函数
$(if <condition>,<then-part>) 或 $(if <condition>,<then-part>,<else-part>)
$(foreach <var>,<list>,<text>) 将<list>中的单词逐一取出放到<var>所指定的变量中,然后再执行<text>所包含的表达式,每次循环返回的内容由空格隔开,就是该函数的最终返回值。如:
names:=a b c d
files:=$(foreach n,$(names),$(n).o)
则 $(files) 的值就是 "a.o b.o c.o d.o"
四、其它函数
$(call <expression>,<parm1>,<parm2>,<parm3>,...)
$(origin <variable>)
$(shell <expression>)
Makefile-2的更多相关文章
- 说说Makefile那些事儿
说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...
- 编写一个通用的Makefile文件
1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...
- 编写简单的Makefile文件
makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c x.h 表示生成www这个文件需 ...
- 简单编写Makefile
相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide.其实makefile并没有 ...
- [转]Linux中configure/makefile
本文教你如何使用autoconf.automake等来制作一个以源代码形式(.tar.gz)发布的软件.并可在执行configure时使用自定义参数. 一.概述和基础知识 在Linux下得到一个以源代 ...
- Linux内核配置、编译及Makefile简述
Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核. ...
- make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”
默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...
- 实例:对2个Makefile的备注
实例1:Makefile编译链接简单.c函数 example.c Makefile exe: example.c gcc example.c -o exe clean: rm exe 执行效果: 实例 ...
- Linux中C程序调试、makefile
gcc基本语法格式:gcc [-选项] 源文件 [-选项] 目标文件,GCC编译C程序的过程: 预处理:gcc -E hello.c hello.i.-E指定执行到预处理结束,下面类似. 编译:gcc ...
- Linux工具入门:make工具与Makefile文件
1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...
随机推荐
- java.io.IOException: Timed out waiting 20000ms for a quorum of nodes to respond
16-11-14 21:23:41,540 FATAL org.apache.hadoop.hdfs.server.namenode.FSEditLog: Error: starting log se ...
- HTTP状态码查询
如果客户端向服务器发出了某项请求要求显示网站上的某个网页,那么,服务器会返回 HTTP 状态代码以响应该请求. 一些常见的状态代码为: 200 - 服务器成功返回网页 403 - 请求的网页禁止访问 ...
- Always review
Data structures A data structure is a way to store and organize data in order to facilitate access a ...
- Cookie对象
Cookie对象用于保存客户端浏览器请求的服务器页面,也可用于存放非敏感性的用户信息,信息保存的时间可以根据用户的需要进行设置.并非所有的浏览器都支持Cookie,并且数据信息是以文本的形式保存在客户 ...
- AngularJs angular.identity和angular.noop
angular.identity 函数返回本身的第一个参数.这个函数一般用于函数风格. 格式:angular.identity() 使用代码: (function () { angular.modul ...
- codevs 1051 接龙游戏(栈模拟)
传送门 Description 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙). 你的任务是:对于输入的单词,找出最长的龙. I ...
- CloseHandle(IntPtr handle)抛异常
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static ext ...
- Linux系统被入侵后处理经历
服务器托管在外地机房. 突然,频繁收到一组服务器ping监控不可达邮件,赶紧登陆zabbix监控系统查看流量状况. 可见流量已经达到了800M左右,肯定不正常,马上尝试SSH登陆系统,不幸的事,这种情 ...
- JavaWeb---总结(十七)JSP中的九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- String 类相关知识
1.常用方法 1)判断字符串是否为空 public boolean isEmpty()2)获取字符串长度 public int length()3)截取子子串 public String substr ...