2011-02-15 36 views
3

在Cmake模塊中,我試圖找到不同的路徑。在某些情況下,我想「設置」後,可變我最初叫「find_path」使用同一個變量:調用「find_path」後,Cmake「set」在同一變量上不起作用

# general search for this include dir 
find_path(LIBRARY_INCLUDE_DIR 
    NAMES LibraryName/LibraryHeader.h 
) 

# specific option enabled by user 
if(USE_OTHER_LIB) 
find_path(OTHER_LIB_ROOT_DIR 
    NAMES OtherLib/OtherLib.h 
) 
set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include) 
endif(USE_OTHER_LIB) 

這種方法確實在Windows XP下工作正常(CMake的2.8.1)。但是,它在Mac OS 10.6(CMake 2.8.3)下無法使用。有人知道mac/windows版本之間是否存在差異以及如何解決此問題?

非常感謝!

+0

您是否在放置集之前和之後放置了消息(STATUS)行以驗證是否定義了USE_OTHER_LIB?如果是這樣,你可以發佈輸出? – RobertJMaynard 2011-02-15 16:26:43

回答

5

這是關於「set」和CMake緩存變量的常見誤解。

行:

set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include) 

設置了LIBRARY_INCLUDE_DIR這需要對在CMakeLists文件的處理的剩餘影響局部覆蓋值,但它有同名的緩存變量沒有影響。因此,在cmake-gui或ccmake緩存編輯程序中可以看到而不是

如果你想使其可見,你將有它的價值強行進入同一個名字的緩存變量,也許是這樣的:

set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include) 
set(LIBRARY_INCLUDE_DIR ${LIBRARY_INCLUDE_DIR} CACHE FILEPATH "" FORCE) 

這通常是在不過皺起了眉頭,因爲當最終用戶調整cmake-gui程序中的值,您的代碼將用FORCE-d值覆蓋用戶選擇。所以......我會建議你只使用你一直在使用的那條線:抵抗FORCE。

要看到它確實生效,只需在的CMakeLists.txt的末尾添加以下代碼:

給你的代碼是正確的
message(STATUS "LIBRARY_INCLUDE_DIR='${LIBRARY_INCLUDE_DIR}'") 

所以......,一定有別的事情上這會導致你認爲某件事情是錯誤的。我很好奇這可能是什麼...也許你的下一個堆棧溢出問題。