Sto provando a gestire correttamente una dipendenza di una destinazione su una libreria costruita esternamente e in qualche modo non ci riesco. Ho letto tutorial, post ed esempi in abbondanza, eppure, dato che sono nuovo di CMake, credo che mi manchi qualcosa di ovvio.dipendenze di CMake: ricompilazione forzata sul cambio di libreria esterno
L'installazione è come segue. Una libreria esterna creata in un altro linguaggio (CMake non supportato) produce un libadatest.a. Ho usato ExternalProject_Add per questo. Quindi, c'è un altro bersaglio C normale che usa questa lib. Tutto funziona bene, ma se cambio la lib originale, anche se la ricompongo, la destinazione C non viene ricompilata. Ecco un esempio completo. Sto usando 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)
Quello che ho cercato è quello di creare un obiettivo intermedio personalizzato che dipende la biblioteca reale, e, a sua volta fare l'obiettivo principale C dipende da questo obiettivo.
Quando rimuovo la libreria creata esternamente (libadatest.a), questa viene correttamente ricompilata esternamente ma l'eseguibile principale non viene ricollegato. Visto chiaramente che il timestamp della libreria è più fresco dell'eseguibile che lo usa.
Edit: ho provato anche questo, invece del target personalizzato, con lo stesso risultato negativo:
add_library(AdaTest
UNKNOWN IMPORTED
IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a)