Проблема генерации правила 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, даже если ничего не изменится.
Есть ли способ решить это?
Спасибо
Решение
Вы можете либо использовать синтаксис PATHMAP или явную ProC для изменения выходного файла / пути / пути в входное имя файла / путь.
Синтаксис 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» в вашем действии и используйте задачу «каталога» вместо этого (если вы заранее знаете возможные каталоги назначения)
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