2016-12-19 9 views
0

scons 2.4.1から2.5.1に更新され、突然いくつかのエラーが発生する: scons:***見つかった依存サイクル: 内部エラー:ノードのサイクルが見つかりませんでした。Scons Cyclic Dependency

私の問題は、SCMがソースファイルの編集を検出した場合に自動的に更新を試みるバージョンファイルに関するものと考えられます。このプロセスの要点は、#defineを持つファイル 'version.cfg'を維持することです。このファイルはSCMにチェックインされています。ファイルがすでに一度更新されている場合、ファイルがSCMにコミットされるまで、ファイルはもう一度更新されません。このファイルは、 'kb_version.hh'という名前のC++ヘッダーファイルを自動生成するために使用されます。

循環依存関係とは何ですか、どうすれば除外できますか? 。(問題は(私たちは新バージョン2.5.1を使用する場合にのみ、それは循環依存を検出しない)sconsの2.4.1で問題が発生していなかった、あるものは何でもノート、

関連sconsのは、スニペットは以下の通りです:

SRCDIR = '../../src' 

SRCS = [ 
    'kb.cc', 
] 

SOURCE = [ os.path.join(SRCDIR, s) for s in SRCS ] 

SCRIPT_VERSION_GEN = os.path.join(env['_ROOT'], 'kb/build/scripts/versionGen.sh') 
SCRIPT_VERSION_UPD = os.path.join(env['_ROOT'], 'kb/build/scripts/versionUpdate.sh') 

FILE_VERSION_CFG = 'version.cfg' 
FILE_VERSION_HH = 'kb_version.hh' 

scriptVerGen = env.File(SCRIPT_VERSION_GEN) 
scriptVerUpd = env.File(SCRIPT_VERSION_UPD) 
verCfg = env.File(os.path.join(SRCDIR, FILE_VERSION_CFG)) 
verHH = env.File(os.path.join(SRCDIR, FILE_VERSION_HH)) 

## this command detects for change in source files, then updates, when necessary, the source version.cfg 
env.Command(
    target = verCfg, 
    source = [ SOURCE, scriptVerUpd ], 
    action = [ scriptVerUpd.path + ' ' + env['BS_DIR_SRCROOT'] + '/kb/foo' + verCfg.srcnode().path, Copy(verCfg.path, verCfg.srcnode().path) ] 
) 

env.Command(
    target = verHH, 
    source = [ verCfg, scriptVerGen ], 
    action = scriptVerGen.path + ' ' + verHH.path + ' ' + verCfg.path 
) 
+1

バージョン2.5には、「、あなたの依存関係の走査機構を強化し、新しい依存関係が見つかる可能性があることに注意してください。循環依存性は、SConsにおける論理の強化から新たに見出された依存性によって見出されるようである。 – bdbaddog

答えて

0

いくつかのインライン質問。 ...上記のコメント欄で行うことは容易ではない(以下のコメント##を参照してください)あなたは、リリースノートを読む場合

SRCDIR = '../../src' 

SRCS = [ 
    'kb.cc', 
] 

SOURCE = [ os.path.join(SRCDIR, s) for s in SRCS ] 


## Is _ROOT the top of your tree where SConstruct lives? 
SCRIPT_VERSION_GEN = os.path.join(env['_ROOT'], 'kb/build/scripts/versionGen.sh') 
SCRIPT_VERSION_UPD = os.path.join(env['_ROOT'], 'kb/build/scripts/versionUpdate.sh') 

FILE_VERSION_CFG = 'version.cfg' 
FILE_VERSION_HH = 'kb_version.hh' 

scriptVerGen = env.File(SCRIPT_VERSION_GEN) 
scriptVerUpd = env.File(SCRIPT_VERSION_UPD) 
verCfg = env.File(os.path.join(SRCDIR, FILE_VERSION_CFG)) 
verHH = env.File(os.path.join(SRCDIR, FILE_VERSION_HH)) 

## this command detects for change in source files, then updates, when necessary, the source version.cfg 
env.Command(
    target = verCfg, 
    source = [ SOURCE, scriptVerUpd ], 

    ## Why not do this? 
    action = [ '$SCRIPT_VERSION_UPD $BS_DIR_SRCROOT /kb/foo ' + verCfg.srcnode().path, ## Why srcnode()? 
       ## Why do this? 
       Copy(verCfg.path, verCfg.srcnode().path) ] 
) 

env.Command(
    target = verHH, 
    source = [ verCfg, scriptVerGen ], 
    ## How about this change 
    action = '$SCRIPT_VERSION_GEN $TARGET' + verCfg.path 
) 
+0

1)_ROOTはSCONS envで設定したシェル環境変数で、ソースコードツリーのルートパスです。 SConstructはそのツリー内のサブディレクトリにあります(ビルド中のプロジェクトに応じて複数のSConsctructがあります)。 -Cオプションでsconsを呼び出します。 2)scmがコードベースの特定の領域でファイルが変更されたことを検出した場合、version.cfgを更新しようとしています。検出ロジックはスクリプト$ SCRIPT_VERSION_UPD内にあります。このファイルを更新してからSCMにチェックインする必要があるので、変更をdirのディレクトリではなくsrcnodeに適用します。 – rkemp

+0

私はあなたの提案された変更を試みました、そして私が予測した効果は同じでした。 – rkemp