2015-07-01 15 views
5

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) 

risposta

3

trovato la soluzione adeguata (che era, come previsto, semplice) in questo vecchio post: http://www.cmake.org/pipermail/cmake/2010-November/041072.html

L'elenco consiste nell'utilizzare il file effettivo in target_link_libraries, quindi il suo timestamp è selezionato. Quindi non c'è bisogno di dipendenze intermedie o personalizzate:

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