2015-07-01 8 views
5

Ich versuche, eine Abhängigkeit eines Ziels auf einer extern erstellten Bibliothek korrekt zu verwalten, und irgendwie gelingt es mir nicht. Ich habe Tutorials, Posts und Beispiele in Hülle und Fülle gelesen und dennoch, da ich neu bei CMake bin, schätze ich, dass mir etwas Offensichtliches fehlt.CMake Abhängigkeiten: erzwinge Neukompilierung bei externen Bibliothekswechsel

Setup ist wie folgt. Eine externe Bibliothek, die in einer anderen Sprache (CMake nicht unterstützt) erstellt wurde, erzeugt eine libadatest.a. Ich habe ExternalProject_Add dafür verwendet. Dann gibt es ein anderes reguläres C-Ziel, das diese Bibliothek verwendet. Alles funktioniert gut, aber wenn ich die ursprüngliche Bibliothek ändere, wird das C-Ziel nicht neu kompiliert, selbst wenn ich es neu kompiliere. Hier ist ein komplettes Beispiel. Ich bin mit 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) 

Was ich versucht habe, ist ein Zwischen benutzerdefiniertem Ziel, die auf der tatsächlichen Bibliothek und wiederum die Haupt C-Ziel ist abhängig von diesem Ziel macht, hängt zu erstellen.

Wenn ich die extern erstellte Bibliothek (libadatest.a) entferne, wird diese ordnungsgemäß extern neu kompiliert, aber die Hauptdatei wird nicht neu verknüpft. Offensichtlich ist der Zeitstempel der Bibliothek frischer als die ausführbare Datei.

Edit: Ich habe auch versucht, diese anstelle des benutzerdefinierten Ziels, mit dem gleichen negativen Ergebnis:

add_library(AdaTest 
    UNKNOWN IMPORTED 
    IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libadatest.a) 

Antwort

3

die richtige Lösung gefunden (das war, wie erwartet, einfach) in dieser alten Post: http://www.cmake.org/pipermail/cmake/2010-November/041072.html

Der Kern besteht darin, die tatsächliche Datei in target_link_libraries zu verwenden, so dass ihr Zeitstempel überprüft wird. Also keine Notwendigkeit für Zwischen-oder benutzerdefinierte Abhängigkeiten:

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