2015-02-06 27 views
8

Trong dự án CMake của tôi, tôi cung cấp một đường dẫn mặc định để Boost có thể chỉnh sửa bởi người dùng.CMake - Force find_package để cập nhật biến bộ nhớ cache

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

Sau đó, tôi cố gắng tìm ra libs với:

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) 

này hoạt động tốt và rất nhiều biến bộ nhớ cache như Boost_INCLUDE_DIR, Boost_LIBRARY_DIRS hoặc Boost_THREAD_LIBRARY_DEBUG được tạo ra.

Sự cố của tôi xuất hiện khi tôi cố gắng sửa đổi biến bộ nhớ cache PATH_BOOST: các biến bộ nhớ cache được tạo bởi FindBoost.cmake không được cập nhật. Kịch bản FindBoost.cmake dường như được gọi lại (nó in thông báo về các thành phần tìm thấy). Tôi nghĩ rằng các biến như Boost_INCLUDE_DIR không được cập nhật vì chúng nằm trong bộ nhớ cache.

Có cách nào để nói với cmake "nếu đường dẫn được sửa đổi bởi người dùng, hãy refind gói bằng cách buộc các biến bộ nhớ cache"?

Ngoài ra, có cách nào tốt hơn để phát hiện biến bộ nhớ cache vừa được sửa đổi hơn ý tưởng xấu xí sau đây không? : -/

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

Trả lời

0

Tôi nghĩ mình cũng gặp vấn đề tương tự như bạn. Thiết lập của tôi cố gắng tìm một phiên bản cụ thể của một gói:

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

Kịch bản gói cấu hình thiết lập cache biến MYPACK_LIBRARIES mà sau đó được sử dụng ở giai đoạn sau. Tuy nhiên khi tôi thay đổi các biến số MYPACK_REQUIRED_VERSION biến vẫn sử dụng cũ MYPACK_LIBRARIES thay vì cố gắng tìm phiên bản mới.

Tôi nghĩ rằng tôi đã giải quyết được vấn đề bây giờ bằng cách unsetting biến bộ nhớ cache này:

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

Điều này dường như kích hoạt các thủ tục find_package một lần nữa trong trường hợp của tôi. Có một số chi tiết tốt hơn về thủ tục find_package mà tôi không hoàn toàn hiểu vì vậy điều này có thể không hoạt động trong trường hợp của bạn, nhưng có thể đáng để thử.

Các vấn đề liên quan