2009-02-18 13 views
1

我试图编写一个Rakefile,当我运行rake compile时,通常会生成我的代码,但将目标放在不同的目录中,并在-DTEST我跑rake test。尽管如此,我不能为了我的生活而弄清楚如何去做。我有在目前是这样的:根据运行目标的rake规则改变命令/路径映射

SRC = FileList['src/*.erl'] 
OBJ = SRC.pathmap("%{src,ebin}/X.beam") 

rule ".beam" => ["%{ebin,src}X.erl"] do |t| 
    sh "erlc ... -o ebin #{t.source}" 
end 

task :compile => OBJ 

我想是一个task :test是把编译器的输出为ebin_test(基本上改变了ebin所有实例为ebin_test在上面的代码),并增加了一个-DTEST拨打sh。任何人有任何想法?

回答

1

那么,这不是一个积极的第一个问题......没有答案。

为了记录,我通过为构建和测试任务定义了不同的编译规则,然后让公共任务在执行实际构建/测试运行之前调用该任务来解决了该问题。几个范围问题,但没有什么令人兴奋的。我不会因为粘贴完整的rakefile而烦心,但是如果您有兴趣查看,请告诉我。

+0

嘿@womble,我陷入了类似的情况。你介意在这里发布固定的Rakefile吗?谢谢。 – thegreendroid 2011-11-20 05:32:59

0

您可以根据您想要发布版本还是 测试版本来设置输出目录,但不能用FileList路径图语法替换该变量。

因此,使用## map将源映射到对象,并使用proc将源转换回对象。

要选择不同构建我通常是一个变量传递给rake命令,如“耙CONFIG =测试构建”

这里的一个最小的Rakefile其输出到单个树取决于CONFIG VAR:

## Config 
CONFIG = ENV["CONFIG"] || "Release" 
SRC_DIR = "src" 
OBJ_DIR = File.join("obj",CONFIG) 

## Tools 
CC = "gcc" 

## Inputs 
C_SRCS = FileList["#{SRC_DIR}/**/*.c"] 

## Outputs 
# Map sources to objects 
C_OBJS = C_SRCS.map { |f| 
     f.sub(/^#{SRC_DIR}/, OBJ_DIR).ext('.o') 
} 

## Tasks 
task :default => C_OBJS 

# Generate a set of directory rules for the object files 
C_OBJS.each do |f| 
    directory f.pathmap('%d') 
end 

## Rules 

# Generate objects from sources 
rule '.o' => [ 
    proc { |tn| tn.sub(/#{OBJ_DIR}/, SRC_DIR).ext('.c') }, 
    '%d' 
] do |t| 
sh %Q{#{CC} -c "#{t.source}" -o "#{t.name}"} 
end 

还要注意输出目录的创建。

更多notes and examples我的网站。