2013-05-14 12 views
7

Ich möchte, dass SCons einige Quelldateien für mich in meinem Verzeichnis src/ generieren und dann wie jede andere Quelldatei in meinem Build-Verzeichnis build/variantX erstellen.SCons Codegenerierung und VariantDir

Das ist mein SCons Datei:

import SCons 

def my_builder(env, target, source): 
    # do stuff 
    pass 

env = Environment() 
env.VariantDir('build/variant1/', 'src', duplicate=0) 
env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
env.Program('bin/test', [ 
    'build/variant1/foobar.cc', 
    'build/variant1/test.cc', 
    ]) 

Diese Fehler mit der folgenden Meldung:

Quelle src/foobar.cc nicht gefunden, nach Ziel benötigt build/variant1/foobar.o

was ich nicht denke, ist richtig, wenn ich bedenke, dass ich tatsächlich einen Befehl zur Verfügung stelle, src/foobar.cc zu bauen.

Jetzt habe ich versucht, ein paar Lösungen:

  • wenn ich mit src/foobar.ccbuild/variant1/foobar.cc in Programm ersetzen, es funktioniert, aber offensichtlich foobar.o wird in src/ eher geschaffen als build/variant1

  • wenn ich ersetzen src/foobar.cc in Command mit build/variant1/foobar.cc, es funktioniert, aber ich möchte den Code in src/ erzeugt werden; (Auch, weil Dinge wie relative Pfade in Include-Verzeichnisse nicht, es sei denn duplicate=1 arbeiten)

  • wenn duplicate=1, ich eine ähnliche Fehlermeldung erhalten, aber dieses Mal zu erwähnen, das variant-Verzeichnis:

    Quelle build/variant1/foobar.cc nicht gefunden erforderlich, durch Ziel build/variant1/foobar.o

gibt es eine Möglichkeit, um dieses? Ist es eine Einschränkung/Fehler in SCons oder gibt es ein fundamentales Missverständnis auf meiner Seite?

+0

Haben Sie jemals eine Antwort auf dieses Problem gefunden? Ich habe etwas sehr ähnliches vor mir. – jfritz42

Antwort

2

würde ich vorschlagen, eine explizite Abhängigkeit zwischen dem Befehl() und Program() Erstellen ruft wie folgt:

target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
target2 = env.Program('bin/test', [ 
         'build/variant1/foobar.cc', 
         'build/variant1/test.cc', 
         ]) 
Depends(target2, target1) 
# This should work too 
# Depends(target2, "src/foobar.cc") 

Oder Sie könnten das Ziel der Anwendung Command() als Teil der Quelle für Programm angeben (wie folgt):

target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
env.Program('bin/test', [ 
      target1, 
      'build/variant1/test.cc', 
      ]) 

ich diese haben getestet, so ich bin nicht sicher, wie es in Verbindung mit dem Aufruf von VariantDir()

Here arbeiten gibt einige zusätzliche Informationen bezüglich der Generierung von Quellcode mit SCons.

+0

Hallo Brady, danke für deine Hilfe. Deine erste Idee war in der Tat nett, aber es scheint keine Wirkung zu haben. Der zweite scheint im Grunde derselbe zu sein wie mein erster Workaround: Er funktioniert, aber er baut ihn im Quellverzeichnis und nicht in der Variante auf. Der Link sieht interessant aus, ich gehe jetzt durch. – UncleZeiv

+0

@UncleZeiv Ich bin wirklich überrascht, dass die Funktion Depends() nicht funktioniert hat. Versuchen Sie stattdessen, den tatsächlichen Dateinamen zu verwenden. Ich aktualisiere die Antwort. – Brady

+0

'--tree = all 'sagt mir, dass dies in' bin/test' resultiert, abhängig von der "richtigen" 'src/foobar.cc' (die wiederum von' src/foobar.input' abhängt), aber 'build/variant1/foobar.o' hängt immer noch von einem" dangling "' src/foobar.cc' ab, der wiederum von nichts abhängt und (offenes Hantieren mit dem scons-Quellcode) gar nicht scheint jeder Erbauer daran angeschlossen. Ich fange wirklich an zu denken, dass dies ein SCON-Bug ist. – UncleZeiv

0

Ich weiß, es ist schon eine Weile her, aber ich traf die gleiche Wand. Mit geringen Modifikationen an den ‚Testfall‘ und die Lösung (siehe unten) ist der Code:

import SCons 

env = Environment() 
env.VariantDir('build/variant1/', 'src', duplicate=0) 
env.Command('src/foobar.cc', 'src/foobar.input', action="cp src/foobar.input src/foobar.cc", shell=True) 
env.Depends("build/variant1/foobar.cc", "src/foobar.cc") 
env.Program('bin/test', [ 
'build/variant1/foobar.cc', 
]) 

Der addierten ‚env.Depends‘ auf der ‚variantdir-Quelle‘ zu ‚erzeugen Source‘ der Schlüssel ist. Keine Ahnung, warum das nötig ist. Ich würde es einen Fehler nennen, aber ich denke, es wurde vorgestellt (basierend auf dem Bug-Feedback, das Sie bekommen haben ..)

Prost,