Próbuję poprawnie zarządzać zależnościami obiektu docelowego od zewnętrznej biblioteki i jakoś mi się to nie udaje. Czytałem samouczki, posty i przykłady, ale od kiedy jestem nowy w CMake, chyba brakuje mi oczywistej rzeczy.Zależności CMake: wymuszaj rekompilację przy zmianie biblioteki zewnętrznej
Ustawienia są następujące. Biblioteka zewnętrzna zbudowana w innym języku (CMake nieobsługiwany) generuje plik libadatest.a. Użyłem do tego ExternalProject_Add. Następnie jest inny regularny cel C, który używa tej biblioteki. Wszystko działa dobrze, ale jeśli zmienię oryginalną bibliotekę, nawet jeśli dokonam rekompilacji, cel C nie zostanie zrekompilowany. Oto pełna próbka. Używam 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)
Co mam próbował jest stworzenie niestandardowego pośredni cel, który zależy od rzeczywistej biblioteki, a to z kolei sprawiają, że głównym celem C zależy od tego celu.
Po usunięciu zewnętrznej biblioteki (libadatest.a), jest ona poprawnie rekompilowana zewnętrznie, ale główny plik wykonywalny nie jest ponownie łączony. Widać wyraźnie, że znacznik czasu biblioteki jest bardziej aktualny niż plik wykonywalny, który go używa.
Edit: Próbowałem już też to zamiast tarczy niestandardowego, z tym samym wynikiem ujemnym:
add_library(AdaTest
UNKNOWN IMPORTED
IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a)