📄 00000001.htm
字号:
cc □c prompt.c <BR> <BR>window.0 : window.c <BR> <BR>cc □c window.c <BR> <BR>当你第一次建造其中一个执行档时,你必须编译basic.c这个档案. 但是只要你没有 <BR>改变basic.c这个档案,也没有删除掉basic.o的话,下一次你想要重新产生新的图形 <BR>介面执行档时,就可以不必再重新编译basic.c. 如果你修改了prompt.c,然后重新建 <BR>立plot_prompt的话,make会去检查修改时间,然后就明白只要重新编译prompt.c,然 <BR>后再连结就可以了. 也就是说,如果你重新下 <BR> <BR>$make plot_prompt <BR> <BR>这个指令,你会在萤幕上看到下面的结果: <BR> <BR>cc □c prompt <BR> <BR>cc □o plot_prompt basic.o prompt.o <BR> <BR>这这些范例之中的描述档,实际上可以被大量的简化. 因为make 有内建的规则和巨 <BR>集(macro)的定义可以用来处理在档案中一再重复出现的附属物(dependencies),例 <BR>如”.o”档案的附属档案”.c”档案,他们都是前面的名称相同,只有副档名不同而 <BR>已. 在第二章 巨集(macro)与第三章 后置规则(suffix rule)的时候,我们会讨论这 <BR>些make的特色. 在这一章里,我们只把附属(dependency)和更新(updating)的概念传 <BR>达给你而已 <BR> <BR> <BR> <BR>引用make(Invoking make) <BR> <BR>前面的几个小节的范例都有以下的假设: <BR> <BR>*专案档(project file),也就是描述档,和原始码放在同一个目录底下 <BR> <BR>*描述档的档名叫做makefile或是Makefile <BR> <BR>*将你键入make指令时,工作目录就是这些档案放置的目录 <BR> <BR>有了这些假设,你只要下一个 <BR> <BR>$make target <BR> <BR>的指令,就可以建立在描述档中的任何一个目标. 建造这个目标所必须要下的指令都 <BR>会被显示在终端机上,然后执行. 如果一些中间档案(intermediate file)已经存在 <BR>或者已经被更新过,make会掠过建造这些中间档案的指令. make只会发出建造这个目 <BR>标所必须执行的最少指令. 如果在上次建造这个目标后,没有任何必备档案被修改或 <BR>是移除,make会发出一个讯息 <BR> <BR>‘target’ is up to date <BR> <BR>然后什么事情也不做. <BR> <BR>如果你想要建造在描述档中没有指定,而且也不被第三章 后置规则(suffix rule)中 <BR>所讨论的内定规则所涵盖的目标,例如:你下了一个指令建造一个不存在的目标 <BR> <BR>$make nottarget <BR> <BR>则make会回应: <BR> <BR>‘nottarget’ is up to date <BR> <BR>或是 <BR> <BR>make: Don’t know ho to make nontarget. Stop. <BR> <BR>如果再目前的工作目录之下真的有nontarget这个档案存在,就会发出上面的第一个 <BR>讯息. 第七章 问题解决(troubleshooting)时,会解释在不同的环境下,make所发述 <BR>的讯息所代表的涵义. <BR> <BR>我们可以一次要make建立好几个目标. 这个命令的效果就跟连续的发出好几个make <BR>命令相同,例如: <BR> <BR>$make main.o target <BR> <BR>就相当于 <BR> <BR>$make main.o <BR> <BR>$make target <BR> <BR>一样 <BR> <BR>我们也可以只简单的打上 <BR> <BR>$make <BR> <BR>没有附上任何的目标名称. 在此情况下,在描述档中的第一个目标将会被建立(同时 <BR>他的必备档也会一起被建立) <BR> <BR>在命令列下发出make指令有许多的选择项(option,通常前面会加上”-“). 例如,你 <BR>可以选择不要在终端机上印出make所发出的命令. 反过来说,你也可以要求印出哪些 <BR>命令会被执行,而实际上并没有执行它们. 这些都会在第六章 命令列的使用与特别 <BR>的目标(Command-line usage and Special targets)中讨论的更仔细. <BR> <BR> <BR> <BR>语法的基本规则(Basic Rules of Syntax) <BR> <BR>在你开始要尝试写自己的描述档之前,你应该了解一些在make所使用的一些难懂的条 <BR>件(requirement),这些条件如果单独从范例中来体会,是不够不清楚的. 完整的语法 <BR>描述可以在附录A 快速参考 中找到. 这一章只是提供一些入门的技巧而已. <BR> <BR>最重要的一条规则就是”每一个命令列的开头都要是一个tab字元(四个空格)”. 一 <BR>个常常犯的错误就是在每个命令列的开头省略了tab字元. 就算在每个命令列中按空 <BR>白键插入四个空白也不行,因为make无法辨别出这就是tab字元,而且非常不幸的,在 <BR>这种情况下,就算出了错误,make也无法提供有用的讯息. <BR> <BR>make是靠开头的那个tab字来辨识命令列,所以一定要注意不要在其他不是命令列的 <BR>那一列之前加上tab字元. 如果你把tab当作第一个字元加在附属列,注解,或这甚至 <BR>是一个空白列之前,你都会得到错误讯息. Tab字元可以用在每一列的任何地方,只有 <BR>在每一列的第一个字元才有上述的限制. <BR> <BR>如果你想要检查描述档中的tab字元,你可以下指令 <BR> <BR>$cat □v □t □e makefile <BR> <BR>在这里 □v 与 □t会使得描述档中的每一个tab字元以 ^I 的方式印出来,而 □e <BR>会使得每一列的最后以 $ 的样子印出来,所以你可以看出在每一列的结束之前有几 <BR>个空白. <BR> <BR>你可以打很长一串指令,如果已经到了文字编辑器的右边界,你可以在到达右边界之 <BR>前放入一个斜线(\)符号. 你必须确定在新的一列开始之前,会有一个斜线符号在哪 <BR>里.斜线符号和新的一行之间不要有空白(don’t let any white space slip in <BR>between). 由斜线符号所连续的每一列都会被当作单独一列来剖析(parsing). <BR> <BR>make会忽略描述档中的空白行(blank line). 同样的,它也会忽略掉以 # 符号开头, <BR>到每一列结尾之间的字元,所以 # 符号用来当作每个注解的开头. <BR> <BR>命令列跟附属列不一定都要各自占掉一列的空间,你可以写成 <BR> <BR>plot_prompt : prompt.o ; cc □o plot_prompt prompt.o <BR> <BR>虽然之前有说过命令列的开头都要有一个tab字元,不过这里是唯一的例外. <BR> <BR>一个单独的目标也可以用多个附属列来表示. 当你为了要易于区分附属档的的种类 <BR>时,这是一个很实用的技巧,例如 <BR> <BR>file.o : file.c <BR> <BR>cc □c file.c <BR> <BR>…… <BR> <BR>file.o : global.h defs.h <BR> <BR>虽然实际上建造file.o的命令是第一个附属列的下面那一行,即使重新建造 <BR>时,file.c并没有被修改,可是如果附属的.h档被修改过的话,file.o仍然会被重新编 <BR>译. <BR> <BR>如果你使用了多个附属列的技巧,只有其中一个附属列才能有能够伴随有指令列. 但 <BR>是如果你在一个附属列中使用了两个冒号(在第三章 后置规则时会讨论到,这是一个 <BR>在建造函式库时很有用的技巧),则不在此限. <BR> <BR>在描述档中可以有”没有附属档案的目标”(但是冒号还是要打上去,不能省略),这 <BR>些档案通常不全是档名. 例如,许多描述档含有下面的目标,用来帮助程式设计师在 <BR>一天辛苦的测试之后移除暂存档. <BR> <BR>clean : <BR> <BR>/bin/rm □f core *.o <BR> <BR>当我们下指令 <BR> <BR>$make clean <BR> <BR>如果工作目录下没有clean这个档案,make就会去执行claen这个项目下的命令稿 <BR>(command script). 这是因为make把每一个不存在的目标当作是一个过时的目标 <BR> <BR>在每个项目中的命令,就目前来说,应该要是单一一行的Bourne Shell指令.等到你读 <BR>了第四章 指令(command),不要尝试去使用别名(aliases),环境变数(environment <BR>variables),或是像if或for这一类会有很多行的命令,同时要避免使用cd,第四章会 <BR>解释这样做的理由. <BR> <BR>现在你已经能够藉由键入你习惯在终端机前打的指令来建立你自己的描述档了. 但 <BR>是很快的,你会发现非常的乏味. 往后的两章会解释很多可以让你简化(simplify)与 <BR>一般化(generalize)你属于你自己的描述档的方法. <BR> <BR> <BR> <BR> <BR>1998/5/20 interpreted by 王森(moli) <BR> <BR>email address <A HREF="mailto:e9484402@alpha1.dec.ncku.edu.tw">e9484402@alpha1.dec.ncku.edu.tw</A> <BR> <BR>小弟第一次做翻译的工作,如果有错误的地方, <BR> <BR>请来信与我讨论,相信会让下一章的翻译更好 <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.68.98] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -