本文是Rake教程的一篇翻译。原文:http://docs.rubyrake.org/tutorial/chapter01.html
Rake是ruby写的构建工具,采用ruby作为构建语言。Rake在作用和目的上与make类似。Rake一个简单的ruby构建程序与make类似。
Rake有以下特征:
1. Rakefiles(Rake版本的Makefiles)完全采用ruby语法定义,不需编辑xml文件,不需要担心古怪的makefile语法。(到底是tab还是space?)
2. 用户可以指定含先决条件的工作。
3. Rake支持规则模式来匹配动态的工作。
4. Rake是轻量级的。可以作为单独文件分布到其他工程中。依赖于rake的工程并不需要在目标系统中安装rake。
一。Rake简介
近来很多人有类似的讨论,他们真地喜欢Rake,但是对如何入门有些困难。虽然Rake的文档相当地完整,但是都基于用户对其他的构建工具,如ant和make很熟悉这样的假设。真正对于新手入门的材料很少。
这篇教程设法弥补这个缺失。我们将以一个简单的问题开始: 构建简单的C程序。
问题
我们以一个非常简单的构建问题入手。最初使用make构建,现在使用rake。
假设我有一个非常简单的C程序,包含以下几行:
main.c
1 #include "greet.h"
2 int main() {
3 greet ("World");
4 return 0;
5 }
greet.h
1 extern void greet(const char * who);
greet.c
1 #include <stdio.h>
2 void greet (const char * who) {
3 printf ("Hello, %s\n", who);
4 }
(是的,这真是传统的helloworld程序。我说过的我们从基本开始!)
要编译并运行这些文件,需要如下一个简单的shell脚本。
build.sh
1 #include <stdio.h>
2 void greet (const char * who) {
3 printf ("Hello, %s\n", who);
4 }
(cc是C编译器,它根据列出的源文件列表生成输出文件(由-o参数指定))
运行,获得下面的结果。。。
output
1 $ build.sh
2 $ ./hello
3 Hello, World
构建C程序
编译C程序分为两步。首先,编译所有的源文件生成目标文件。 然后将生成的目标文件进行链接生成可执行程序。
下面的图示表明了从源文件到目标文件到可执行程序的过程。
我们的程序规模很小,所以上述的3行构建脚本已经足够。 然而,随着工程规模的扩大,需要管理越来越多的源文件和目标文件。对于某一源文件的某一行的变化而要重新编译整个系统是很不划算的。较有效的方法是重编译少量修改的文件并重新链接。
但是我们如何知道需要重编译的内容呢?如果我们设法手工去跟踪修改会很容易发生错误。此时Rake就变得有用。
文件依赖
首先,让我们看一下何时需要重编译。考虑到main.o,很显然,如果main.c文件改变,我们需要重编译生成main.o。但是其他文件修改是否会触发main.o的重编译呢?
实际上是这样。 从main.c源文件,我们看到它包含greet.h头文件。这意味着对greet.h的任何改变都可能影响到main.o文件。
我们说main.o依赖于main.c和greet.h。在Rake中我们可以用以下代码表示。
Rakefile fragment
1 file "main.o" => ["main.c", "greet.h"]
rake依赖的定义使用标准的ruby代码。这样的好处是我们在应用中可以构造hash类型的参数,并且由于ruby方法调用的参数不需要括号,因此建立一个file工作的代码可以非常自然的读懂。而且它仍旧是ruby代码。
同样,我们可以为构建greet.o定义依赖。
Rakefile fragment
1 file "greet.o" => ["greet.c"]
greet.c包含stdio.h,但stdio.h是系统头文件,不会经常改变。我们将它删除出依赖列表。
最后,我们可以为可执行程序hello定义依赖,它依赖于两个目标文件。
Rakefile fragment
1 file "hello" => ["main.o", "greet.o"]
注意我们要定义hello的直接依赖,是的,hello依赖main.o进而依赖main.c。但是.c文件不是直接用于构建hello,所以可以安全地从依赖列表中忽略。
构建文件
我们已经仔细地指定了文件是如何被关联的。现在我们需要说当需要构建时,rake到底做了什么。
这部分相当简单。我们开始时的3行构建脚本包含了所有的需要用于构建程序的命令。我们仅仅以正确的依赖集来执行这些命令。用ruby的do/end块来捕捉操作。。。
结果如下:
Rakefile
1 file 'main.o' => ["main.c", "greet.h"] do
2 sh "cc -c -o main.o main.c"
3 end
4
5 file 'greet.o' => ['greet.c'] do
6 sh "cc -c -o greet.o greet.c"
7 end
8
9 file "hello" => ["main.o", "greet.o"] do
10 sh "cc -o hello main.o greet.o"
11 end
让我们试一试。
好的,可以工作。
output
1 $ rake hello
2 (in /home/jim/pgm/rake/intro)
3 cc -c -o main.o main.c
4 cc -c -o greet.o greet.c
5 cc -o hello main.o greet.o
命令行rake hello指示rake去浏览工作列表并发现叫做hello的工作。然后检查hello的依赖并构建它。最后,当所有的环节就绪,rake通过执行C编译器命令去构建hello可执行程序。
rake会忠实地报告所做的工作。我们能看到每次编译调用以正确的顺序执行完成,最终构建main程序。 然而程序能工作吗? 让我们试试。
output
1 $ ./hello
2 Hello, World
成功。
但是当我们修改一个文件会发生什么呢。让我们修改greet.c中的greet函数以打印'hi'来代替'hello'。
output
1 $ emacs greet.c
2 $ rake hello
3 (in /home/jim/pgm/rake/intro)
4 cc -c -o greet.o greet.c
5 cc -o hello main.o greet.o
6 $
7 $ ./hello
8 Hi, World
注意rake重编译了greet.c构建一个新的greet.o。这需要用新构建的greet.o重链接hello。 完成。这不需要重编译main.c因为它从未修改过。
如果我们再次运行rake会发生什么呢?
output
1 $ rake hello
2 (in /home/jim/pgm/rake/intro)
3 $
是的,没有任何操作。每个操作都是最新的。所以不需rake做任何工作。
好的。rake对这个只有两个源文件和一个头文件的工程有些矫枉过正。但是设想包含数百个文件和依赖的大工程呢,像rake这样的工具一下子变得吸引人了。
总结
我们学到了什么呢?构建Rakefile需要明确依赖和需要建立目标文件的操作。接下来定义操作和依赖就像些标准 ruby代码一样简单了。Rake最后处理构建的细节。
分享到:
相关推荐
rake接收(多径分集技术)是一种常用的信道分集技术,通过在接收端对信号进行分集和合并,以提高信道容量和抗干扰能力。Matlab仿真程序是使用Matlab语言编写的仿真程序,用于模拟rake接收机的工作过程。下面是对rake...
RAKE接收机是一种在无线通信系统中用于处理多径衰落信号的重要技术,尤其是在扩频码分多址(CDMA)系统中。它利用多径传播的特性,将来自不同路径的延迟信号分别进行接收和合并,从而提高信号的接收质量。在本压缩包...
使用halcon进行测量,使用的是rake算子;使用halcon进行测量,使用的是rake算子;
总结起来,`rake-0.8.7`是Rails早期版本的核心组件之一,它简化了开发流程,提高了生产力。通过理解和熟练使用`rake`,开发者能够更好地驾驭Rails框架,实现项目的高效管理。安装和熟悉这个版本的rake,对于深入理解...
Rake是Ruby编程语言中的一个构建工具,类似于Java的Ant或Python的setup.py。它提供了一个框架来定义和执行构建任务,使得开发者可以方便地管理项目中的各种自动化任务,如编译代码、运行测试、清理构建产物等。在...
《rake-0.8.7:Rails开发中...对于初学者,了解rake的基本概念和操作,无疑将为他们的Rails之旅打下坚实的基础。而对于经验丰富的开发者,掌握不同版本的rake特性,则有助于他们处理各种复杂场景,保证项目的顺利进行。
RAKE接收机是一种在无线通信系统中,特别是用于3G(第三代)移动通信网络中的关键技术。它主要用于CDMA(码分多址)系统,通过利用多径传播的优点来提高信号的接收质量和系统的容量。RAKE接收机的工作原理是将来自...
标题中的“matlab rake”指的是使用MATLAB编程实现的RAKE接收机,这是一种在无线通信系统中常用于多径衰落信道下的信号接收技术。RAKE接收机通过合并来自不同传播路径的信号副本,有效地利用了多径分集,从而提高...
分集技术是RAKE接收机的基础之一,它旨在通过利用信号的不同路径来提高传输的可靠性。分集技术包括空域、时域和频域的多种实现方式,如最大比值合并、等增益合并和选择式合并。而扩频技术则是在传输过程中扩展信号的...
例如,在Matlab环境下,可以建立一个包含信道建模、信号调制解调、RAKE接收机处理等步骤的仿真模型。通过对不同信道条件下的误码率(BER)进行计算和比较,可以证明RAKE接收机在多径衰落环境中能显著改善接收性能。 ...
在无线通信领域,Rake接收机是一种用于处理多径衰落信道的高效接收技术,尤其是在扩频系统和CDMA(码分多址)系统中广泛应用。本篇将详细讲解Rake接收机的工作原理,结合Matlab进行仿真,并探讨分集接收与合并技术。...
2. RAKE接收技术:RAKE接收技术是一种常用的信道检测技术,通过使用相关器来检测信道中的信号,提高信道检测的准确性和可靠性。 3. RAKE接收机的基本原理:RAKE接收机的基本原理包括RAKE接收机的整体结构、通信信道...
图为一个 RAKE 接收机,它是专为 CDMA 系统设计的经典的分集接收器,其理基础就是:当传播时延超过一个码片周期时,多径信号实际上可被看作是互不相关的。 在 RAKE 接收机中,带 DLL 的相关器是一个具有迟早门锁相...
TH-RAKE(Time-Hopping RAKE)接收机是一种特殊的RAKE接收机,它采用时间跳变技术,通过随机改变发射信号的发送时刻来分散能量,进一步抵抗多径干扰。在802.15.3a标准中,该技术常用于超宽带(UWB)通信,因为它可以...
RAKE(Rapid Automatic Keyword Extraction)算法是一种快速自动关键词抽取的方法,主要应用于文本摘要和信息检索领域。在Python中实现RAKE算法可以帮助我们从大量文本数据中高效地提取出关键主题词,这对于数据分析...
在Ruby编程语言中,Rake是一个非常重要的工具,它被称为Ruby Make,因为它提供了一种类似于Makefile的功能,但使用Ruby语法。Rake不仅用于构建代码,更常被用来作为任务管理器,帮助开发者组织和执行一系列自动化...
在本主题中,我们聚焦于"基于Halcon,鸟叔的spoke和rake函数",这两个函数是鸟叔(一位在机器视觉社区中有影响力的专家)针对Halcon进行的特定封装,以帮助用户更方便地进行边缘检测和圆形特征的查找。 首先,让...
RAKE-tutorial, 一种快速自动关键词提取的python 实现 RAKE快速自动关键字提取( 耙) 算法的python 实现,如下所述: ,S,Engel,D,,N,& Cowley,W 。 ( 2010 ) 从单个文档中自动提取关键字。 在M 。W 。& 。 ...
"短波通信中的Rake接收技术" 短波通信中的Rake接收技术是指在短波扩频通信中,利用多径信号的有效能量提高输出信噪比,改善短波通信质量的技术。该技术可以将多径信号进行识别和分离,提高接收信号的信噪比,达到...