scons依存関係に問題があります。 バリアントディレクトリを持つ階層ビルドビルドに問題があります。バリアントディレクトリを持つ階層ビルドにおけるscons依存関係の問題
イム 2 SConscriptディレクトリの下のサブディレクトリ(moduleAとmoduleB)などで構成されて減少した環境で問題を再現することができ、以下:ここ
.
|-- SConstruct
|-- file.conf
|-- moduleA
| |-- SConscript
| `-- conf2cc
`-- moduleB
|-- SConscript
`-- fileB.cc
が何をすべきかの流れです。
- moduleAは、シェルスクリプトを実行します。conf2cc、入力:$ projRootDir/file.conf、出力:moduleA/$ variantDir/source.cc
- moduleAはsource.ccをコンパイルし、moduleA/$ variantDir /李を作成しますbmoduleA.a
- moduleBはmoduleBはlibmoduleB.a その ライブラリにmoduleB/source.ccとmoduleB/fileB.ccをコンパイルする必要が
- moduleB/source.ccにmoduleA/$ variantDir/source.ccをコピーする必要があります
ここでいくつかのことを間違えている可能性があります。例えば、私は はmoduleAコマンド()で$ TARGET/$ソースを使用していないイムを知っているが、目的のthatsのは、 スクリプトは絶対パス名を必要とするため、およびsconsのは先頭の「#1」
問題を削除するdoesntの私はmoduleB(上記のステップ3)のCommand()ビルダは実行されません。ここで
SConstructとSConscriptファイルは以下のとおりです。ここ
Sconstruct
import os
env = Environment()
env['variantDir'] = 'linux' # for this example, just make variantDir = linux
modules = ['moduleA', 'moduleB']
for dir in modules:
SConscript(
os.path.join(dir, 'SConscript'),
variant_dir = os.path.join(dir, env['variantDir']),
exports = ['env'],
duplicate = 0)
moduleA/Sconscript
import os
Import('env')
scriptInput = '#file.conf'
sourceFile = os.path.join('#moduleA', env['variantDir'], 'source.cc')
conf2ccScript = File('#moduleA/conf2cc').abspath
# The script needs abspaths for input and output, not the scons '#' prepended
# the script syntax is: script <inputFile> <outputFile>
cmd = '%s %s %s' % (conf2ccScript, File(scriptInput).abspath, File(sourceFile).abspath)
# Generate source.cc file based on file.conf
conf2ccNode = env.Command(target = sourceFile,
source = scriptInput,
action = cmd)
libNode = env.Library(target = 'moduleA', source = sourceFile)
env.Depends(libNode, conf2ccNode)
moduleB/Sconscript
import os
Import('env')
sourceFiles = ['fileB.cc', 'source.cc']
# Get the source.cc file
externalSourceFile = os.path.join('#moduleA', env['variantDir'], 'source.cc')
sourceTarget = os.path.join('#moduleB', 'source.cc')
cmdNode = env.Command(target = sourceTarget,
source = externalSourceFile,
action = Copy('$TARGET', '$SOURCE'))
libNode = env.Library(target = 'moduleB', source = sourceFiles)
env.Depends(libNode, cmdNode)
を出力する場合であります私はsconsを実行します:
ご協力いただければ幸いです!
ブレイディ
[email protected]:~/projects/sconsTest/sconsTestHierDeps$ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
/home/notroot/projects/sconsTest/sconsTestHierDeps/moduleA/conf2cc /home/notroot/projects/sconsTest/sconsTestHierDeps/file.conf /home/notroot/projects/sconsTest/sconsTestHierDeps/moduleA/linux/source.cc
g++ -o moduleA/linux/source.o -c moduleA/linux/source.cc
ar rc moduleA/linux/libmoduleA.a moduleA/linux/source.o
ranlib moduleA/linux/libmoduleA.a
g++ -o moduleB/linux/fileB.o -c moduleB/fileB.cc
scons: *** [moduleB/linux/source.o] Source `moduleB/source.cc' not found, needed by target `moduleB/linux/source.o'.
scons: building terminated because of errors.
素晴らしいです!それは期待どおりに動作します。 SConsは暗黙の依存関係を明示的にDepends()関数でリストするのではなく、私が好むのが好きです。どうもありがとう! – Brady
しかし、1つの注意点:moduleB/source.ccのオブジェクトファイルはmoduleBに配置され、moduleBのvariant_dirには配置されませんが、fileB.oは実際にvariant_dirに配置されます。何故ですか?どうすればsource.oをvariant_dirに置くことができますか? – Brady
モジュールBのsource.ccファイルを次のように指定して見つけました。 'sourceTarget = os.path.join( '#moduleB'、env ['variantDir']、 'source.cc')' .ccとsource.oファイルはvariant_dirに配置されます。 – Brady