共通のシステム ディレクトリのソース コードを使用する階層プロジェクトがあり、SConsRepository()
関数を使用しており、すべてのビルド出力 (ローカル コードとリポジトリから取得したコード) を variant_dir に配置したいと考えています。
Repository()
単純なシナリオ (サブディレクトリ SConscripts を呼び出さない非階層的) で関数を使用すると、コンパイルされた Repository() オブジェクト ファイルは、予想どおり variant_dir に配置されます。しかし、階層ビルドで同じことを行うと、コンパイルされたRepository()
オブジェクト ファイルはプロジェクトのルート ディレクトリに配置されます。
システム ディレクトリにある次のソース コードを使用するとします。
/usr/local/repoDir/repoFile.cc
そして、私は次のプロジェクト構造を持っています:
# tree .
.
|-- SConstruct
|-- build
| `-- linux_x86_64
`-- moduleA
|-- localFile.cc
`-- SConscript
ビルド スクリプトは次のとおりです。
Sコンストラクト
編集:指摘してくれた users@scons.tigris.org の Dirk Baechle に感謝し、Repository() の呼び出しからファイル名を削除しました。
env = Environment()
env.Repository('/usr/local/repoDir')
env['variantDir'] = 'build/linux_x86_64'
SConscript('moduleA/SConscript',
exports = ['env'],
variant_dir = env['variantDir'],
duplicate = 0)
moduleA/Sコンスクリプト
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)
repoFile.cc
ファイルをコンパイルして、そのオブジェクト ファイルを に配置したいのですbuild/linux_x86_64
が、代わりに、ルート SConstruct と同じディレクトリに配置します。
のコメントからわかるように、いくつかの異なる方法をmoduleA/SConscript
参照してみましたが、機能する唯一の方法はそこに記載されているとおりです。さらに、 で関数をrepoFile.cc
呼び出してみましたが、何も変わりませんでした。Repository()
moduleA/SConscript
編集:コンパイル出力は次のとおりです
# 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.
結果のディレクトリ構造は次のとおりです。
# 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
私は周りをチェックしてこれを見つけましたが、まったく同じではありません:
オブジェクトファイルを適切な場所に配置する方法について何か提案はありますか?