プロジェクトでは、CMakeでAndroid gradleyスクリプトを使用していますが、gradleプラグインはバージョン3:0:0、CMakeバージョン3.6です。 gradleとCMakeの両方のファイルはかなりシンプルで面白くありません(使用するファイルを定義するだけで、必要に応じてコピー&ペーストできます)。CMake共有プロジェクトのサブディレクトリが再構築されない
私は以下のプロジェクト構造を持っています。基本的には、数十個の.soファイル(apkにパッケージ化され、それによって「実行可能ファイル」と呼ばれるAndroidパッケージのネイティブ部分)を生成するコードベースです。これらはすべて、同じ共有ライブラリコード(静的ライブラリ、 ')。ライブラリコードはまだ(比較的)揮発性であるため、実行可能ファイルにプロジェクトレベルの依存関係を持たせて、実行可能ファイルがビルドされるたびにコードが変更されるたびにライブラリをオンデマンドで再構築するようにします。 構造のようになります。図書館のCMakeListsは、実行可能ファイルのプロジェクトは
add_subdirectory(${PROJECTS_ROOT}/LibProjects/${LibraryName} ${PROJECTS_ROOT}/Framework/Bin/Android/${ANDROID_ABI}/${LibraryName})...
『通常通り』のライブラリの依存関係を追加
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY {CMAKE_CURRENT_SOURCE_DIR}/../Bin/${ANDROID_ABI}/${LibraryName})
を使用してBinフォルダにその出力をリダイレクト
+ LibProjects/
---Bin/ (Originally empty)
---Lib1/CMakeLists.txt (+sources files, same level as the CMakeLists.txt)
...
---Lib10/CMakeLists.txt (same)
+ Executables/
---Executable1/CMakeLists.txt (source files here)
--------------/AndroidFiles/build.gradle (and other android project files)(points to the CMakeLists.txt)
...
---Executable40/CMakeLists.txt
私は感覚的な実行可能ファイルを得ることができ、実行可能ファイルはライブラリのビルドをトリガするという意味で、ほとんどすべてが動作します。
問題は、実行可能ファイルを順番にビルドするときに、それぞれがライブラリプロジェクトの出力を再利用しないことです。Executable1をビルドすると、すべてのライブラリ(通常)がビルドされ、ビルドされます。その後、私はExecutable2をビルドすると、既にExecutable1用に構築されたライブラリを再利用しません。これによりビルド時間が10分の1になります。
各ライブラリのビルドの出力は、期待通りに/ Binフォルダ内にありますが、実行可能ファイル間で再利用されることはありません.CMakeの "プロジェクトファイル"(これは正しい用語です)はbinフォルダにありませんそれらのすべてが実行可能ビルドディレクトリ内で生成されます。
私が解決しようとしている問題は、各ライブラリが各実行ファイルに対して再構築されるという事実から生じるビルド時間です。
私が検討している解決策は、何とかCMakeに、実行可能ファイルではなく、独自のフォルダ内の各ライブラリの作業フォルダとしてBinフォルダ(または別のフォルダ)を使用するように指示して、gradle android plugin cmakefilesもオブジェクトファイルも再生成する必要がなく、再構築を避けることができるほどスマートになります。
私はコードベース自体を再構築できないこと、そして各実行ファイルは別々にビルド可能でなければならないということです - 最上位のCMakeの可能性は全くありません - 各実行ファイルが起動できるはずですそのままで。
あなたはExecutable1の下にしかありませんか?あるいはこれらのうち40個はありますか? –
依存関係の問題のように見えますが、ターゲットがすべてのターゲットの依存関係を明示的にリストしているかどうか確認できますか?また、ライブラリと実行可能ファイルの 'CMakeLists.txt'を投稿することもできます。 – AmeyaVS
AndroidFiles私は40を持っています。私はCMakeListsを投稿することができますが、彼らはあなたに何も言わないでしょう - 依存関係は文字通り私が投稿したものです。それは行動が*期待されているという意味での "依存問題"ではない*それは私が欲しいものではない - 以下のOlivの答えを見る。 –