Проблема генерации вывода правила Rakefile - PullRequest
1 голос
/ 15 мая 2010

У меня есть Rakefile с таким правилом:

rule '.so' => '.cc' do |t|
    puts "@ Compiling #{t.source}"
    output = t.source.ext("so")
    output['stdlib'] = 'build'
    sh "mkdir -p #{File.dirname(output)}"
    sh "#{CXX} #{t.source} -o#{output} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end

Как вы можете видеть, он генерирует много библиотек .so из каталога 'stdlib' (который содержит источники) в каталог 'build', где хранятся двоичные файлы.

Теперь проблема в том, что из-за этого «обмена каталогами» rake, похоже, не распознает .so файлы как файлы, которые он сгенерировал, вызывая перекомпиляцию каждого модуля .so при каждом запуске команды rake, даже если ничего изменено.

Есть ли способ решить эту проблему?

Спасибо

1 Ответ

2 голосов
/ 20 мая 2010

Вы можете использовать синтаксис pathmap или явный процесс для изменения выходного имени файла / пути во входное имя файла / пути.

Синтаксис pathmap будет выглядеть примерно так (не проверено):

rule '.so' => '%{build,stdlib}X.cc' do |t|
   puts "@ Compiling #{t.source}"
   sh "mkdir -p #{File.dirname(t.name)}"
   sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end

Метод proc будет выглядеть примерно так (также не проверено):

rule '.so' => [proc { |f| f.sub(/build/, 'stdlib').ext('.cc') }] do |t|
   puts "@ Compiling #{t.source}"
   sh "mkdir -p #{File.dirname(t.name)}"
   sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end

Обратите внимание, что вы можете избавиться от явного mkdir в вашем действии и использовать вместо него задачу 'directory' (если вы заранее знаете возможные каталоги назначения)

possible_dest_dirs.each { |d|
    directory d
}

rule '.so' => [proc { |f| f.sub(/build/, 'stdlib').ext('.cc') },
               proc { |f| File.dirname(f) }] do |t|
   puts "@ Compiling #{t.source}"
   sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end
...