2010-09-15 10 views
11

Ho cercato di ottenere scons per l'output di file exe, obj, lib e dll in una specifica directory di build.Uscita Force Scons (exe, obj, lib & dll) in specifica directory di build

mia struttura dei file è simile al seguente:

/projectdir 
    /build 
    /bin 
    /obj 
    /source 
    /subdirs 
    /.. 
    SConstruct 

In sostanza, ciò che ho ora è la mia directory di origine è sempre inquinato con i file obj. Preferirei avere tutto in un unico posto.

Il file SConstruct assomiglia a questo:

env.VariantDir('build', 'source', duplicate = 0) 
env.Program('Hierarchy', source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp']) 

Ho letto alcune altre domande simili su questo sito, ma havn't ancora trovato una buona soluzione.

Grazie

risposta

8

Il modo più semplice che ho trovato è quello di utilizzare 2 file, un file di SConstruct e uno SConscript separato.

Nella SConstruct è sufficiente chiamare l'altro file e specificare la directory per l'uscita di costruzione:

# content SConstruct 
SConscript('main.scons', variant_dir='build', duplicate=0) 

Poi nel 'main.scons' che si fanno la carne della vostra build. Puoi dimenticare le varianti di directory in questo file.

# content of main.scons 
env = Environment() 
env.Program('Hierarchy', 
      source = ['source/sconstest.cpp', 'source/utils/IntUtil.cpp']) 
+0

Grazie, ha funzionato, anche se avere un solo file è molto più pulito. Penso che dovrò solo conviverci! –

3

I VariantDir (anche descritto nel user guide) ordina al scons per mettere generati i file in una directory separata. Nelle versioni precedenti di scons questa funzione era denominata BuildDir.

Si potrebbe anche voler leggere su evitare la duplicazione della directory di origine (descritta sia nella guida per l'utente e sul wiki).

+1

sì, questo è quello che ho provato: env.VariantDir ('costruire', 'sorgente', duplicare = 0) env.Program (, source = [ 'fonte/sconstest.cpp', 'fonte 'gerarchia' /utils/IntUtil.cpp ']) e questo non ha assolutamente alcun effetto :( –

+0

Il file da compilare non dovrebbe essere nella cartella di origine ma nella build: 'env.Program (' Hierarchy ', source = [' build/sconstest.cpp ',' build/utils/IntUtil.cpp ']) ' – Phong

5

Non è così difficile da ottenere VariantDir di lavoro utilizzando un solo file SConstruct (per un piccolo progetto), ma è molto confondere come la configurazione è diversa per il caso d'uso di un file e il due file.

Solo SConstruct:

env = Environment() 
env.VariantDir('build', 'src', duplicate=0) 
files = Glob('build\*.c') 
env.Program("build\program", files) 

Notate come i file di origine si trovano in .\src ma .\build è specificato come la posizione. L'output deve anche essere "prefissato" con .\build altrimenti il ​​programma compilato risiederà nella directory del file di SConstruct.

Quando si esegue lo script, SCons compilerà i file *.c da .\src e inserirà gli oggetti risultanti in .\build.

Non c'è da stupirsi che abbiano rinominato BuildDir in VariantDir per cercare di evitare la confusione (senza molto successo).

1

Stavo usando un metodo a due file come la risposta di Richq, ma anche se i prodotti di build finali (librerie, programmi) stavano andando nella giusta variante di directory, i file oggetto stavano ancora andando alla directory di origine.

La soluzione si è rivelata essere glob i file di origine per percorso relativo anziché assoluto. Non ho idea del perché.

Il mio secondo file scons aveva inizialmente questo aspetto. Nota globbing in base al percorso assoluto - quando ho scritto per la prima volta non avevo realizzato che i percorsi sarebbero automaticamente relativi al file scons.

import os, inspect 
env = Environment() 
packageDir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
src = Glob(os.path.join(packageDir, "src/*/*.c*"), strings=True, source=True) 
env.Program('Foo', source = src) 

E quello ha provocato * .obj che termina sotto src/e il programma sotto la mia variante dir. Quando ho cambiato in seguito, i file oggetto anche andato al dir variante:

env = Environment() 
src = Glob("src/*/*.c*", strings=True, source=True) 
env.Program('Foo', source = src) 

Uso dei percorsi assoluti è probabilmente un errore niubbo - Sono relativamente nuovo per entrambi scons e Python - ma ho pensato che' d condividerlo nel caso in cui qualcun altro ha lo stesso problema frustrante.

+0

Il motivo per cui i file intermedi stavano finendo nella directory dei sorgenti è perché li stavi chiedendo da lì. Se li hai richiesti dalla dir variante, o da una dir relativa, allora S Contro popolerà le fonti nella variante e quindi produrrà anche l'output. (ovviamente se chiedete alla variante dir di non copiare allora non copierà le sorgenti lì, ma produrrete i file di output nella dir variante) – bdbaddog

+0

Aha, che ha un po 'più senso. Grazie per l'indizio! – Soleil