3

これがgithubの私のプロジェクトです。

これが私のSConstructファイルです:

SConscript('main.scons', variant_dir = 'build', duplicate = 0)

ここに私の main.scons ファイルがあります:

import sys
import os
import fnmatch

def find_source_files(directory, ext = "cpp"):
    matches = []
    for root, dirnames, filenames in os.walk(directory):
      for filename in fnmatch.filter(filenames, '*.' + ext):
          matches.append(os.path.join(root, filename))
    return matches

if __name__ == '__main__':
    for f in find_source_files('src'):
        print f
else: 
    Program(target = 'main.bin', source = find_source_files('src'))

これを実行すると、次のようになります。

bitcycle @ cypher ~/git/IeiuniumTela $ find $(pwd) -name "*.bin" -or -name "*.o" -exec rm {} \;;  scons; find $(pwd) -name "*.bin" -or -name "*.o"

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
gcc -o build/main.bin
gcc: fatal error: no input files
compilation terminated.
scons: *** [build/main.bin] Error 4
scons: building terminated because of errors.

「python main.scons」を実行してテストすると、次のようになります。

bitcycle @ cypher ~/git/IeiuniumTela $ python main.scons
src/main.cpp

ソースファイルが見つからない理由を理解するのに苦労しています。ここに提案やアイデアはありますか?

[UPDATE]メーリング リストから適切な指示を得た後、これで「十分」に機能することがわかりました。

/SConstruct : SConscript('src/main.scons', variant_dir = 'build', duplicate = 0)

/src/main.scons : Program(target = 'main.bin', source = Glob('*.cpp'))

完全なソース ツリーについては、github リポジトリを参照してください。また、完全を期すために空のビルド ディレクトリをリポジトリに追加しました。私はそれが興味深いと思います:

a. SCons のバージョンの Glob は、ソースを検出するためのこのビルド ツールのコンテキストでは再帰的ではありません。再帰的な検出オプションが優先されると思います。:(

b. scons ファイルをソース ファイルと同じディレクトリに配置する必要があります (これは面倒です )

c. Print ステートメントは明らかに機能しますが、sys.stdout.write は機能しません (python モジュールから)。

4

2 に答える 2

0

SCons は相対ディレクトリ パスを Python とは異なる方法で処理するため、テストの実行と SCons の実行に違いがあっても驚かないでしょう。通常、SCons では、すべてがルート SConstruct スクリプトまたは SConscript スクリプトに関連しています。

あなたのコードは正しいように見えますが、何が起こっているのかを正確に知るために、デバッグ用の print ステートメントをいくつか追加しfind_source_files()てみてはどうでしょうか?

後でこの関数をより広範囲に使用する予定があるかもしれませんfind_source_files()が、1 つのソース ファイルの単純なケースでは、物事を複雑にしすぎているように思われますmain.scons

Program(target = 'main.bin', source = 'src/main.cpp')
于 2013-03-11T08:06:14.007 に答える
0

main.sconsファイルが既にsrcディレクトリにあり、find_source_file実際に検索している可能性がありますsrc/srcか? scons ファイルを最上位ディレクトリに移動すると、ソース ソースが見つかりました。

更新: 調査の結果、variant_dir作業ディレクトリを に設定するとbuildfind_source_filesでファイルが検索されbuild/src、何も見つかりません。find_source_filesおそらく、SConstruct ファイルから呼び出すか、代わりに main.scons 内で使用する方がよいでしょうVariantDir()

于 2013-03-11T00:24:33.830 に答える