2010-10-08 5 views
5

Ich bin verrückt zu kontrollieren, wenn Dateien in SCONs erstellt werden. Ich habe einen sehr einfachen Beispielbuildbaum (siehe unten), mit einem Poem Builder, der nur eine .txt Datei nimmt und sie in Kleinbuchstaben in eine entsprechende .eectxt Datei umwandelt.Was löst Scons aus, um Dateien zu erstellen, wenn ich einen benutzerdefinierten Builder habe?

In meinen SConstruct- und SConscript-Dateien erkläre ich Abhängigkeiten von 3. Txt-Dateien.

Aber ich kann nicht herausfinden, was diese in den Standard-Build bringt!

sconstest/ 
    SConstruct 
    tiger.txt 
    src/ 
     SConscript 
     hope.txt 
     jabberwocky.txt 

, wo die * .txt Dateien Gedichte sind und meine SConstruct und SConscript wie folgt aussehen:

SConstruct:

env = Environment(); 

def eecummings(target, source, env): 
    if (len(target) == 1 and len(source) == 1): 
    with open(str(source[0]), 'r') as fin: 
     with open(str(target[0]), 'w') as fout: 
      for line in fin: 
       fout.write(line.lower()); 
    return None 

env['BUILDERS']['Poem'] = Builder(action=eecummings, suffix='.eectxt', src_suffix='.txt'); 

Export('env'); 
poems = SConscript('src/SConscript'); 
tigerPoem = env.Poem('tiger.txt'); 

src/SConscript:

Import('env'); 

input = ['jabberwocky.txt', 'hope.txt']; 
output = [env.Poem(x) for x in input]; 
Return('output'); 

Was ich möchte die Abhängigkeit der .eectxt Dateien von der entsprechendendeklarierenDateien, aber nicht verursachen sie gebaut werden, wenn ich sie nicht explizit in die Default() Build in der SConstruct-Datei, oder ich fordere sie explizit an der Befehlszeile.

Wie kann ich das tun?

Antwort

1

Standardmäßig hängt ein Verzeichnis von allen Dateien und/oder Zielen ab, die sich darin befinden. So läuft:

scons 

Werden dann alle Ziele im aktuellen Verzeichnis erstellen.

0

Ich habe herausgefunden, wie ich tun kann, was ich will, aber ich verstehe immer noch nicht, warum ich es so machen muss. Annahme zur ersten anständigen Antwort, die es erklärt.

Hier ist, was funktioniert, wenn ich folgendes an die Wurzel SConstruct Datei hinzufügen:

env.Ignore('.', tigerPoem); 
env.Ignore('src', poems); 
env.Alias('poems', [tigerPoem]+poems); 

Dies ignoriert die drei Gedichte aus dem Standardziel, und dann fügt sie als Ziele „Gedichte“ aliased, also wenn Ich renne scons es baut nichts, aber wenn ich scons poems ausführen, baut es die Dateien.

Warum funktioniert das? Warum fügt das Aufrufen von env.Poem(...) etwas zu den Standardzielen hinzu?