2013-05-14 16 views
7

Desidero che SCons generi per me alcuni file sorgente nella mia directory src/ e li creo come qualsiasi altro file sorgente nella mia directory di build build/variantX.SCons code generation e VariantDir

Questo è il mio file SCons:

import SCons 

def my_builder(env, target, source): 
    # do stuff 
    pass 

env = Environment() 
env.VariantDir('build/variant1/', 'src', duplicate=0) 
env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
env.Program('bin/test', [ 
    'build/variant1/foobar.cc', 
    'build/variant1/test.cc', 
    ]) 

Questo gli errori con il seguente messaggio:

Fonte src/foobar.cc non trovato, necessari per target build/variant1/foobar.o

che non mi penso sia corretto, considerando che sto effettivamente fornendo un comando per costruire src/foobar.cc.

Ora, ho provato un paio di soluzioni:

  • se sostituisco build/variant1/foobar.cc in programma con src/foobar.cc, funziona, ma ovviamente foobar.o viene creato in src/ piuttosto che build/variant1

  • se sostituisco src/foobar.cc in Command con build/variant1/foobar.cc, funziona, ma mi piacerebbe che il codice fosse generato in src/; (Anche perché le cose come percorsi relativi a includono le directory non funzioneranno se duplicate=1)

  • se duplicate=1, ricevo un messaggio di errore simile, ma questa volta menzionare la directory variant:

    Fonte build/variant1/foobar.cc non trovato , necessari per target build/variant1/foobar.o

esiste un modo per aggirare questo? È un limite/bug in SCons, o c'è un malinteso fondamentale da parte mia?

+0

Hai mai trovato una risposta a questo problema? Sto affrontando qualcosa di molto simile. – jfritz42

risposta

2

Vorrei suggerire la creazione di una dipendenza esplicito tra il Comando() e il Programma() chiama come segue:

target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
target2 = env.Program('bin/test', [ 
         'build/variant1/foobar.cc', 
         'build/variant1/test.cc', 
         ]) 
Depends(target2, target1) 
# This should work too 
# Depends(target2, "src/foobar.cc") 

Oppure si potrebbe specificare la destinazione del Comando() come parte della sorgente per il programma () come segue:

target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
env.Program('bin/test', [ 
      target1, 
      'build/variant1/test.cc', 
      ]) 

io ho mai provato questo, in modo da Im non sicuro come funzionerà in combinazione con la chiamata a VariantDir()

Here sono alcune informazioni extra riguardanti la generazione di codice sorgente con SCons.

+0

Ciao Brady, grazie per il tuo aiuto. La tua prima idea è stata bella, ma non sembra avere alcun effetto. La seconda sembra essere effettivamente la stessa della mia prima soluzione: funziona ma la costruisce nella directory sorgente piuttosto che nella variante. Il link sembra interessante, ora lo sto esaminando. – UncleZeiv

+0

@UncleZeiv Sono davvero sorpreso che la funzione Depends() non abbia funzionato. Prova invece a utilizzare il nome del file effettivo, aggiornerò la risposta. – Brady

+0

'--tree = all' mi dice che questo risulta in' bin/test' a seconda del "corretto" 'src/foobar.cc' (quello che a sua volta dipende da' src/foobar.input'), ma 'build/variant1/foobar.o' dipende ancora da un" penzoloni "' src/foobar.cc', che non dipende da nulla a sua volta e (aprire giocherellando con il codice sorgente di scons) non sembra nemmeno avere qualsiasi costruttore collegato ad esso. Sto davvero iniziando a pensare che questo sia un bug Scons. – UncleZeiv

0

So che è stato un po ', ma ho colpito lo stesso muro. Con minime modifiche al 'banco di prova' e soluzione (vedi sotto) il codice è:

import SCons 

env = Environment() 
env.VariantDir('build/variant1/', 'src', duplicate=0) 
env.Command('src/foobar.cc', 'src/foobar.input', action="cp src/foobar.input src/foobar.cc", shell=True) 
env.Depends("build/variant1/foobar.cc", "src/foobar.cc") 
env.Program('bin/test', [ 
'build/variant1/foobar.cc', 
]) 

I '' env.Depends aggiunti sul 'variantdir-source' a 'generata source' è la chiave. Non ho idea del motivo per cui è necessario. Lo definirei un bug, ma credo che sia in primo piano (basato sul feedback del bug che hai ottenuto ..)

Cheers,