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/SConscriptPró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?

questionAnswers(1)

yourAnswerToTheQuestion