Aus einem Repository () kompilierter Quellcode wird nicht in das Variantenverzeichnis für ein Hierarchical SCons-Projekt gestellt

Ich habe ein hierarchisches Projekt, das Quellcode aus einem gemeinsamen Systemverzeichnis verwendet, für das ich die SCons verwendeRepository() funktionieren und möchten, dass die gesamte Build-Ausgabe (lokaler Code und Code aus dem Repository) in einem variant_dir abgelegt wird.

Wenn ich das benutzeRepository() Funktionieren Sie in einem einfachen Szenario (nicht hierarchisch ohne Aufrufe des Unterverzeichnisses SConscripts), wird die kompilierte Repository () - Objektdatei wie erwartet im variant_dir abgelegt. Aber wenn ich das gleiche in einem hierarchischen Build mache, wird das kompiliertRepository() Objektdatei wird im Projektstammverzeichnis abgelegt.

Angenommen, ich möchte den folgenden Quellcode verwenden, der sich in einem Systemverzeichnis befindet:

<code>/usr/local/repoDir/repoFile.cc
</code>

Und ich habe folgende Projektstruktur:

<code># tree .
.
|-- SConstruct
|-- build
|   `-- linux_x86_64
`-- moduleA
    |-- localFile.cc
    `-- SConscript
</code>

Hier sind die Build-Skripte:

SConstruct

Bearbeiten: Der Dateiname wurde aus dem Aufruf von Repository () entfernt, danke an Dirk Baechle von [email protected], der darauf hingewiesen hat.

<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>

Ich hätte gerne dierepoFile.cc Datei, die kompiliert und deren Objektdatei abgelegt werden sollbuild/linux_x86_64, sondern es befindet sich im selben Verzeichnis wie das Root-SConstruct.

Wie Sie aus den Kommentaren in sehen könnenmoduleA/SConscriptIch habe versucht, das zu referenzierenrepoFile.cc Es gibt verschiedene Möglichkeiten, und die einzige Möglichkeit, wie dies funktioniert, ist die darin erwähnte. Zusätzlich habe ich versucht das anzurufenRepository() Funktion inmoduleA/SConscript, aber es hat nichts geändert.

Bearbeiten: Hier ist die Kompilierungsausgabe

<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>

Und daraus resultierende Verzeichnisstruktur:

<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>

Ich habe nachgesehen und festgestellt, aber es ist nicht ganz dasselbe:

Scons Hierarchical Builds mit Repository-Verzeichnis

Irgendwelche Vorschläge, wie ich die Objektdatei an die richtige Stelle bekommen kann?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage