2013-05-04 21 views
5

Ho un app con il seguente (avrei pensato abbastanza comune) gerarchia di directory:Costruzione relativo alla src/directory con SCons

/src 
    subdir1/ # Subdirs with more source files. 
     more.c 
     SConscript 
    foo.c  # Source files. 
    foo.h 
    SConscript 
/other  # Other top-level directories with no source code. 
/stuff  # However, there are other assets I may want to build. 
README  # Other top-level files. 
SConstruct 

Il problema è che quando ho eseguito scons dalla directory di livello superiore , chiama gcc da quella directory senza cd ING in src, in questo modo:

gcc -o src/foo.o src/foo.c 

questo è problematico per diversi motivi:

  1. All'interno del mio programma, I file #include danno il percorso relativo alla directory src. Ad esempio, more.c potrebbe includere foo.h con #include "foo.h". Ciò non riesce perché GCC viene eseguito dalla directory padre. Non voglio modificare my include a #include "src/foo.h".
  2. Io uso la macro speciale __FILE__ per cose come la registrazione. Quando viene creato dalla directory di livello superiore, GCC inserisce "src/" nella parte anteriore di tutti i nomi di file, poiché quello era il percorso che veniva assegnato alla compilazione. Questo può sembrare schizzinoso, ma non lo voglio, perché penso che il mio albero di origine sia relativo alla directory src.

(Edit:. Vorrei aggiungere che, ovviamente, # 1 può essere risolto con l'aggiunta di -Isrc come una bandiera per GCC, ma questo sembra più hack tutto il problema principale)

Come posso fare SCons cd nella directory src prima di chiamare gcc?

  • non voglio sbarazzarsi della directory src e spostare tutto, perché ci sono un sacco di altri file (non di codice) a livello superiore.
  • Non voglio SCons a cd in ogni sottodirectory. Deve solo cd in src e quindi creare tutti i file nella gerarchia da lì.
  • Potrei risolvere questo spostando SConscript all'interno della directory src e eseguendolo da lì, forse utilizzando un Makefile al livello superiore. Ma questo sembra abbastanza hacky, e voglio anche usare SCons per costruire risorse (non di codice) in altre directory oltre allo src.

Ho letto che è possibile creare un Builder personalizzato e farlo cambiare directory. Tuttavia, non voglio scrivere un intero nuovo Builder per C/C++. C'è un modo per modificare il comportamento di un builder esistente senza scriverne uno da zero? Inoltre, su un forum, qualcuno ha detto che la modifica delle directory all'interno di uno Builder interromperebbe le versioni parallele poiché cambierebbe la directory da cui sono state costruite altre attività. È vero?

+0

Questo sembra quello che vorrei anche per il mio problema: https://stackoverflow.com/questions/45519577/scons-link-program-without-build-directory-in-link-path –

risposta

3

Questo comportamento è proprio come funziona SCons e non è possibile evitare/modificare. Stavo cercando qualche documentazione di supporto a suo favore, e non ne ho trovato nessuno. È solo qualcosa a cui sono abituato.

Come accennato, i percorsi di inclusione sono semplici da risolvere. La parte più difficile è la macro __FILE__. Non l'avevo mai notato fino a quando non l'hai menzionato.Sfortunatamente, penso che l'unico modo per aggirare questo problema è quello di rimuovere il percorso nel logger, che è una soluzione piuttosto brutta.

+0

Grazie per la conferma i miei sospetti Bene, ho aggiornato il mio logger in modo che toglie tutto il percorso e mostra solo il nome del file (probabilmente è meglio comunque, dato che i log sembrano molto più puliti e di solito si può indovinare il percorso se necessario). Credo di poter vivere con questo ora :) – mgiuca

Problemi correlati