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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top