2012-11-13 21 views
5

Windows上でSConsとMinGWを使用してgccとgfortranオブジェクトから共有ライブラリを構築しようとしていますが、最終リンク時にはコマンドラインが長すぎて18000文字を超えません。私は、コマンドラインを渡すために一時ファイル(応答ファイル?)を使う必要があることを知っていますが、私はSConsに直接これをさせる方法を見つけることができません。私はこのライブラリにCMakeを使用していましたが、私の干渉なしに応答ファイルを処理しました。SCons長いコマンドラインのTEMPFILEとMinGW

SConsはCommandGeneratorActionを使用して共有ライブラリのコマンドラインを生成しているようです。このアクションに応答ファイルのメカニズムを使用するよう指示する方法はありますか?私が見逃している長いコマンドラインを処理する別の方法がありますか?

関連SConscript:env.Dump(から

sqllib = env.SharedLibrary(target='fvssql', source=sqllib_sources, LIBS=['odbc32',]) 
ffelib = env.SharedLibrary(target='fvspncffe', source=ffelib_sources, LIBS=[sqllib,], LIBPATH=['.',]) 

fvsobjs = env.SharedObject(fvslib_sources) 
fvsobjs = [obj for obj in fvsobjs if obj.get_suffix()=='.o'] 

fvslib = env.SharedLibrary(target='fvspnc', source=fvsobjs, LIBS=sqllib+ffelib, LIBPATH=['.',]) 

関連出力):

'SHLIBSUFFIX': '.dll', 
'SHLINK': '$LINK', 
'SHLINKCOM': <SCons.Action.CommandGeneratorAction object at 0x02DDF770>, 
'SHLINKFLAGS': ['$LINKFLAGS', '-shared'], 

私は私の環境env['SHLINKCOM']="${TEMPFILE('$SHLINK -o $TARGET ... $SOURCE')}"でコマンドラインテンプレートを準備することもできますが、これは壊れやすいようだと私は思います可能であればSConsに処理させてください。

文字列置換env['SHLINKCOM']='${TEMPFILE("%s")}' % (env['SHLINKCOM'],)を使用しようとしましたが、結果は不完全なコマンドラインであり、今や応答ファイルとなりました。私はLongCmdLinesOnWin32回避策を見てきました

EDIT

。可能であれば、TEMPFILE、TempFileMunge、コマンドラインインダイレクションメカニズムを使用することをお勧めします。

答えて

1

あなたはhttp://scons.org/wiki/LongCmdLinesOnWin32を見ましたか?リンクフェーズ中に長いコマンドリンクを使用した場合の正確な問題に対する答えがあるようです。

+0

この回避策を見ました。しかし、この[解決策](http://scons.org/wiki/LongCmdLinesOnWin32?action=recall&rev=1)は現在8歳です。それ以来、SConsはtempfile間接参照メカニズムを使用するように進化したようです。私が一時ファイルの適切な使用を特定できない場合は、この回避策を試してみます。 – tharen

+0

最後のコメントはかなり最近です。とにかく、あなたがより良い方法を見つけるなら、パッチは常に高く評価されます。 http://scons.org/wiki/LongCmdLinesOnWin32?action=diff&rev1=40&rev2=41 –

+0

[LongCmdLinesOnWin32](http://scons.org/wiki/LongCmdLinesOnWin32)に問題があることに注意してください。引用符付きのパス名を扱うために拡張する必要がありますが(Cygwin環境のハンドルスペースに追加されます)、さらにVisual Studioには問題があるようです。 VS環境がSPAWNの独自のバージョンをインストールし、MSVCコマンドラインシェルを起動して(必要なenv。値を設定しているように)VS環境がインストールされ、 'cl'を使ってコンパイルが失敗するように見えます。 – TheDuke