Проблема генерации вывода правила 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 каждый раз при запуске команды rake, даже если ничего не изменилось.

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

Спасибо


person Simone Margaritelli    schedule 14.05.2010    source источник


Ответы (1)


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

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

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
person Heath    schedule 20.05.2010
comment
Если я использую метод pathmap, я получаю следующее сообщение: rake aborted! Не знаю, как собрать задачу 'stdlib/std/math.so' - person Simone Margaritelli; 21.05.2010