2015-02-06 19 views
8

CMake projemde, kullanıcı tarafından düzenlenebilir duruma getirme için bir varsayılan yol sağlarım.CMake - Önbellek değişkenlerini güncellemek için force find_package

set(PATH_BOOST_DEFAULT "/softs/boost/${BOOST_VER}/${ARCH}/gcc/${GCCVER}") 
set(PATH_BOOST "${PATH_BOOST_DEFAULT}" CACHE PATH "Default path to Boost") 

Ondan sonra, birlikte kütüphanelerini bulmaya: Bu iyi çalışır ve Boost_INCLUDE_DIR, Boost_LIBRARY_DIRS veya Boost_THREAD_LIBRARY_DEBUG gibi önbellek değişkenlerin bir sürü oluşturulur

set(BOOST_ROOT "${PATH_BOOST}") 
set(Boost_USE_MULTITHREAD ON) 
set(Boost_USE_STATIC_LIBS ON) 
find_package(Boost 1.53.0 REQUIRED COMPONENTS thread system) 

.

Sorunum, PATH_BOOST önbellek değişkenini değiştirmeyi denediğimde gelir: FindBoost.cmake tarafından oluşturulan önbellek değişkenleri güncellenmez. FindBoost.cmake komut dosyası yeniden çağrılacak gibi görünüyor (bulunan bileşenler hakkında mesajlar yazdırıyor). Boost_INCLUDE_DIR gibi değişkenler önbellekte oldukları için güncellenmediklerini düşünüyorum.

"Yol, kullanıcı tarafından değiştirilmişse, önbellek değişkenlerini zorlayarak paketi geri çekilsin" ifadesinin bir yolu var mı?

Ayrıca, bir önbellek değişkeninin yalnızca aşağıdaki çirkin fikirden daha farklı olduğunu saptamanın daha güzel bir yolu var mı? : -/

set(MY_VAR ${MY_VAR_DEFAULT} CACHE TYPE "") 
if(NOT DEFINED MY_VAR_copy) 
    set(MY_VAR_copy ${MY_VAR} CACHE INTERNAL "") 
    mark_as_advanced(FORCE MY_VAR_copy) 
endif() 
if(NOT "${MY_VAR}" STREQUAL "${MY_VAR_copy}") 
    # my_var is modified : do something 
    set(MY_VAR_copy ${MY_VAR} CACHE INTERNAL "") 
endif() 

cevap

0

Sanırım seninle aynı sorunu yaşıyorum. Benim kurulum bir paketin belirli bir sürümünü bulmaya çalışır:

set (MYPACK_REQUIRED_VERSION 1.2.3) 
find_package (mypack ${MYPACK_REQUIRED_VERSION} EXACT) 

paket yapılandırma komut dosyası ayarlar önbelleğe sonra daha sonraki bir aşamada kullanılan değişken MYPACK_LIBRARIES. Ancak, MYPACK_REQUIRED_VERSION değişkenini değiştirdiğimde, yeni sürümü aramaya çalışmak yerine eski MYPACK_LIBRARIES'u kullanmaya devam ediyorum.

Ben bu önbellek değişkeni unsetting tarafından şimdi sorunu hallettim:

set (MYPACK_REQUIRED_VERSION 1.2.3) 
unset (MYPACK_LIBRARIES CACHE) 
find_package (mypack ${MYPACK_REQUIRED_VERSION} EXACT) 

Bu benim durumumda tekrar find_package prosedürünü tetiklemek gibi görünüyor. Tamamen anlamadığım find_package prosedüründe daha ince detaylar var, bu durumda sizin durumunuzda işe yaramayabilir, ama denemeye değer olabilir.