Domanda

ho un Rakefile con una regola come questa:

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

Come si può vedere, genera molte biblioteche .so dalla directory 'stdlib' (che contiene i sorgenti) nella directory 'build' in cui sono memorizzati i file binari.

Ora il problema è, a causa di questo "scambio directory", rastrello sembra non riconoscere i file .so come file che ha generato, causando la ricompilazione di ogni .so modulo di volta in volta o eseguire il comando rake, anche se nulla viene modificato.

C'è un modo per risolvere questo?

Grazie

È stato utile?

Soluzione

È possibile utilizzare la sintassi pathmap o un proc esplicita di cambiare l'output nome del file / percorso all'ingresso nome del file / percorso.

La sintassi pathmap sarà simile a questa (non testata):

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

Il metodo proc sarà simile a questo (anche non testata):

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

Si noti che si può sbarazzarsi del esplicito 'mkdir' nella vostra azione e utilizzare un compito 'directory' invece (se si conosce in anticipo le possibili directory di destinazione)

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top