2009-02-18 14 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我的網站。