Варьируйте команду / pathmap в правилах граблей, в зависимости от того, какая цель выполняется - PullRequest
1 голос
/ 18 февраля 2009

Я пытаюсь написать 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 в ebin_test в приведенном выше коде) и добавил -DTEST к sh вызов. У кого-нибудь есть идеи?

Ответы [ 2 ]

1 голос
/ 19 февраля 2009

Ну, это не был первый положительный вопрос ... нет ответов.

Для справки, я решил проблему, имея задачу для сборки и тестирования, которая по-разному определяла правила компиляции, а затем публичная задача вызывала эту задачу перед выполнением фактического запуска сборки / тестирования. Несколько проблем с определением объема, но ничего интересного. Я не буду вставлять полный полученный rakefile, но дайте мне знать, если вы заинтересованы в просмотре.

0 голосов
/ 28 февраля 2013

Вы можете установить выходной каталог в зависимости от того, хотите ли вы выпуск или тестовая сборка, но вы не можете заменить эту переменную в синтаксисе карты пути FileList.

Так что используйте ## map для отображения источников на объекты и proc для преобразования источников обратно в объекты.

Для выбора разных сборок я обычно передаю переменную в команду rake, например "rake CONFIG = Test build"

Вот минимальный rakefile, который выводит в одно дерево, зависящее от переменной CONFIG:

## 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

Обратите внимание также на создание выходных каталогов.

Больше заметок и примеров на моем сайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...