2015-07-01 30 views
5

Hedefin bağımlılığını bir dış kütüphane üzerinde doğru şekilde yönetmeye çalışıyorum ve bir şekilde başarılı olamıyorum. Eğitici, yazı ve örneklerini okudum, ama yine de CMake için yeni olduğumdan, sanırım belli bir şeyi kaçırdım.CMake bağımlılıkları: dış kitaplıktaki zorlamayı yeniden oluşturma

Kurulum aşağıdaki gibidir. Başka bir (CMake desteklenmeyen) dilde yerleşik bir dış kütüphane bir libadatest.a üretir. Bunun için ExternalProject_Add kullandım. Daha sonra, bu lib'i kullanan başka bir düzenli C hedefi var. Her şey iyi çalışıyor, ama eğer orijinal lib'i değiştirirsem, yeniden derlesem bile, C hedefi yeniden derlenmez. İşte tam bir örnek. Ben teşebbüs ettik ne

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) 

gerçek kütüphanesine bağlı bir ara özel hedeflerini oluşturmak ve sırayla ana C hedef bu hedefe bağlıdır olun: Ben CMake 2.8.12 kullanıyorum.

Harici olarak oluşturulmuş kitaplığı (libadatest.a) kaldırdığımda, bu kural doğru olarak yeniden derlenir ancak ana yürütülebilir dosya yeniden bağlanmaz. Kütüphanenin zaman damgasının, onu kullanan yürütülebilir dosyadan daha taze olduğu açıkça görülüyor.

Düzenleme: Ben de aynı olumsuz sonuçla, yerine, özel hedefin bu denedim:

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

cevap

3

uygun çözüm Bulunan (hangi, basit beklendiği gibi) bu eski post: http://www.cmake.org/pipermail/cmake/2010-November/041072.html

Gerçek dosya, target_link_libraries içindeki gerçek dosyayı kullanmaktır, böylece zaman damgası kontrol edilir. Yani ara veya özel bağımlılıklara gerek yok:

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