C++学习笔记25:makefile文件2
Makefile文件语法
行解析:命令按行解析
命令行的行首字符为Tab键,其他行的行首字符不得为Tab键,但可以使用多个空格缩进
换行:命令太长时,行尾使用"\"换行
注释:行首字符为“#”的文本行
关闭回显:在行首字符后和命令前添加“@”
- 未关闭回显时,make会首先回显(打印)命令,然后执行该命令
- 通常仅在注释和纯显示的echo命令前使用此功能
include filename:包含其他文件
- 处理模式与c/c++类似
- 行首加“-”:忽略文件包含错误
通配符
“*”(任意数目的任意字符),例如“*.c”表示所有的.c文件
“?”(任意一个字符)例如:?.c表示单字符文件名
“[abc]”(存在括号内的某个字符),例如“lib[abc].c”表示第四个字符为a,b,或者c
“[0-9]"(存在该集合中的某个字符)
“[^abc]”(存在非括号内的某个字符)
变量
基本变量定义:var_name = value
$(变量名称):引用变量(中间无多余空格);shell变量用"$$",例如:@echo $$HOME
变量在使用时展开,形式上类似宏替换
变量的使用场合:目标,先决条件,命令,新的变量
内置变量
$(CC):当前使用的编译器;$(MAKE):当前使用的make工具
自动变量
$@:当前目标;$<:当前目标的首个先决条件;
$?:比目标更新的所有先决条件
$^:所有先决条件
$(@D)和$(@F):$@的目录名和文件名;
$(<D)和$(<F):$<的目录名和文件名
例子:
#makefile样本
objs = main.o library.o
prog:$(objs)
$(CC) -o prog $(objs)
@echo "constructed..."
main.o:main.c library.h
$(CC) -c main.c
library.o:library.c library.h
$(CC) -c library.c
.PHONY:clean
clean:
rm -f prog $(objs)* ~
备注:~为生成的备份文件
变量定义格式
var_name = value :在执行时扩展,允许递归,可以使用后续代码中出现的值
var_name = value :在定义时扩展,不允许递归,使用右侧的现值,不能使用后续代码中出现的值
var_name ?= value:只有在该变量为空时才设置值,否则维持原值
var_name += value:将值追加到变量的尾部;若变量未定义,则“+=”自动解释为“=” ;若便令已定义,则“+=”继承上次的操作符,并追加新的值
多行变量
define var_name
@echo "One"
@echo "Two"
endef
define 和 endef 行首字符不能为Tab键,对齐时可使用空格
引用:$(var_name)
多行变量主要用于定义命令包,使用时要特别小心,展开时有可能导致脚本错误
目标变量:类似局部变量 ,仅对本目标规则链有效
-target...:var_name = value:定义目标变量
静态模式:以“%”通配
target...:target-pattern:prerequisites...
[Tab键]commands
目的:用于处理模式相同的多目标,简化脚本代码
例子:每个目标的文件以“.o”结尾,先决条件为对应的“.c”
objs = main.o library.o
$(objs):%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@
以上等价于:
main.o:main.c
$(CC) -c $(CFLAGS)main.c -o main.o
library.o:library.c
$(CC) -c $(CFLAGS)library.c -o library.o
条件判断基本格式
conditional-directive
text-if-true
endif
----------------------------------
或者
conditional-directive
text-if-true
else
text-if-true
endif
-------------------------------------
可用的条件判断
判断两个参数是否相等
ifeq(arg1,arg2),ifeq 'arg1' 'arg2'
ifeq "arg1" "arg2"
判断两个参数是否不相等(同上)
判断某个变量是否已定义:ifdef variable_name
判断某个变量是否未定义:ifndef variable_name
循环:可以在makefile中使用shell循环
rulefor:
for filename in `echo $(objs)`;\
do \
rm -f $$filename;\
done
注意事项
循环为shell循环,为保证多行命令在同一个进程中执行,必须合并成单条命令并在行尾添加分行标示
可以使用反引号执行命令,所获得的结果集合可以作为循环的处理集合
filename本身是shell变量,需要使用“$$”引用
函数:像变量一样使用"$()"标识
$(function arg1,arg2,...):函数调用,函数名字为function,后跟着逗号分隔的参数列表,函数参数前后不能有多余的空格
$(subst from,to,text):make的字符串替换函数,将text中的from字符串替换为to,返回替换后的字符串
例子:
comma := ,
#定义空值
empty:=
#定义空格
space := $(empty) $(empty)
foo := a b c
#将“a b c”替换为“a,b,c”
bar := $(subst $(space) $(comma) $(foo))
C++学习笔记25:makefile文件2的更多相关文章
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
- matlab学习笔记5--低级文件输入输出函数
一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...
- thinkphp学习笔记2—入口文件
原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...
- linux命令学习笔记(25):linux文件属性详解
Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组. 最近访问或修改的时间等内容.具体情况如下: 命令: ls -lih 输出: [root@loc ...
- Linux 编程学习笔记----动笔makefile档
Befroe Beginning. 在设置暑假的plan ,关于Linux的书籍如今在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 如今開始关于Linux ...
- [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Windows phone 8 学习笔记(2) 数据文件操作(转)
Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...
随机推荐
- 转别人的 STM32外部中断使用注意事项
前言:这些问题都是我之前在工作中遇到的,后来觉得需要总结,自己记忆不好,所以在这个给自己打个mark. 一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 ST ...
- python时间格式化
import timeprint time.time()输出的结果是:1279578704.6725271 但是这样是一连串的数字不是我们想要的结果,我们可以利用time模块的格式化时间的方法来处理: ...
- struts入门实例
入门实例 1 .下载struts-2.3.16.3-all .不摆了.看哈就会下载了. 2 . 解压 后 找到 apps 文件夹. 3. 打开后将 struts2-blank.war ...
- DataStructure——红黑树学习笔记
1.前言 本文伪码和解释参考: http://blog.csdn.net/v_JULY_v/article/details/6105630 C实现的源码本文未贴出,请见: http://blog.cs ...
- BOM 和DOM
BOM 1.BOM:浏览器对象模型(Browser Object Model)尚无正式标准: 2.Window 对象:所有浏览器都支持 window 对象.它表示浏览器窗口. 3.Window 尺寸 ...
- AngularJS的学习笔记(一)
声明:单纯作为我自己的学习笔记,纯是为了自己学习,上面的话都是从各处粘贴,如有冒犯,请原谅我这个小菜鸟~ AngularJS使用了不同的方法,它尝试去补足HTML本身在构建应用方面的缺陷. 使用双大括 ...
- 【转载】cmake编写
Cmake的输入是在源码目录下的CMakeLists.txt文件.这个文件可以用include或者 add_subdirectory 命令增加入其它的输入文件. 语法 CMakeList.txt文件是 ...
- window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法
window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法 本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装 ...
- nginx 高并发配置参数(转载)
声明:原文章来自http://blog.csdn.net/oonets334/article/details/7528558.如需知道更详细内容请访问. 一.一般来说nginx 配置文件中对优化比较有 ...
- AsyncTask异步交互和httpurlconnection结合使用
//网络请求数据 package com.baidu.myutils; import java.io.BufferedReader; import java.io.InputStreamReader; ...