2011-11-24 14 views
5

Sto provando a preparare un sistema di build usando SCons. Voglio usare clang per la fase di generazione del codice e un toolchain del compilatore personalizzato per tutto il resto.Configurazione degli SCons per utilizzare strumenti separati per la generazione e l'assemblaggio del codice

Per impostazione predefinita, la configurazione di SCons non dispone di un passaggio esplicito in cui vengono generati i file di assemblaggio (.s).

Per aggirare questo problema, ho creato il mio Builder che emette i file di assemblaggio.

code_generator = Builder(action = '$CC -$LOTS_OF_FLAGS -S $SOURCE -o $TARGET', suffix = '.s') 
env.Append(BUILDERS = {'CodeGenerator':code_generator}) 

Ho quindi utilizzare questo Builder sul mio file di origine e passare il conseguente NodeList al Program.

for file in Glob('*.c'): 
    sources += env.CodeGenerator(file) 

env.Program('say_hello', sources) 

Questo funziona bene quando non modifico nessuna variabile. Ottengo un eseguibile usando gcc.

Tuttavia, quando provo a sostituire le variabili appropriate in modo che SCons utilizzi la toolchain personalizzata (utilizzando env.Replace(CC='clang')...), viene generato solo un file di assieme. Il mio personalizzato Builder non viene chiamato su qualsiasi altro file e SCons cerca di collegarsi con un solo file oggetto (che non riesce ovviamente)

  1. Come posso fare SCons corrono il costruttore su tutti i file e comprendono quei file oggetto per il collegamento ?
  2. C'è un modo migliore per realizzare ciò che sto provando a fare Io ? Sto solo iniziando a lavorare con SCons.

risposta

3

ci sono un gran numero di argomenti a parola chiave per la classe Builder che sono documentati sulle SCons man page, che non sono menzionati nel manuale utente. Questo è uno dei punti deboli nella documentazione di SCons, ed è stato per qualche tempo.

In questo caso, credo che si sta cercando per l'argomento single_source parola chiave che:

Specifica che questo costruttore si aspetta esattamente un file sorgente per ogni chiamata. Se si concede più di un file di origine senza i file di destinazione, chiama implicitamente il builder più volte (una volta per ogni origine fornita da ).

L'origine di Builder single_source deve essere valutata su True (o un valore equivalente). Quindi il tuo codice può essere riscritto con una modifica molto piccola.

env = Environment() 
code_generator = Builder(action = '$CC $CCFLAGS -S $SOURCE -o $TARGET', 
         single_source = 1, 
         suffix = '.s') 
env.Replace(CC= 'clang') 
env.Append(BUILDERS = {'CodeGenerator' : code_generator}) 
sources = env.CodeGenerator(file) 
env.Program('say_hello', sources) 

Che per una cartella con i file: foo.c e bar.c produce l'output:

scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
clang -S bar.c -o bar.s 
as -o bar.o bar.s 
clang -S foo.c -o foo.s 
as -o foo.o foo.s 
clang -o say_hello bar.o foo.o 
scons: done building targets. 
+0

Anche dopo la correzione proposta, continuo a fronte lo stesso problema. Ma grazie per l'osservazione sulla documentazione extra nella pagina man. Avevi ragione, mi riferivo solo alla guida dell'utente. Investigheremo ulteriormente e riferirò se avrò successo. – Buzzy

+0

Quale versione di scons stai usando? –

+0

Installato usando Homebrew su Mac: script: v2.1.0.r5357 engine: v2.1.0.r5357 – Buzzy

Problemi correlati