2010-10-08 22 views
5

Je vais essayer de contrôler quand les fichiers sont construits en scons. J'ai un arbre de construction exemple très simple (voir ci-dessous), avec un constructeur Poem qui prend juste un fichier .txt et le convertit en minuscule dans un fichier .eectxt correspondant.Qu'est ce qui déclenche la génération de fichiers par scons lorsque j'ai un constructeur personnalisé?

Dans mes fichiers SConstruct et SConscript, je déclare les dépendances de 3 fichiers .txt.

Mais je n'arrive pas à comprendre ce qui les place dans la version par défaut!

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

où les fichiers * .txt sont des poèmes et mon SConstruct et SConscript ressemblent à ceci:

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

Ce que je vouloir faire est de déclarer la dépendance des fichiers .eectxt à partir ducorrespondantfichiers, mais pas cause de les construire à moins que je les mets explicitement dans la construction Default() dans le fichier SConstruct, ou je les demande explicitement à la ligne de commande.

Comment est-ce que je peux faire ceci?

Répondre

1

Par défaut, un répertoire dépend de tous les fichiers et/ou cibles qui y résident. donc en cours d'exécution:

scons 

construirez alors toutes les cibles dans le répertoire courant.

0

J'ai compris comment faire ce que je veux, mais je ne comprends toujours pas pourquoi je dois le faire de cette façon. Acceptation à la première réponse décente qui l'explique.

Voici ce qui fonctionne, si j'ajoute ce qui suit au fichier SConstruct racine:

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

Cela ne tient pas les 3 poèmes de la cible par défaut, et les ajoute ensuite comme des cibles aliasées à des « poèmes », donc si Je cours scons il ne construit rien, mais si je cours scons poems il construit les fichiers.

Pourquoi cela fonctionne-t-il? Pourquoi appeler env.Poem(...) ajoute quelque chose aux cibles par défaut?