3

私はsconsをできるだけ便利に設定しようとしています。ビルドスクリプトは正常に機能しますが、まだ1つの問題があります。

makeを使用して、「make」を2回続けて実行すると、ターゲットが最新であることが検出されるため、2回目は何も実行されません(ビルドしたばかりであるため)。

sconsが同じように動作することを確認するにはどうすればよいですか?現在、sconsをもう一度実行すると、ターゲットを再度ビルドする必要があると見なされ、さらに、残りのすべての.oファイルの依存関係が競合しているため(cleanが最初に呼び出されなかったため)、ビルドに失敗します。

どうすればsconsにこれを単独で処理させることができますか?つまり、ターゲットが古くなっているかどうかを検出し、古くなっている場合はそれに応じて再構築しますか?

また、電話すると気づきました

scons
scons -q

ビルドしてから直接質問しても、終了ステータスは常に1です。正しく理解していれば、ターゲットが最新であるため、0になるはずです。

助けていただければ幸いです。

編集:

これが私のSConstructファイルです。私が何か間違ったことをしている場合は、それを私の注意を引いてください:

import os

env = Environment(CXX = "C:/MinGW/bin/g++", CCFLAGS = "-g")
env.Tool("mingw")

sourceList = list('./src/' + x for x in os.listdir("./src"))

pathList = ['./include',
            'C:/boost',
            'C:/frameworks/SFML/include',
            'C:/Python27/include']

libPathList = ['C:/boost/stage/lib', 'C:/frameworks/SFML/lib', 'C:/Python27/libs']
libList = ['boost_thread-mgw45-mt-1_46_1',
           'boost_python-mgw45-mt-1_46_1', 
           'sfml-system',
           'sfml-window',
           'sfml-graphics',
           'python27']

env.Append(CPPPATH=pathList)
env.Append(LIBPATH=libPathList)
env.Append(LIBS=libList)

t = env.Program(target='./bin/build_result.exe', source=sourceList)
Default(t)

はい、適切なデバッグオプションを追加する必要があることはわかっていますが、後でファイルを改良することができます。しかし、私が経験していることに関連する問題があるかどうかはわかりません。さらに、このファイルは、小規模なテストプロジェクトに最適です。

import os

env = Environment(CXX = "C:/MinGW/bin/g++", CCFLAGS = "-g")
env.Tool("mingw")

sourceList = os.listdir('.')
sourceList = list(x for x in sourceList if x[-3:] == 'cpp')

t = env.Program(target='./result.exe', source=sourceList)
Default(t)

「scons-q」も期待どおりに機能します。何が起こっているのか分かりますか?

4

2 に答える 2

2

SConsでコンパイルするソースファイルを指定するより一般的な方法は次のとおりです。

sourceList = Glob('#/src/*.cpp')
t = env.Program(target='#/bin/build_result.exe', source=sourceList)

'#'パス内の文字に注意してください。SConsでは、SConstructファイルが配置されているディレクトリからの相対を意味します。Glob()のドキュメントSConstruct相対パスのドキュメント。

さらに、SConstructファイルのすべてを構成してから、SConscript()関数を使用してディレクトリにSConscriptファイルをロードできますsrc。これにより、SConstructで作成された環境がインポートされ、コンパイルするファイルと必要なターゲットが指定されます。これは将来性があり、それぞれが独自のSConscriptファイルを持つソースディレクトリを追加するのが簡単になります。これはSCons階層ビルドと呼ばれます。

于 2012-05-17T06:52:22.717 に答える
1

ああ、問題を見つけました。この線の下:

sourceList = list('./src/' + x for x in os.listdir("./src"))

追加すべきだった

sourceList = list(x for x in sourceList if x[-3:] == 'cpp')

最初のビルドの.oファイルは./srcディレクトリに生成されたため、2回目はオブジェクトファイルをソースとして取得していました。問題が解決しました。

于 2012-05-16T22:04:35.270 に答える