当前位置: 首页 > news >正文

安庆网站建设服务网赣州人才网招聘找工作

安庆网站建设服务网,赣州人才网招聘找工作,旅行社网站建设规划书论文,去广告店当学徒有用吗原标题#xff1a;Linux Make 命令教程来自#xff1a;阮一峰的网络日志链接#xff1a;www.ruanyifeng.com/blog/2015/02/make.html代码变成可执行文件#xff0c;叫做编译(compile)#xff1b;先编译这个#xff0c;还是先编译那个(即编译的安排)#xff0c;叫做构建(…原标题Linux Make 命令教程来自阮一峰的网络日志链接www.ruanyifeng.com/blog/2015/02/make.html代码变成可执行文件叫做编译(compile)先编译这个还是先编译那个(即编译的安排)叫做构建(build)。Make是最常用的构建工具诞生于1977年主要用于C语言的项目。但是实际上 任何只要某个文件有变化就要重新构建的项目都可以用Make构建。本文介绍Make命令的用法从简单的讲起不需要任何基础只要会使用命令行就能看懂。我的参考资料主要是Isaac Schlueter的《Makefile文件教程》和《GNU Make手册》。一、Make的概念Make这个词英语的意思是制作。Make命令直接用了这个意思就是要做出某个文件。比如要做出文件a.txt就可以执行下面的命令。$ make a.txt但是如果你真的输入这条命令它并不会起作用。因为Make命令本身并不知道如何做出a.txt需要有人告诉它如何调用其他命令完成这个目标。比如假设文件 a.txt 依赖于 b.txt 和 c.txt 是后面两个文件连接(cat命令)的产物。那么make 需要知道下面的规则。a.txt: b.txt c.txtcat b.txt c.txt a.txt也就是说make a.txt 这条命令的背后实际上分成两步第一步确认 b.txt 和 c.txt 必须已经存在第二步使用 cat 命令 将这个两个文件合并输出为新文件。像这样的规则都写在一个叫做Makefile的文件中Make命令依赖这个文件进行构建。Makefile文件也可以写为makefile 或者用命令行参数指定为其他文件名。$ make -f rules.txt# 或者$ make --filerules.txt上面代码指定make命令依据rules.txt文件中的规则进行构建。总之make只是一个根据指定的Shell命令进行构建的工具。它的规则很简单你规定要构建哪个文件、它依赖哪些源文件当那些文件有变动时如何重新构建它。二、Makefile文件的格式构建规则都写在Makefile文件里面要学会如何Make命令就必须学会如何编写Makefile文件。2.1 概述Makefile文件由一系列规则(rules)构成。每条规则的形式如下。 : [tab] 上面第一行冒号前面的部分叫做目标(target)冒号后面的部分叫做前置条件(prerequisites)第二行必须由一个tab键起首后面跟着命令(commands)。目标是必需的不可省略前置条件和命令都是可选的但是两者之中必须至少存在一个。每条规则就明确两件事构建目标的前置条件是什么以及如何构建。下面就详细讲解每条规则的这三个组成部分。2.2 目标(target)一个目标(target)就构成一条规则。目标通常是文件名指明Make命令所要构建的对象比如上文的 a.txt 。目标可以是一个文件名也可以是多个文件名之间用空格分隔。除了文件名目标还可以是某个操作的名字这称为伪目标(phony target)。clean:rm *.o上面代码的目标是clean它不是文件名而是一个操作的名字属于伪目标 作用是删除对象文件。$ make clean但是如果当前目录中正好有一个文件叫做clean那么这个命令不会执行。因为Make发现clean文件已经存在就认为没有必要重新构建了就不会执行指定的rm命令。为了避免这种情况可以明确声明clean是伪目标写法如下。.PHONY: cleanclean:rm *.o temp声明clean是伪目标之后make就不会去检查是否存在一个叫做clean的文件而是每次运行都执行对应的命令。像.PHONY这样的内置目标名还有不少可以查看手册。如果Make命令运行时没有指定目标默认会执行Makefile文件的第一个目标。$ make上面代码执行Makefile文件的第一个目标。2.3 前置条件(prerequisites)前置条件通常是一组文件名之间用空格分隔。它指定了目标是否重新构建的判断标准只要有一个前置文件不存在或者有过更新(前置文件的last-modification时间戳比目标的时间戳新)目标就需要重新构建。result.txt: source.txtcp source.txt result.txt上面代码中构建 result.txt 的前置条件是 source.txt 。如果当前目录中source.txt 已经存在那么make result.txt可以正常运行否则必须再写一条规则来生成 source.txt 。source.txt: echo this is the source source.txt上面代码中source.txt后面没有前置条件就意味着它跟其他文件都无关只要这个文件还不存在每次调用make source.txt它都会生成。$ make result.txt$ make result.txt上面命令连续执行两次make result.txt。第一次执行会先新建 source.txt然后再新建 result.txt。第二次执行Make发现 source.txt 没有变动(时间戳晚于 result.txt)就不会执行任何操作result.txt 也不会重新生成。如果需要生成多个文件往往采用下面的写法。source: file1 file2 file3上面代码中source 是一个伪目标只有三个前置文件没有任何对应的命令。$ make source执行make source命令后就会一次性生成 file1file2file3 三个文件。这比下面的写法要方便很多。$ make file1$ make file2$ make file32.4 命令(commands)命令(commands)表示如何更新目标文件由一行或多行的Shell命令组成。它是构建目标的具体指令它的运行结果通常就是生成目标文件。每行命令之前必须有一个tab键。如果想用其他键可以用内置变量.RECIPEPREFIX声明。.RECIPEPREFIX all: echo Hello, world上面代码用.RECIPEPREFIX指定大于号()替代tab键。所以每一行命令的起首变成了大于号而不是tab键。需要注意的是每行命令在一个单独的shell中执行。这些Shell之间没有继承关系。var-lost:export foobarecho foo[$$foo]上面代码执行后(make var-lost)取不到foo的值。因为两行命令在两个不同的进程执行。一个解决办法是将两行命令写在一行中间用分号分隔。var-kept: export foobar; echo foo[$$foo]另一个解决办法是在换行符前加反斜杠转义。var-kept:export foobar;echo foo[$$foo]最后一个方法是加上.ONESHELL:命令。.ONESHELL:var-kept: export foobar; echo foo[$$foo]三、Makefile文件的语法3.1 注释井号(#)在Makefile中表示注释。# 这是注释result.txt: source.txt# 这是注释cp source.txt result.txt # 这也是注释3.2 回声(echoing)正常情况下make会打印每条命令然后再执行这就叫做回声(echoing)。test:# 这是测试执行上面的规则会得到下面的结果。$ make test# 这是测试在命令的前面加上就可以关闭回声。test: # 这是测试现在再执行make test就不会有任何输出。由于在构建过程中需要了解当前在执行哪条命令所以通常只在注释和纯显示的echo命令前面加上。test: # 这是测试 echo TODO3.3 通配符通配符(wildcard)用来指定一组符合条件的文件名。Makefile 的通配符与 Bash 一致主要有星号(*)、问号()和 [...] 。比如 *.o 表示所有后缀名为o的文件。clean: rm -f *.o3.4 模式匹配Make命令允许对文件名进行类似正则运算的匹配主要用到的匹配符是%。比如假定当前目录下有 f1.c 和 f2.c 两个源码文件需要将它们编译为对应的对象文件。%.o: %.c等同于下面的写法。f1.o: f1.cf2.o: f2.c使用匹配符%可以将大量同类型的文件只用一条规则就完成构建。3.5 变量和赋值符Makefile 允许使用等号自定义变量。txt Hello Worldtest: echo $(txt)上面代码中变量 txt 等于 Hello World。调用时变量需要放在 $( ) 之中。调用Shell变量需要在美元符号前再加一个美元符号这是因为Make命令会对美元符号转义。test: echo $$HOME有时变量的值可能指向另一个变量。v1 $(v2)上面代码中变量 v1 的值是另一个变量 v2。这时会产生一个问题v1 的值到底在定义时扩展(静态扩展)还是在运行时扩展(动态扩展)如果 v2 的值是动态的这两种扩展方式的结果可能会差异很大。为了解决类似问题Makefile一共提供了四个赋值运算符 (、:、、)它们的区别请看StackOverflow。VARIABLE value# 在执行时扩展允许递归扩展。VARIABLE : value# 在定义时扩展。VARIABLE ? value# 只有在该变量为空时才设置值。VARIABLE value# 将值追加到变量的尾端。3.6 内置变量(Implicit Variables)Make命令提供一系列内置变量比如$(CC) 指向当前使用的编译器$(MAKE) 指向当前使用的Make工具。这主要是为了跨平台的兼容性详细的内置变量清单见手册。output: $(CC) -o output input.c3.7 自动变量(Automatic Variables)Make命令还提供一些自动变量它们的值与当前规则有关。主要有以下几个。(1)$$指代当前目标就是Make命令当前构建的那个目标。比如make foo的 $ 就指代foo。a.txt b.txt: touch $等同于下面的写法。a.txt: touch a.txtb.txt: touch b.txt(2)$$ 指代第一个前置条件。比如规则为 t: p1 p2那么$ 就指代p1。a.txt: b.txt c.txt cp $ $等同于下面的写法。a.txt: b.txt c.txt cp b.txt a.txt(3)$?$? 指代比目标更新的所有前置条件之间以空格分隔。比如规则为 t: p1 p2其中 p2 的时间戳比 t 新$?就指代p2。(4)$^$^ 指代所有前置条件之间以空格分隔。比如规则为 t: p1 p2那么 $^ 就指代 p1 p2 。(5)$*$* 指代匹配符 % 匹配的部分 比如% 匹配 f1.txt 中的f1 $* 就表示 f1。(6)$(D) 和 $(F)$(D) 和 $(F) 分别指向 $ 的目录名和文件名。比如$是 src/input.c那么$(D) 的值为 src $(F) 的值为 input.c。(7)$($(所有的自动变量清单请看手册。下面是自动变量的一个例子。dest/%.txt: src/%.txt [ -d dest ] || mkdir dest cp $ $上面代码将 src 目录下的 txt 文件拷贝到 dest 目录下。首先判断 dest 目录是否存在如果不存在就新建然后$ 指代前置文件(src/%.txt) $ 指代目标文件(dest/%.txt)。3.8 判断和循环Makefile使用 Bash 语法完成判断和循环。ifeq ($(CC),gcc) libs$(libs_for_gcc)else libs$(normal_libs)endif上面代码判断当前编译器是否 gcc 然后指定不同的库文件。LIST one two threeall:for i in $(LIST); doecho $$i;done# 等同于all:afor i in one two three; doecho $i;done上面代码的运行结果。onetwothree3.9 函数Makefile 还可以使用函数格式如下。$(function arguments)# 或者${function arguments}Makefile提供了许多内置函数可供调用。下面是几个常用的内置函数。(1)shell 函数shell 函数用来执行 shell 命令srcfiles : $(shell echo src/{00..99}.txt)(2)wildcard 函数wildcard 函数用来在 Makefile 中替换 Bash 的通配符。srcfiles : $(wildcard src/*.txt)(3)subst 函数subst 函数用来文本替换格式如下。$(subst from,to,text)下面的例子将字符串feet on the street替换成fEEt on the strEEt。$(subst ee,EE,feet on the street)下面是一个稍微复杂的例子。comma: ,empty:# space变量用两个空变量作为标识符当中是一个空格space: $(empty) $(empty)foo: a b cbar: $(subst $(space),$(comma),$(foo))# bar is now a,b,c.(4)patsubst函数patsubst 函数用于模式匹配的替换格式如下。$(patsubst pattern,replacement,text)下面的例子将文件名x.c.c bar.c替换成x.c.o bar.o。$(patsubst %.c,%.o,x.c.c bar.c)(5)替换后缀名替换后缀名函数的写法是变量名 冒号 后缀名替换规则。它实际上patsubst函数的一种简写形式。min: $(OUTPUT:.js.min.js)上面代码的意思是将变量OUTPUT中的后缀名 .js 全部替换成 .min.js 。四、Makefile 的实例(1)执行多个目标.PHONY: cleanall cleanobj cleandiffcleanall : cleanobj cleandiffrm programcleanobj :rm *.ocleandiff :rm *.diff上面代码可以调用不同目标删除不同后缀名的文件也可以调用一个目标(cleanall)删除所有指定类型的文件。(2)编译C语言项目edit : main.o kbd.o command.o display.occ -o edit main.o kbd.o command.o display.omain.o : main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.hcc -c display.cclean :rm edit main.o kbd.o command.o display.o.PHONY: edit clean今天Make命令的介绍就到这里。下一篇文章我会介绍如何用 Make 来构建 Node.js 项目。返回搜狐查看更多责任编辑
http://wiki.neutronadmin.com/news/221620/

相关文章:

  • 广州网站开发学校集团高端网站
  • 商业案例网站上海cms模板建站
  • 中国热门网站源汇区建设局网站
  • 网站开发者模式有什么用软件开发公司的成本有哪些
  • 教育培训东莞网站建设常平哪里有招计算机网站开发的
  • 装饰网站建设软件下载如何用wordpress插件下载
  • 网站制作时间代码电脑版和手机版网站怎么做
  • 网站视频转码软件杭州公司注册费用
  • 长沙 php企业网站系统wordpress 后台 重定向循环
  • 网站后台怎样推荐图片怎么找到那个网站
  • 上海网站建设专业公司国际贸易综合服务平台
  • 制作流程图的网站wordpress 文件结构
  • 怎么用自己的网站做邮箱企业建站套餐价格表
  • 管理系统网站镇海seo专业优化平台
  • 文山知名网站建设公司wordpress评分中文版
  • jsp做网站黑河做网站的公司
  • 网站建设怎样中英文wordpress 注册会员默认权限
  • 重庆本地网站有哪些全国政务网站哪家做的好
  • 宁波网站建设seo网站开发设计大概多少费用
  • 企业网站 三网系统百度应用平台
  • 各行各业网站建设服务周到h5
  • 网站建设幻灯片背景图片素材wordpress本地很慢
  • 重庆承越网站制作公司安全文化建设方案细则
  • 做视频哪个网站素材好做网站公司宁波
  • 建设公司网站账务处理wordpress插件目录下
  • 网页制作与网站建设教程视频nike网站建设分析
  • 网站服务器查找国外wordpress主题交易平台
  • 哈尔滨自助建站网站系统阿里巴巴外贸平台是什么
  • 食品电子商务网站建设论文织梦修改网站主页
  • 招聘网站建设规划书wordpress怎么禁google