2016-03-15 1 views
2

Je dois créer une cible en utilisant une compilation en deux étapes.Le générateur de bibliothèque ne se déclenche pas sur le fichier modifié dans SCons

La première étape: .c -> .asm La deuxième étape: .asm -> .o

Je crée une bibliothèque de quelques fichiers .o.

Ma mise en œuvre est la suivante:

La première étape:

c_to_asm_builder = SCons.Builder.Builder(action = SCons.Defaults.CAction, 
           emitter = {}, 
           suffix = '.asm', 
           src_suffix = ['.c','.cpp'], 
           src_builder = '', 
           source_scanner = SCons.Tool.CScanner 
           ) 
env['Builders']['CTOASM'] = c_to_asm_builder 

La deuxième étape:

suffixesASM = ['.asm', '.s'] 
static_obj, shared_obj = SCons.Tool.createObjBuilders(env) 
for suffix in suffixesASM: 
    static_obj.add_action(suffix, SCons.Defaults.ASAction) 

J'appelle alors les constructeurs comme suit:

env.CTOASM(['file1.c', 'file2.c', 'file3.c'], CFLAGS = '-flag') 
    env.Object(['file1.asm', 'file2.asm', 'file3.asm'], ASFLAGS = '-flag') 

Je suis créer une bibliothèque comme celle-ci:

env.Library('name', ['file1.o', 'file2.o']) 

Tout fonctionne bien pour la compilation.

Le problème appers lorsque:

Je modifier le contenu fichier1.c. Je m'attends à ce que file1.c passe par ces étapes:

file1.c -> fichier1.asm -> fichier1.o, puis nommez une bibliothèque à recréer.

Qu'arrive-t-:

seulement c_to_asm_builder est réexécutée par le changement (fichier1.c -> file1.asm). Le générateur d'objet (fichier1.asm -> fichier1.o) n'est pas redéclenché et le générateur de bibliothèque et le générateur de programme ne sont pas redéclenchés.

Je ne sais pas ce qui me manque. Je sais que pour une compilation en une seule étape que j'ai configurée dans un autre projet, le générateur d'objet et le générateur de bibliothèque sont en quelque sorte conscients l'un de l'autre. Comment faire pour que Library et Program Builder prennent en compte les générateurs Object et CTOASM?

Répondre

0

Vous ne spécifiez pas un émetteur, donc soit écrire un ou liste explicitement vos objectifs attendus ...

asm = env.CTOASM(['file1.asm', 'file2.asm', 'file3.asm'], 
       ['file1.c', 'file2.c', 'file3.c'], CFLAGS = '-flag') 
obj = env.Object(['file1.o', 'file2.o', 'file3.o'], asm, ASFLAGS = '-flag') 
lib = env.Library('name', obj) 

Voici une bonne référence sur la façon d'ajouter un émetteur à votre constructeur. Faites défiler vers le bas jusqu'à "Using Emitters".

+0

J'ai essayé ceci et j'ai toujours le même comportement. D'une manière ou d'une autre, le constructeur de la bibliothèque ne crée pas de lien avec mon constructeur d'objets. –

+0

Pouvez-vous poster un exemple de travail minimal? –