Вопрос

У меня есть грабеж с правилом, как это:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top