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:
- All'interno del mio programma, I file
#include
danno il percorso relativo alla directorysrc
. Ad esempio,more.c
potrebbe includerefoo.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"
. - 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 directorysrc
.
(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 solocd
insrc
e quindi creare tutti i file nella gerarchia da lì. - Potrei risolvere questo spostando
SConscript
all'interno della directorysrc
e eseguendolo da lì, forse utilizzando unMakefile
al livello superiore. Ma questo sembra abbastanza hacky, e voglio anche usare SCons per costruire risorse (non di codice) in altre directory oltre allosrc
.
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?
Questo sembra quello che vorrei anche per il mio problema: https://stackoverflow.com/questions/45519577/scons-link-program-without-build-directory-in-link-path –