Kod źródłowy skompilowany z repozytorium () nie jest umieszczany w katalogu wariantów dla projektu Hierarchical SCons
Mam projekt hierarchiczny, który używa kodu źródłowego ze wspólnego katalogu systemowego, dla którego używam SConsRepository()
funkcja i chce, aby wszystkie dane wyjściowe kompilacji (kod lokalny i kod pobrane z repozytorium) były umieszczone w variant_dir.
Jeśli korzystam zRepository()
funkcja w prostym scenariuszu (niehierarchiczna bez wywołań do podkatalogu SConscripts) następnie skompilowany plik obiektu Repository () jest umieszczany w variant_dir zgodnie z oczekiwaniami. Ale jeśli zrobię to samo w hierarchicznej kompilacji, skompilowaneRepository()
plik obiektowy jest umieszczany w katalogu głównym projektu.
Zakładając, że chcę użyć następującego kodu źródłowego znajdującego się w katalogu systemowym:
<code>/usr/local/repoDir/repoFile.cc </code>
I mam następującą strukturę projektu:
<code># tree . . |-- SConstruct |-- build | `-- linux_x86_64 `-- moduleA |-- localFile.cc `-- SConscript </code>
Oto skrypty budowania:
SConstruct
Edytować: Usunięto nazwę pliku z wywołania do Repository (), podziękowania dla Dirka Baechle'a z [email protected] za wskazanie tego.
<code>env = Environment() env.Repository('/usr/local/repoDir') env['variantDir'] = 'build/linux_x86_64' SConscript('moduleA/SConscript', exports = ['env'], variant_dir = env['variantDir'], duplicate = 0) </code>
moduleA / SConscript
<code>import os Import('env') srcFiles = [ 'localFile.cc', #os.path.join(env['variantDir'], 'repoFile.cc'), # fails to find source file #'#%s' % os.path.join(env['variantDir'], 'repoFile.cc'), # fails to find source file #'repoFile.cc', # fails to find source file '#repoFile.cc', # only option that works, but places object in root proj dir ] env.Append(CPPPATH = ['.', '#']) env.Program(target = 'myApp', source = srcFiles) </code>
ChciałbymrepoFile.cc
plik do skompilowania i umieszczenia jego pliku obiektowegobuild/linux_x86_64
, ale zamiast tego jest umieszczony w tym samym katalogu co root SConstruct.
Jak widać z komentarzy wmoduleA/SConscript
Próbowałem odwoływać się dorepoFile.cc
kilka różnych sposobów, a jedyny sposób, w jaki działał, jest taki, jak tam wspomniano Ponadto próbowałem zadzwonić doRepository()
funkcja wmoduleA/SConscript
, ale nic nie zmieniło.
Edytować: Oto wyjście kompilacji
<code># scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... g++ -o repoFile.o -c -Ibuild/linux_x86_64 -ImoduleA -I/usr/local/repoDir/moduleA -I/usr/local/repoDir/build/linux_x86_64 -I. -I/usr/local/repoDir /usr/local/repoDir/repoFile.cc g++ -o build/linux_x86_64/localFile.o -c -Ibuild/linux_x86_64 -ImoduleA -I/usr/local/repoDir/moduleA -I/usr/local/repoDir/build/linux_x86_64 -I. -I/usr/local/repoDir moduleA/localFile.cpp g++ -o build/linux_x86_64/myApp build/linux_x86_64/localFile.o repoFile.o scons: done building targets. </code>
I wynikająca z tego struktura katalogów:
<code># tree . . |-- repoFile.o <=== This file should be in build/linux_x86_64 NOT here |-- SConstruct |-- build | `-- linux_x86_64 | |-- localFile.o | `-- myApp `-- moduleA |-- localFile.cpp `-- SConscript </code>
Sprawdziłem i znalazłem to, ale to nie to samo:
Scons Hierarchical Builds with Repository directory
Jakieś sugestie, w jaki sposób mogę uzyskać plik obiektowy we właściwym miejscu?