2010-05-14 21 views
1

j'ai un Rakefile avec une règle comme ceci:Rakefile règle problème de génération de sortie

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 

Comme vous pouvez le voir, il génère beaucoup .donc bibliothèques à partir du répertoire « stdlib » (qui contient les sources) à la répertoire 'build' où les binaires sont stockés. Maintenant, le problème est, en raison de cet "échange de répertoire", rake semble ne pas reconnaître les fichiers .so comme des fichiers qu'il a générés, entraînant la recompilation de chaque module .so chaque fois o exécuter la commande rake, même si rien n'est changé.

Y at-il un moyen de résoudre ce problème?

Merci

Répondre

2

Vous pouvez utiliser la syntaxe pathmap ou un proc explicite pour changer la sortie nom/chemin dans l'entrée nom de fichier/chemin.

La syntaxe pathmap ressemblera à quelque chose comme ça (non testé):

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 

La méthode proc ressemblera à quelque chose comme ça (également non testé):

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 

Notez que vous pouvez vous débarrasser de le 'mkdir' explicite dans votre action et utilisez une tâche 'directory' à la place (si vous connaissez à l'avance les répertoires de destination possibles)

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 
+0

Si j'utilise la méthode pathmap je reçois le message suivant: rake aborted! Je ne sais pas comment construire la tâche 'stdlib/std/math.so' –

+0

Ok, ok, je l'ai, ça marche! : D tnx –