Makefile初级语法1
Makefile基本规则
基本规则如下:
target [target...] : [dependent ...][ command ...]
# command前必须是TAB
语法示例分析:
helloworld.o: main.o print_hello.ogcc -o helloworld main.o print_hello.o
则对比可看书':'前为target名字,后为依赖。命令行必须为TAB开头。我们发现这里的命令和我们直接在终端执行的命令一样,即shell command可以在Makefile中使用,对的,这也是有些人认为Makefile是增强版的Shell的原因。 我们想执行此target,则执行’Make target‘即可(示例,则执行make helloworld.o)。
Makefile初级语法
Makefile语法中除了基本规则外,Makefile还支持宏定义,显性隐性规则等其他语法。基本的语法有:
- 宏定义 Makefile中的宏定义类似于变量定义。语法点有: 1. 两种格式
# '='可以使用在后面定义的变量 OBJS_1 = ProgramA.o ProgramB.o ${OBJS_2} OBJS_2 = ProgamC.o ProgramD.o # ':='仅能使用在前面定义的变量 OBJS_3 := ProgamE.o ProgramF.o ${OBJS_4} OBJS_4 = ProgramG.o ProgramH.o ${OBJS_2}
我们用以Macros_Makefile文件来进行这两个格式的对比
OBJS_1 = ProgramA.o ProgramB.o ${OBJS_2} OBJS_2 = ProgamC.o ProgramD.o OBJS_3 := ProgamE.o ProgramF.o ${OBJS_4} OBJS_4 = ProgramG.o ProgramH.o ${OBJS_2}macro_1:echo ${OBJS_1} macro_2:echo ${OBJS_3}
则执行结果为:
$ make -f Macros_Makefile macro_1 echo ProgramA.o ProgramB.o ProgamC.o ProgramD.o ProgramA.o ProgramB.o ProgamC.o ProgramD.o $ make -f Macros_Makefile macro_2 echo ProgamE.o ProgramF.o ProgamE.o ProgramF.o
可看到':='使用后面的宏定义并不能生效。 除了在Makefile中定义宏,我们在运行脚本时也可以指定宏,如下:
$ make -f Macros_Makefile OBJS_4='ProgamZ.o' macro_2 echo ProgamE.o ProgramF.o ProgamZ.o ProgamE.o ProgramF.o ProgamZ.o
2. Override宏 我们看到宏在运行时可被重新定义,如果不想被重新定义,则需要使用override来声明宏. 更新Macros_Makefile如下
OBJS_1 = ProgramA.o ProgramB.o ${OBJS_2} OBJS_2 = ProgamC.o ProgramD.o OBJS_3 := ProgamE.o ProgramF.o ${OBJS_4} OBJS_4 = ProgramG.o ProgramH.o ${OBJS_2} override OBJS_5 := ProgramI.o ${OBJS_4}macro_1:echo ${OBJS_1} macro_2:echo ${OBJS_3} macro_3:echo ${OBJS_5}
则执行如下:
$ make -f Macros_Makefile OBJS_5='ProgamZ.o' macro_3 echo ProgramI.o ProgramG.o ProgramH.o ProgamC.o ProgramD.o ProgramI.o ProgramG.o ProgramH.o ProgamC.o ProgramD.o
3.目标变量
<target ...> :: <variable-assignment> <target ...> :: ...
我们在Makefile开头定义的宏为全局宏,对所有的target均有效。 而当我们需要定义仅对某一特定目标生效的宏时,我们需要定义目标宏。 我们在TargetMacros_Makefile中进行实验
OBJ1 = programA.otarget_macro_1: OBJ1 = programB.o target_macro_1:echo ${OBJ1}
则执行结果如下
$ make -f TargetMacros_Makefile target_macro_1 echo programB.o programB.o
- 指定文件路径 当Makefile中牵涉到的文件在不同目录时,我们需要将原文件的路径明确的写在Makefile中,便于Makefile在执行编译时进行查找。Makefile中VPATH这个特殊的变量帮助我们实现这一功能。 VPATH的使用方法有以下几种
vpath = <directories> :: 当前目录中找不到文件时, 就从<directories>中搜索 vpath <pattern> <directories> :: 符合<pattern>格式的文件, 从<directories>中搜索 vpath <pattern> :: 清除符合<pattern>格式的文件搜索路径 vpath = :: 清除所有已经设置好的文件路径
我们把所有编译程序放到src文件夹下,编写VPATH_Makefile来实验第一种用法
VPATH = ./srcGCC = gcc OBJECTS = main.o print_hello.o HEAD_SOURCE = print_hello.hhelloword.o: ${OBJECTS}${GCC} -o helloworld ${OBJECTS}${OBJECTS}: ${HEAD_SOURCE} main.o: main.c print_hello.o: print_hello.cclean:rm helloworld ${OBJECTS}
则通过执行‘make -f VPATH_Makefile helloword.o’可得到可执行文件
- 命令前缀 我们调用命令时,希望命令根据执行时不同的输出及不同的遇错反映,有三种命令格式
@rm helloworld # '@'前缀表示,只输出结果,遇错停止执行 _rm helloworld # '_'前缀表示,输出执行命令和结果,遇错继续执行 rm helloworld # 无前缀,输出执行命令和结果,遇错停止执行
我们编写Prefix_Makefile来进行实验
test_@:@echo "test the @rm for unexisting files"@rm unexisting_files@echo "echoing after the failure"test_-:@echo "testing the '-rm' for unexisting files"-rm unexisting_files@echo "echoing after the failure"test_:@echo "testing the 'rm' for unexisting files"rm unexisting_files@echo "echoing after the failure"
实验结果为:
$ make -f Prefix_Makefile test_@test the @rm for unexisting filesrm: cannot remove ‘unexisting_files’: No such file or directorymake: *** [test_@] Error 1$ make -f Prefix_Makefile test_-testing the '-rm' for unexisting filesrm unexisting_filesrm: cannot remove ‘unexisting_files’: No such file or directorymake: [test_-] Error 1 (ignored)echoing after the failure$ make -f Prefix_Makefile test_testing the 'rm' for unexisting filesrm unexisting_filesrm: cannot remove ‘unexisting_files’: No such file or directorymake: *** [test_] Error 1
在这一章节中我们学习了,Makefile的基本规则,如何定义编译,查找文件以及调用命令,着手写一些简单的Makefile吧。
Makefile初级语法1相关推荐
- Makefile的语法
一.介绍 1.makefile的条目组成 Linux中使用make命令来编译程序,而make命令所执行的动作依赖于Makefile文件.最简单的Makefile文件如下: hello: hello.c ...
- make工具和Makefile基础语法(含有交叉编译、pthread_create()的处理)
目录 含有交叉编译.pthread_create()处理 初次使用 1.编写Makefile文件 2.make 3.make clean Makefile基本语法 1.Makefile规则格式 2.变 ...
- 日语初级语法复习 Day 17 Summary(更新中)
日语初级语法复习 Day17 所有语法,例句统合 Day 1 --は-- 王さんは大学生です. これ/それ/あれ/どれ おすすめはどれですか だれ⇒どなた ここ/そこ/あそこ/どこ ここ/そこ/あそこ ...
- Verilog初级教程(2)Verilog HDL的初级语法
文章目录 前言 正文 注释 空格 操作符 数字格式 字符串 标识符 关键字 verilog修订 写在最后 前言 学习Verilog和学习任何一门编程语言一样,都需要从语法开始,不会语法去学习设计是几乎 ...
- 日语初级语法复习整合 Day 11 - Day 15 Summary
日语初级语法复习整合 Day 11 - Day 15 Day 11 -でしょうか.方をする.名詞+で+できた- 前田さんはもう帰ったでしょうか. 今.東京は暑いでしょうか. この問題はそんなに簡単でし ...
- Linux下Makefile编写语法
原创 Linux下Makefile编写语法 2016-07-29 08:31:53 Datrilla 阅读数 1386更多 分类专栏: Linux Makefile 版权声明:本文为博主原创文章,遵循 ...
- Makefile文件语法规则及用法总结
一.Makefile的作用 Makefile文件实质上就是一个工程代码编译脚本,一旦写好,只需要一个make命令,整个工程就会自动按照脚本的规定方式编译,极大的提高了软件开发的效率. make是系统指 ...
- Linux后台开发系列之「09.Makefile 基础语法」
Makefile 版权声明:本文为 cdeveloper 原创文章,可以随意转载,但必须在明确位置注明出处! Makefile 简介 Makefile 是一个管理项目的配置文件,它主要有 2 个作用: ...
- 【makefile基本语法】
makefile基本语法 新建makefile 赋值 := = ?= += 换行符 \ 自动化变量 普通makefile 用变量表示依赖文件 使用通配符%和自动化变量$@ $<替代依赖和目标 使 ...
最新文章
- pycharm debug后会出现 step over /step into/step into my code /force step into /step out 分别表示...
- SAP MM MIGO界面‘Where’标签页里的storage bin
- ubuntu安装mysql可视化工具MySQL-workbench及简单操作
- sql 不等于空_SQL的简单查询
- 【DND图形库】四、文本绘制和按键检测
- mysql引擎inndbmmyisam_Mysql中MyISAM引擎和InnoDB引擎的比较
- 八个led闪烁c语言程序,闪烁的LED
- 中文依存句法分析概述及应用
- python程序设计方法学_python学习笔记(12)--程序设计方法学
- 以JTextPanel为例Swing的鼠标事件详解
- 人月神话(40周年中文纪念版)
- python版问答聚合采集工具源代码+反编译完美还原
- FPGA图像处理 浅浅浅浅浅记
- 中央电大 c语言程序设计a 试题,中央电大208年秋C语言程序设计A试题1.doc
- 非对称加密(RSA)详解
- 可以查看计算机主要自启动项的技术,电脑中怎么查看启动项
- 计算机中各进制之间的转换
- Matplotlib 实战总结,超全!超长!
- 一份诚恳的互联网找工作总结和感想(附:怎样花两年时间去面试一个人)
- java实现爬虫爬取京东手机页面