2015-07-01 2 views
5

Я пытаюсь правильно управлять зависимостью цели от внешней библиотеки, и каким-то образом я не преуспеваю. Я много читал учебники, сообщения и примеры, но, поскольку я новичок в 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) 

ответ

3

Найдено правильным решение (которое, как и ожидался, просто) в этом старом посте: http://www.cmake.org/pipermail/cmake/2010-November/041072.html

Суть заключается в использовании фактического файла в target_link_libraries, поэтому его метка времени проверяется. Поэтому нет необходимости в промежуточных или пользовательских зависимостях:

set(AdaTestLib ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a) 

add_executable(main_ada main.c) 
add_dependencies(main_ada AdaTestExternal) 
target_link_libraries(main_ada ${AdaTestLib})