2

scons に基づくプロジェクト用のビルド システムを作成しようとしています。

プロジェクトはいくつかのディレクトリで構成され、それぞれがプロジェクト全体の一部を保持しています。
各ディレクトリには、共有ライブラリ、プログラム、またはプロセス (デーモン) のいずれかのソースが保持されます。
1 つのディレクトリ ( bin ) には、すべての共有ライブラリとすべての実行可能ファイルが格納されます。

ほとんどのディレクトリには、ディレクトリのモジュール (lib / executable) をビルドしてbinディレクトリに配置する sconscript ファイル ( Sconstructという名前) が既に含まれています。

ここで、もう 1 つの sconscript を作成して、すべてを支配したいと考えています。
親ディレクトリには、プロジェクトのすべてのライブラリと実行可能ファイルをビルドする sconscript が必要です。親ディレクトリと影響を受けるすべてのモジュールが再構築されます。

いくつかの方法を試しましたが、すべて失敗しました。
私は scons ビジネスの初心者であり、これが私の失敗の根本的な原因ではないかと疑っていますが、この問題は他の経験豊富な開発者によって何度も解決されたと確信しています - 私が説明した状況は非常に一般的です.

だから、どんな提案も大歓迎です!

編集:

親ディレクトリの現在の Sconstruct は次のようになります。

import os  
env = os.environ  
Export('env', 'os')  

SConscript([  
'Server1_Dir/Sconstruct',  
'Server2_Dir/Sconstruct',  
'Server3_Dir/Sconstruct'  
])

サブディレクトリ内の Sconstructs (Sconscript と呼ばれる必要があることはわかっています) は次のように始まります。

import os  
Import('env')  
home=env.get('HOME')  

したがって、すべてのスクリプトに同じ環境を使用しているように思えますが、多くのスクリプトを取得しています。

scons: warning: Two different environments were specified for target....  

私には不明確な警告。
また、メイン スクリプトのすべてのサーバーの組み合わせでこれらの警告が生成されるわけではないことにも注意してください。
これが正しい方法のように思えますが、これらの警告 (およびその根本原因) を取り除く方法が見つかりません。

ありがとう。

4

2 に答える 2

0

ここで説明するように、やりたいことは階層ビルドと呼ばれます。SCons では、プロジェクトごとに 1 つの SConstruct しか存在できません。

SCons で階層ビルドを作成する方法は、ルート SCons スクリプトを SConstruct にし、サブディレクトリ SCons スクリプトを SConscript と呼ぶことです。ルート SConstruct スクリプトは、上記のリンクで説明されている SConscript() 関数を使用してサブディレクトリ SConscripts を「ロード」します。

ルート SConstruct と lib および bin サブディレクトリがあると仮定した例を次に示します。

Sコンストラクト

env = Environment()

SConscript('lib/SConscript', exports='env')
SConscript('bin/SConscript', exports='env')

ライブラリ/SConscript

Import('env')
env.Library('yourlib', ['yourLibSource.cc'])

ビン/SConscript

Import('env')
env.Program('yourbin', ['yourBinSource.cc'])
于 2012-12-09T17:58:02.213 に答える
0

統合を試みる前の私のスクリプトは、次のようになっていました (そして、正しく機能していました)。

ライブラリ構築スクリプト構造:

  1. 環境と定義:
    ~~~~~~~~~~~~~~~~~~~~~~

    import os  
    env = os.environ  
    home = env.get('HOME')  
    projects = []  
    third_parties_projects = []  
    my_rpath = []
    
  2. パスとファイルのリストを準備中:
    ~~~~~~~~~~~~~~~~~~~~~~~~

    all_user_implemented_libs = os.path.join(home,"Project/lib/")  
    my_rpath.append("/path/to/lib/dir/")  
    
    projects.append(os.path.join(home,"Project/library_1/"))  
    projects.append(os.path.join(home,"Project/library_2/"))  
    ...  
    
    third_parties_projects.append("/opt/some_product/include/")  
    ...  
    
    so_files = Split("""  
        source_1.cpp  
        source_2.cpp  
        ...  
                """)
    
  3. ビルドの制御:
    ~~~~~~~~~~~~~~~~

    myprog = Environment(CXXFLAGS = flags, ENV = env, CPPPATH = projects + third_parties_projects + ['.'], RPATH = my_rpath)  
    myprog.Decider('MD5')  
    mylib = myprog.SharedLibrary(all_user_implemented_libs + 'lib_name', so_files)  
    myprog.Default(mylib)  
    

プロセス構築スクリプト構造:

  1. 環境と定義:
    ~~~~~~~~~~~~~~~~~~~~~~

    import os  
    env = os.environ  
    home = env.get('HOME')  
    projects = []  
    third_parties_projects = []  
    user_libpaths = []  
    my_rpath = []
    
  2. パスとファイルのリストを準備中:
    ~~~~~~~~~~~~~~~~~~~~~~~~

    projects.append(os.path.join(home,"Project/library_1/"))  
    projects.append(os.path.join(home,"Project/library_2/"))  
    ....  
    
    my_rpath.append("/path/to/lib/dir/")  
    third_parties_projects.append("/opt/some_product/include/")  
    ...  
    
    all_user_implemented_bins = os.path.join(home,"Project/bin/")  
    all_user_implemented_libs = os.path.join(home,"Project/lib/")  
    
    flags = ''  
    
    libs = Split("""  
        lib_1  
        lib_2  
        ...  
                 """)  
    
    third_party_libpaths.append("/opt/some_product/")  
    ...  
    
    source_ext_files = Split("""  
        ext_source_1.cpp  
        ...  
            """)  
    
    source_files_for_executable = Split("""  
        source_1.cpp  
        sosurce_2.cpp  
        ...  
            """)  
    
    user_libpaths.append(all_user_implemented_libs)
    
  3. 基盤となるライブラリの構築:
    ~~~~~~~~~~~~~~~~~~~~~~

    for project in projects:  
        SConscript(project+'/Sconstruct')
    
  4. ビルドの制御:
    ~~~~~~~~~~~~~~~~

    myprog = Environment(CXXFLAGS = flags, ENV = env, CPPPATH = projects + third_parties_projects + ['.'], RPATH = my_rpath)  
    myprog.Decider('MD5')  
    my_prog = myprog.Program(all_user_implemented_bins + 'process_name', source_files_for_executable + source_ext_files, LIBS = libs, LIBPATH = third_party_libpaths + user_libpaths)  
    myprog.Default(my_prog)
    

これらのスクリプトは、対応する lib/exec ディレクトリに分散されており、個別に実行すると正常に動作します。
ここで、必要に応じて、製品全体 (すべての実行可能ファイルとすべての基盤となるライブラリ) をビルドする親ディレクトリに、もう 1 つのスクリプト (元の質問のようなもの) を追加したいと考えています。

ありがとう。

于 2012-12-17T13:38:03.353 に答える