Я пытаюсь правильно управлять зависимостью цели от внешней библиотеки, и каким-то образом я не преуспеваю. Я много читал учебники, сообщения и примеры, но, поскольку я новичок в CMake, я думаю, что мне не хватает очевидной вещи.Зависимости от CMake: принудительная перекомпиляция при изменении внешней библиотеки
Установка выполняется следующим образом. Внешняя библиотека, построенная на другом (неподдерживаемом языке CMake) языке, создает libadatest.a. Для этого я использовал ExternalProject_Add. Затем есть еще одна регулярная цель C, которая использует эту библиотеку lib. Все работает нормально, но если я изменю исходный lib, даже если я его перекомпилирую, цель C не будет перекомпилирована. Вот полный образец. Я использую CMake 2.8.12:
cmake_minimum_required(VERSION 2.8)
include(ExternalProject)
ExternalProject_Add(
AdaTestExternal # Not important
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
BUILD_COMMAND gprbuild -P${CMAKE_CURRENT_SOURCE_DIR}/adalibtest -XOBJ_DIR=${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY} -XLIB_DIR=${CMAKE_CURRENT_BINARY_DIR}
ALWAYS 1 # Force build, gprbuild will take care of dependencies
# BUILD_ALWAYS 1 # For 3.0 higher versions?
INSTALL_COMMAND ""
)
add_custom_target(AdaTest DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a)
link_directories(${CMAKE_CURRENT_BINARY_DIR}) # Needed or won't find it
add_executable(main_ada main.c)
add_dependencies(main_ada AdaTest) # We must depend on the final output lib
target_link_libraries(main_ada adatest)
То, что я пытался это создать промежуточный собственную цель, которая зависит от фактической библиотеки, и в свою очередь, делают основной мишенью C зависит от этой цели.
Когда я удаляю библиотеку, созданную извне (libadatest.a), это правильно перекомпилировано извне, но основной исполняемый файл не повторно связан. Проще видно, что временная метка библиотеки более свежая, чем исполняемый файл, который его использует.
Edit: Я также попытался это вместо заказных целей, с таким же отрицательным результатом:
add_library(AdaTest
UNKNOWN IMPORTED
IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a)