0

これは、私が実験している問題の最小限の再現手順です。

次の SConscripts と SConsctruct があるとします。

#/Sコンストラクト:

SConscript( "SConscript", variant_dir="build" )

#/SConscript:

SConscript( "lib1/SConscript" )
SConscript( "lib2/SConscript" )

#/lib1/SConscript:

Alias( "lib", SharedLibrary( "lib1", "codeLib1.cpp" ) )

#/lib2/SConscript:

Alias( "lib", SharedLibrary( "lib2", "codeLib2.cpp" ) )

scons マニュアルには、「scons -u」を呼び出すと、現在のディレクトリとその下にある指定されたターゲットのみがビルドされると記載されています。

これは、

scons -u lib

ディレクトリ #/lib1 内で、「lib」ターゲット (このシナリオでは私のエイリアス) を lib1 とそのすべての依存関係の下に構築します。

私が理解していることから、「scons -u lib」は、存在する現在のフォルダーの下に lib という名前のターゲット (この場合はエイリアス) が 1 つある場合にのみ、「lib」ターゲットをビルドします。他の場所 (プロジェクトのルートにあるとしましょう) に存在するターゲットの「テスト」を要求すると、コンパイルされませんでした。

scons が使用するアルゴリズムは次のようです。

  • すべての SConscript を読み取り、依存関係ツリーを構築します
  • コマンド ライン (「lib」) の要求されたターゲットが現在のディレクトリまたはその下に存在するかどうかを確認します (「-u」)。
  • 存在しない場合は、何もしないでください
  • 存在する場合は、そのターゲットのすべての依存関係をコンパイルします。

残念ながら、「lib」は lib1 と lib2 に依存しており、scons はそれらの両方をコンパイルします。lib2 が lib1 の下になかったので、ビルドに追加されなかったことを願っています。

解決策の 1 つは、ライブラリごとに lib という接尾辞が付いた独自のエイリアスを持たせることですが、そうすると、システムの使用が難しくなります。もう 1 つは、エイリアスが作成されている場所を調べることです (環境の Alias メソッドを、Scons の call_stack グローバルを使用する独自のものに置き換えて、どの SConscript から Alias を呼び出しているかを確認し、場所に応じて作成するかどうかを確認します)。 SConscript の) を作成し、新しく作成されたエイリアスまたはオブジェクトをそのまま返します。

いじりたくないので、何かが足りないのではないかと思っていました。

感謝

4

1 に答える 1

0

Alias() 関数を使用して lib1 と lib2 を別々に扱う場合は、次のようにそれぞれに異なるエイリアス名を割り当てる必要があります。

/lib1/SConscript:

Alias( "lib1", SharedLibrary( "lib1", "codeLib1.cpp" ) )

/lib2/SConscript:

Alias( "lib2", SharedLibrary( "lib2", "codeLib2.cpp" ) )

両方のターゲットに同じエイリアス名を割り当てると、両方のターゲットが同じエイリアス名に追加され、そのエイリアス ターゲットをコンパイルするときに両方がコンパイル/評価されます (コンパイルと見なされます)。

特定のディレクトリにあるものだけをコンパイルしたい場合は、次のことができるはずです。

# cd lib1
# scons .

または、プロジェクトのルート ディレクトリにいると仮定して、コンパイルするパスを指定できます。

# scons ./lib1
于 2012-05-04T07:30:15.950 に答える