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的更多相关文章

  1. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  2. matlab学习笔记5--低级文件输入输出函数

    一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...

  3. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  4. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  5. thinkphp学习笔记2—入口文件

    原文:thinkphp学习笔记2-入口文件 在thinkphp中有两个入口文件,一个是项目的入口文件,是index.php在主目录里面,还有一个是thinkphp框架的的入口文件,放在框架目录下面如: ...

  6. linux命令学习笔记(25):linux文件属性详解

    Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组. 最近访问或修改的时间等内容.具体情况如下: 命令: ls -lih 输出: [root@loc ...

  7. Linux 编程学习笔记----动笔makefile档

    Befroe Beginning. 在设置暑假的plan ,关于Linux的书籍如今在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 如今開始关于Linux ...

  8. [原创]java WEB学习笔记49:文件上传基础,基于表单的文件上传,使用fileuoload 组件

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. Windows phone 8 学习笔记(2) 数据文件操作(转)

    Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...

随机推荐

  1. 自己不懂的SQL语句用法

    left  join:是SQL语言中的查询类型,即连接查询.它的全称为左外连接,是外连接的一种. 连接通常可以在select语句的from子句或where子句中建立,其语法格式为: select  c ...

  2. html中frameset简介

    1, 只 要 <FRAMESET> <FRAME> 两个标签,框架便是网页画面分成几个框窗,同时取得多个 URL. 2, 该框架只记录如何划分,不会显示任何资料.所以不必放入 ...

  3. C++与C的关系

     C是结构化和模块化的语言,是基于过程的.        C++是面向对象的程序设计语言.        C++是C的超集,对C的功能做了扩充,增加了面向对象的机制.        C++包含头文件的 ...

  4. hihoCoder#1121

    刚开始学习C语言,准备在做hiho的题目的过程中来学习,在此进行记录,如果代码中有错误或者不当的地方还请指正. 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我 ...

  5. SQL Server中cursor的使用步骤

    参考文章: http://www.cnblogs.com/knowledgesea/p/3699851.html http://www.cnblogs.com/moss_tan_jun/archive ...

  6. php 文件操作

    $fn="e:\debug.txt"; if(is_writable($fn)==false){ die("不能写入"); } file_put_content ...

  7. 初步了解JPA

    想当初07.08年的时候,毕业之季,正思考着离开学校要去做什么工作.为了有一份薪资不错,可以长久发展,也正是自己喜欢的行业.于是乎决定投身于计算机行业.当年正是JAVA的火热时期.到处都是JAVA培训 ...

  8. iscroll修改

    近期项目中使用iScroll遇到一个问题,在设定wrapper为横向滚动时,如果你手指放在该区域,将无法拉动页面,也就是说该区域取消了默认事件.这个体验是实在是无法接受,特别是页面中有多个横向滚动区域 ...

  9. js中快速获取数组中的最大值最小值

    var a=[1,2,3,5]; alert(Math.max.apply(null, a));//最大值 alert(Math.min.apply(null, a)); //最小值 多维数组如下 v ...

  10. Facebook 帆布接入的总结

    研究接入facebook也有不短的时间, 上线过几款产品,这里把接入所有的点 都记录一下. 1.首先进入facebook的开发者页面,直接入口在右下角更多里面 然后注册开发者账号, 创建APP 选择F ...