2015-07-01 49 views
5

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) 

Odpowiedz

3

Znaleziono prawidłowe rozwiązanie (który był, zgodnie z oczekiwaniami, proste) w ten stary wpis: http://www.cmake.org/pipermail/cmake/2010-November/041072.html

Istotą jest użycie rzeczywistego pliku w target_link_libraries, dlatego jego znacznik czasu jest sprawdzany. Nie ma więc potrzeby pośrednich ani niestandardowych zależności:

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})