Problema de geração de saída de regra do RakeFile
Pergunta
Eu tenho um RakeFile com uma regra como esta:
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
Como você pode ver, ele gera muitas bibliotecas. So do diretório 'stdlib' (que contém as fontes) até o diretório 'Build', onde os binários são armazenados.
Agora, o problema é que, devido a essa "troca de diretório", o RAKE parece não reconhecer os arquivos .So como arquivos que gerou, causando a recompilação de cada módulo .So cada vez que execute o comando RAKE, mesmo que nada seja alterado.
Existe alguma maneira de resolver isto?
Obrigado
Solução
Você pode usar a sintaxe do PathMap ou um PROC explícito para alterar o nome de arquivo/caminho de saída para o nome de entrada/caminho de entrada.
A sintaxe do PathMap será algo assim (não testado):
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
O método PROC se parecerá com isso (também não testado):
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
Observe que você pode se livrar da 'mkdir' explícita em sua ação e usar uma tarefa 'diretório' (se você conhece com antecedência os possíveis diretórios de destino)
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