2

ここで scons ビルドの例を見てきましたが、私のプロジェクトに合ったソリューションを提供することを望んでいることがわかりました。

構造は次のとおりです。

root/
   Module_A/
      include/
         foo.h
         bar.h
      src/
         foo.cpp
         bar.cpp
   Module_.../

すべてのモジュールは、すべての .h のインクルード フォルダーと cpps の src ファイルという同じ構造に従います。各モジュールは共有オブジェクトに組み込まれます。実行可能ファイルはありません。

モジュールには相互依存関係があります。たとえば、Module_A はロギング メカニズムであり、モジュール B、C、D などで使用されます。同様に、Module_B は構成ローダーであり、他のいくつかのモジュールで使用されます。Module_C は IPC モジュールで、リストされているほぼすべてのモジュールで使用されます。最後に、Module_D はコマンド センターであり、他のすべてのモジュールとリンクしています (文字通り)。

プロジェクトをビルドするために再帰的なmakeを使用している現在のセットアップを置き換えることに興味があります。そのために必要な sconstruct と SConscripts を構築しようとしていますが、scons は言うまでもなく、作成するのも非常に新しいです。

各モジュールの .cpp と .h を .so に変換し、その依存関係を make now で行われているように自動的に解決することに興味があります。

SConscript では、現在 glob を使用して *.cpps を取得し、モジュールの './include' を CPPPATH に含めています。利用した

env.SharedLibrary(CPPATH='./include', source= (list of the cpps))

ただし、これは他のモジュールに依存するため、使用されている他のモジュールの関数が「宣言されていない」と述べて、機能しません。

階層的な scons セットアップを使用して、この種の複雑な構造を構築するにはどうすればよいですか?

4

1 に答える 1

5

これは、SCons を使用すると非常に簡単に行うことができます。おそらく、すべてのモジュールのルートに SConscript スクリプトが必要になるでしょう。これらはすべて、プロジェクト全体のルートにある SConstruct スクリプトによって呼び出されます。

質問を正しく理解すれば、モジュール間の依存関係の問題は、すべてのモジュールのインクルード パスを正しく指定することで解決できます。これは、SConstruct で作成された環境で1 回実行できます。その後、モジュール SConscript スクリプトに渡す必要があります。

簡単な例を次に示します。

構築物

env = Environment()

# Notice that the '#' in paths makes the path relative to the root SConstruct
includePaths = [
    '#/Module_A/include',
    '#/Module_B/include',
    '#/Module_N/include',
]

env.Append(CPPPATH=includePaths)

SConscript('Module_A/SConscript', exports='env', duplicate=0)
SConscript('Module_B/SConscript', exports='env', duplicate=0)
SConscript('Module_N/SConscript', exports='env', duplicate=0)

Module_A/SConscript

Import('env')

# Notice the CPPPATH's have already been set on the env created in the SConstruct
env.SharedLibrary(target = 'moduleA', source = ModuleA_SourceFiles)

Module_B/SConscript

Import('env')

# Notice the CPPPATH's have already been set on the env created in the SConstruct
env.SharedLibrary(target = 'moduleB', source = ModuleB_SourceFiles)

Module_N/SConscript

Import('env')

# Notice the CPPPATH's have already been set on the env created in the SConstruct
env.SharedLibrary(target = 'moduleN', source = ModuleN_SourceFiles)
于 2013-01-18T11:28:20.730 に答える