2016-02-01 1 views
1

Je voudrais compiler des fichiers dans les étapes suivantes à l'aide SCons:Comment compiler en deux étapes en utilisant SCons?

.c -> .asm (fichier de montage) -> .o

J'ai essayé de définir différents constructeurs pour cela.

j'ai réussi à faire quelque chose comme: .asm -> .o et .c -> .o

Je ne sais pas comment faire SCons au courant des .ASM générés à partir de fichiers .c puis utiliser le générateur d'objets.

Est-il possible d'utiliser l'implémentation SCons actuelle pour cela?

EDIT: C'est ce que j'ai essayé:

-> Pour définir deux constructeurs: 1 Builder (c_to_asm) est destiné à faire .c -> .asm étape Builder 2 (asm_to_o) est destiné à fais .asm -> .o. Après que ces deux constructeurs soient exécutés pour tous les fichiers définis dans mon SConscript, je m'attends à ce que le programme Builder crée l'exécutable final.

SCons.Tool.createProgBuilder(env) 

c_to_asm = SCons.Builder.Builder(action = {}, 
           emitter = {}, 
           prefix = '', 
           suffix = '.asm', 
           src_builder = '', 
           source_scanner = '', 
           single_source = 1) 
c_to_asm_action = SCons.Action.Action('c to asm command line', 'Executing .c to .asm builder') 

c_to_asm.add_action('.c', c_to_asm_action) 


asm_to_o = SCons.Builder.Builder(action = {}, 
           emitter = {}, 
           prefix = '', 
           suffix = '.o', 
           src_builder = ['CTOASM'], 
           source_scanner = '', 
           single_source = 1) 

asm_to_o_action = SCons.Action.Action('asm to o command line', 'Executing .asm to .o builder...') 
asm_to_o.add_action('.asm', asm_to_o_action) 





env['BUILDERS']['CTOASM'] = c_to_asm 
env['BUILDERS']['Object'] = asm_to_o 

Je vois la chaîne d'exécution pour chaque générateur mais aucune commande n'est exécutée.

Je ne sais pas comment établir dans quel ordre ces générateurs exécutent des actions et comment déclencher ces générateurs.

+1

S'il vous plaît donner un peu plus d'informations sur ce que vous avez exactement essayé jusqu'à présent. À quoi ressemblent vos constructeurs et comment les initialisez-vous et les appelez-vous? Quel est exactement le message d'erreur que vous obtenez ou sur quel problème de détail travaillez-vous en ce moment? (Par exemple: vos fichiers sont-ils compilés, mais les dépendances ne sont pas correctes, de sorte que la séquence "propre" laisse les fichiers derrière?) – dirkbaechle

Répondre

1

Votre approche est un peu compliquée. Du haut de ma tête, je vais essayer quelque chose comme ça (non testé, mais nous espérons que vous donne une direction à poursuivre):

import SCons.Action 
import SCons.Builder 
# Automatically inits "nasm" Tool, if it is in the $PATH 
env = Environment() 

c_to_asm_action = SCons.Action.Action('c to asm command line', 'Executing .c to .asm builder') 
c_to_asm = SCons.Builder.Builder(action = c_to_asm_action, 
           suffix = '.asm', 
           single_source = 1) 

env['BUILDERS']['CTOASM'] = c_to_asm 

# Creates first.asm and second.asm 
env.CTOASM(['first.c', 'second.c']) 
# Compiles final program, finds the newly created ASM files via Glob 
env.Program('foo', Glob('*.asm') + list_of_your_other_sources_and_libs)