cmake學習筆記(五)
在cmake 學習筆記(三) 中簡單學習了 find_package 的 model 模式,在cmake 學習筆記(四)中了解一個CMakeCache相關的東西。但靠這些知識還是不能看懂PySide使用CMakeLists文件,接下來繼續學習find_package的 config 模式及package configure文件相關知識
find_package 的 config 模式
當CMakeLists.txt中使用find_package命令時,首先啟用的是 module 模式:
-
按照 CMAKE_MODULE_PATH 路徑和cmake的安裝路徑去搜索finder文件 Find<package>.cmake
如果finder未找到,則開始 config 模式:
-
將在下列路徑下查找 配置 文件 <name>Config.cmake 或 <lower-case-name>-config.cmake
<prefix>/
(W)
<prefix>/(cmake|CMake)/
(W)
<prefix>/<name>*/
(W)
<prefix>/<name>*/(cmake|CMake)/
(W)
<prefix>/(share|lib)/cmake/<name>*/
(U)
<prefix>/(share|lib)/<name>*/
(U)
<prefix>/(share|lib)/<name>*/(cmake|CMake)/
(U)
- find_package 參數及規則見manual
<name>Config.cmake
該文件至少需提供頭文件路徑和庫文件信息。比如 ApiExtractorConfig.cmake 在Windows下一個例子:
# - try to find APIEXTRACTOR # APIEXTRACTOR_INCLUDE_DIR - Directories to include to use APIEXTRACTOR # APIEXTRACTOR_LIBRARIES - Files to link against to use APIEXTRACTOR SET(APIEXTRACTOR_INCLUDE_DIR "D:/shiboken/dist/include/apiextractor") if(MSVC) SET(APIEXTRACTOR_LIBRARY "D:/shiboken/dist/lib/apiextractor.lib") elseif(WIN32) SET(APIEXTRACTOR_LIBRARY "D:/shiboken/dist/bin/apiextractor.dll") else() SET(APIEXTRACTOR_LIBRARY "D:/shiboken/dist/lib/apiextractor.dll") endif()
該文件是通過 configure_file 機制生成的,我們看看 ApiExtractorConfig.cmake.in 文件:
SET(APIEXTRACTOR_INCLUDE_DIR "@CMAKE_INSTALL_PREFIX@/include/apiextractor@apiextractor_SUFFIX@") if(MSVC) SET(APIEXTRACTOR_LIBRARY "@LIB_INSTALL_DIR@/@CMAKE_SHARED_LIBRARY_PREFIX@apiextractor@apiextractor_SUFFIX@@LIBRARY_OUTPUT_SUFFIX@.lib") elseif(WIN32) SET(APIEXTRACTOR_LIBRARY "@CMAKE_INSTALL_PREFIX@/bin/@CMAKE_SHARED_LIBRARY_PREFIX@apiextractor@apiextractor_SUFFIX@@LIBRARY_OUTPUT_SUFFIX@@CMAKE_SHARED_LIBRARY_SUFFIX@") else() SET(APIEXTRACTOR_LIBRARY "@LIB_INSTALL_DIR@/@CMAKE_SHARED_LIBRARY_PREFIX@apiextractor@apiextractor_SUFFIX@@LIBRARY_OUTPUT_SUFFIX@@CMAKE_SHARED_LIBRARY_SUFFIX@") endif()
對應的命令(變量的定義略過)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/ApiExtractorConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/ApiExtractorConfig.cmake" @ONLY)
<name>ConfigVersion.cmake
該文件用來比對版本是否匹配,看看ApiExtractorConfigVersion.cmake.in 的內容:
set(PACKAGE_VERSION @apiextractor_VERSION@) if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" ) set(PACKAGE_VERSION_COMPATIBLE FALSE) else("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" ) set(PACKAGE_VERSION_COMPATIBLE TRUE) if( "${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}") set(PACKAGE_VERSION_EXACT TRUE) endif( "${PACKAGE_FIND_VERSION}" STREQUAL "${PACKAGE_VERSION}") endif("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}" )
一般提供設置下面的變量
PACKAGE_VERSION
完整的版本字符串
PACKAGE_VERSION_EXACT
如果完全匹配為真
PACKAGE_VERSION_COMPATIBLE
如果兼容為真
PACKAGE_VERSION_UNSUITABLE
如果不可用為真
find_package進而根據這些設置
<package>_VERSION
full provided version string
<package>_VERSION_MAJOR
major version if provided, else 0
<package>_VERSION_MINOR
minor version if provided, else 0
<package>_VERSION_PATCH
patch version if provided, else 0
<package>_VERSION_TWEAK
tweak version if provided, else 0
參考
from:http://blog.csdn.net/dbzhang800/article/details/6341029
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成