2010-05-14 3 views
1

я есть Rakefile с помощью следующего правила: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-модуля каждый раз, o запускает команду rake, даже если ничего не изменилось.

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

Благодаря

ответ

2

Вы можете использовать синтаксис 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 

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

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 
+0

Если я использую метод pathmap, я получаю следующее сообщение: rake aborted! Не знаю, как построить задачу 'stdlib/std/math.so' –

+0

Хорошо, получилось, это работает! : D tnx –