1

我正在尝试编写一个 Rakefile,它既能在我运行时正常构建我的代码,rake compile但将目标放在不同的目录中,并-DTEST在我运行时构建rake test。不过,我终其一生都无法弄清楚该怎么做。我现在有这样的事情:

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所有实例更改为)并在调用中添加一个 -DTEST 。有人有什么想法吗?ebinebin_testsh

4

2 回答 2

1

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

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

于 2009-02-18T22:15:17.380 回答
0

您可以根据需要发布还是测试构建来设置输出目录,但不能在 FileList 路径映射语法中替换该变量。

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

为了选择不同的构建,我通常将一个变量传递给 rake 命令,例如“rake CONFIG=Test build”

这是一个最小的 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

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

我的网站上有更多注释和示例。

于 2013-02-28T13:22:38.290 回答