代码之家  ›  专栏  ›  技术社区  ›  womble

根据运行的目标更改rake规则中运行的命令/路径映射

  •  1
  • womble  · 技术社区  · 17 年前

    我正在尝试编写一个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 (基本上改变了 ebin 进入之内 埃比尼试验 在上面的代码中)并将-dtest添加到 sh 打电话。有人有什么想法吗?

    2 回复  |  直到 13 年前
        1
  •  1
  •   womble    17 年前

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

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

        2
  •  0
  •   gnomeza    13 年前

    您可以根据需要发布还是 测试生成,但不能在文件列表路径映射语法中替换该变量。

    因此,使用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
    

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

    更多 notes and examples 在我的网站上。

    推荐文章