2010-10-08 12 views
5

Sto impazzendo cercando di controllare quando i file sono costruiti in scons. Ho un albero di compilazione di esempio molto semplice (vedi sotto), con un builder Poem che prende solo un file .txt e lo converte in minuscolo in un file .eectxt corrispondente.cosa fa scons scons a creare file quando ho un builder personalizzato?

Nei file SConstruct e SConscript, dichiaro le dipendenze di 3 file .txt.

Ma non riesco a capire cosa sta inserendo questi nella build predefinita!

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

in cui i file * .txt sono poesie e la mia SConstruct e SConscript simile a questa:

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'); 

Quello che ho voler fare è dichiarare la dipendenza dei file .eectxt dal corrispondenteI file, ma non, possono essere creati a meno che non li inserisca esplicitamente nella build Default() nel file SConstruct o li richieda esplicitamente alla riga di comando.

Come posso fare questo?

risposta

1

Per impostazione predefinita, una directory dipende da tutti i file e/o le destinazioni che risiedono in essa. Così esecuzione:

scons 

sarà poi costruire tutti i bersagli sotto la directory corrente.

0

Ho capito come fare ciò che voglio, ma ancora non capisco perché ho bisogno di farlo in questo modo. Accettazione per la prima risposta decente che lo spiega.

Ecco ciò che funziona, se aggiungo il seguente al file di root SConstruct:

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

Questo ignora le 3 poesie dal bersaglio di default, e poi aggiunge come obiettivi alias a "poesie", quindi se Corro scons non costruisce nulla, ma se corro scons poems costruisce i file.

Perché funziona? Perché chiamare env.Poem(...) aggiungere qualcosa ai target predefiniti?

Problemi correlati