cmake 2.8.1 を使用して Linux 環境で CMake を使用しています。同じ結果でcmake 2.8.7も試しました。
アーカイブ (静的ライブラリ) に対して特別な調整を行う必要があります。これは、cmake custom_command として実行されます。その結果、実行可能ファイルのリンクで使用する必要がある新しいアーカイブが作成されます。条件付けの入力アーカイブも cmake ターゲットです。
必要なのは、アーカイブの条件付きバージョンと実行可能ファイルの間の依存関係です。add_dependencies を使用しても機能せず、その理由がわかりません。
cmake のその動作を示す例を作成しました。この例には、2 つの C ファイルが含まれています。1 つはアーカイブ用で、もう 1 つは main() を含んでいます。簡単なアーカイブの調整として、以前に生成されたアーカイブのコピーを作成するだけです。
2 つのソース ファイルは次のとおりです。
main.c:
int myPrint(void);
int main(void)
{
myPrint();
}
mylib.c:
#include <stdio.h>
int myPrint(void)
{
printf("Hello World\n");
}
これは私が作成した CMakeLists.txt です:
cmake_minimum_required(VERSION 2.8)
project(cmake_dependency_test)
add_library(mylib STATIC mylib.c)
add_custom_command(OUTPUT libmylib_conditioned.a
COMMAND cp libmylib.a libmylib_conditioned.a
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib.a
COMMENT "Conditioning library")
add_custom_target(conditioning DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmylib_conditioned.a)
add_dependencies(conditioning mylib)
add_executable(cmake_dependency_test main.c)
add_dependencies(cmake_dependency_test conditioning)
target_link_libraries(cmake_dependency_test -L. mylib_conditioned)
まず、アーカイブ mylib を作成します。add_custom_command を使用して条件付けを行い、add_custom_target は条件付けされたアーカイブの最上位のターゲットを提供します。条件付きアーカイブをビルドする前に入力アーカイブを更新する必要があるため、入力アーカイブの最上位ターゲットと条件付きアーカイブの最上位ターゲットの間に依存関係を追加しました。これは完璧に機能します!mylib.c に触れて make Conditioning を実行すると、入力アーカイブがビルドされ、その後、条件付きアーカイブがビルドされます。
Ok。ここで、条件付きアーカイブをリンクに使用します。実行可能ファイルから条件付きアーカイブへの依存関係を持たせるために、もう一度 add_dependencies を使用しました。ただし、ライブラリ ソース mylib.c に触れてから make を実行しても、期待どおりに実行可能ファイルが更新されません。
CMakeLists.txt のどこが間違っていますか?