CMake教程小結
文章目錄
簡介
CMake教程通過一個示例項目, 逐步介紹了CMake構建系統的主要功能, 包括:
- 生成執行程序
- 生成庫(使用舊式CMake宏定義方法)
- 生成庫(使用新式CMake宏定義方法–使用要求)
- 基於源代碼的安裝與測試
- 系統檢測
- 添加自定義命令以及生成文件
- 構建安裝程序
- 將測試結果提交到Kitware的公共指示板
- 混合靜態和共享(動態)庫
- 生成器表達式,條件判斷
- find_package()支持(添加導出配置)
- 將調試版和發行版打包在一起(win10試驗沒有成功)
注:
- 示例項目目錄在CMake源代碼樹的
Help\guide\tutorial
目錄- 本摘要主要關注CMake使用, 一些關於源代碼的更改在請查看CMake教程
- CMake教程示例代碼,下一步的內容都是上一步的結果
主要功能摘要
1. 生成執行程序
本節示例展示了:
- 生成執行程序的基本構建系統框架;
- 將一些CMake屬性通過配置文件輸出;
- 如何在目標中添加頭文件搜索路徑;
- 常規CMake命令行使用方式
注: 本節示例初始代碼在示例目錄的
Step1
子目錄, 成果在Step2
子目錄
核心代碼
頂層目錄的CMakeLists.txt內容如下:
# 指定CMake最小版本
cmake_minimum_required(VERSION 3.10)
# 設置項目名稱及版本號
project(Tutorial VERSION 1.0)
# 指定C++版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 配置頭文件, 將一些CMake屬性值保存到源代碼中
configure_file(TutorialConfig.h.in TutorialConfig.h)
# 生成執行程序
add_executable(Tutorial tutorial.cxx)
# 將項目輸出目錄(binary tree)添加到Tutorial目標的頭文件搜索路徑, 這樣才能找到生成的TutorialConfig.h
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
TutorialConfig.h.in內容如下:
// 接受CMake配置屬性
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
命令行使用示例
在項目目錄下
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .
2. 生成庫(舊式CMake)
在上一步的基礎上, 本節示例展示了:
- 生成庫;
- 在項目中添加庫;
- 使用可選項,並將可選項保存到配置文件中;
- 目標鏈接庫的舊式方法;
- 目標包含庫頭文件目錄的舊式方法;
注: 本節示例初始代碼在示例目錄的
Step2
子目錄, 成果在Step3
子目錄
生成庫
- 創建庫目錄;
- 在庫目錄CMakeLists.txt中, 添加生成庫命令如下:
# 生成庫
add_library(MathFunctions mysqrt.cxx)
其它核心代碼
項目CMakeLists.txt內容如下:
# 指定CMake最小版本
cmake_minimum_required(VERSION 3.10)
# 設置項目名稱及版本號
project(Tutorial VERSION 1.0)
# 指定C++版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 是否使用自定義數學庫可選項
option(USE_MYMATH "Use tutorial provided math implementation" ON)
# 配置頭文件, 將一些CMake屬性值保存到源代碼中
configure_file(TutorialConfig.h.in TutorialConfig.h)
# 添加自定義數學庫
if(USE_MYMATH)
add_subdirectory(MathFunctions)
list(APPEND EXTRA_LIBS MathFunctions)
list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")
endif()
# 生成執行程序
add_executable(Tutorial tutorial.cxx)
# Tutorial目標鏈接相關庫
target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})
# Tutorial目標添加頭文件搜索路徑(項目生成目錄,其它頭文件目錄)
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
${EXTRA_INCLUDES}
)
TutorialConfig.h.in內容如下:
// 接受CMake配置屬性
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
#cmakedefine USE_MYMATH
3. 生成庫(新式CMake)
在上一步的基礎上, 本節示例展示了:
- 在庫中使用INTERFACE;
- 在項目中添加庫;
- 使用可選項,並將可選項保存到配置文件中;
- 目標鏈接庫的舊式方法;
- 目標包含庫頭文件目錄的舊式方法;
注: 本節示例初始代碼在示例目錄的
Step3
子目錄, 成果在Step4
子目錄
核心代碼更改
庫目錄CMakeLists.txt內容如下:
# 生成庫
add_library(MathFunctions mysqrt.cxx)
# 設置目錄頭文件搜索路徑. INTERFACE是使用者需要, 庫本身不需要
# 通過INTERFACE可以將頭文件搜索路徑轉遞給使用者
target_include_directories(MathFunctions
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)
項目CMakeLists.txt刪除了EXTRA_INCLUDES相關代碼, 變化如下:
# 指定CMake最小版本
cmake_minimum_required(VERSION 3.10)
# 設置項目名稱及版本號
project(Tutorial VERSION 1.0)
# 指定C++版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 是否使用自定義數學庫可選項
option(USE_MYMATH "Use tutorial provided math implementation" ON)
# 配置頭文件, 將一些CMake屬性值保存到源代碼中
configure_file(TutorialConfig.h.in TutorialConfig.h)
# 添加自定義數學庫
if(USE_MYMATH)
add_subdirectory(MathFunctions)
list(APPEND EXTRA_LIBS MathFunctions)
endif()
# 生成執行程序
add_executable(Tutorial tutorial.cxx)
# Tutorial目標鏈接相關庫(此代碼會使用新式CMake方法傳遞庫屬性)
target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})
# Tutorial目標添加頭文件搜索路徑
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
4. 基於源代碼的安裝與測試
在上一步的基礎上, 本節示例展示了:
- 使用基於源代碼的安裝規則(install);
- 使用測試;
注: 本節示例初始代碼在示例目錄的
Step4
子目錄, 成果在Step5
子目錄
核心代碼更改
庫目錄CMakeLists.txt變化如下:
# 生成庫
add_library(MathFunctions mysqrt.cxx)
# 設置目錄頭文件搜索路徑. INTERFACE是使用者需要, 庫本身不需要
# 通過INTERFACE可以將頭文件搜索路徑轉遞給使用者
target_include_directories(MathFunctions
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)
# 安裝規則
install(TARGETS MathFunctions DESTINATION lib)
install(FILES MathFunctions.h DESTINATION include)
項目CMakeLists.txt新增了安裝與測試相關代碼, 變化如下:
# 指定CMake最小版本
cmake_minimum_required(VERSION 3.10)
# 設置項目名稱及版本號
project(Tutorial VERSION 1.0)
# 指定C++版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 是否使用自定義數學庫可選項
option(USE_MYMATH "Use tutorial provided math implementation" ON)
# 配置頭文件, 將一些CMake屬性值保存到源代碼中
configure_file(TutorialConfig.h.in TutorialConfig.h)
# 添加自定義數學庫
if(USE_MYMATH)
add_subdirectory(MathFunctions)
list(APPEND EXTRA_LIBS MathFunctions)
endif()
# 生成執行程序
add_executable(Tutorial tutorial.cxx)
# Tutorial目標鏈接相關庫(此代碼會使用新式CMake方法傳遞庫屬性)
target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})
# Tutorial目標添加頭文件搜索路徑
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
# 添加安裝目標
install(TARGETS Tutorial DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
DESTINATION include
)
# 開啓測試
enable_testing()
# 驗證Tutorial正常運行
add_test(NAME Runs COMMAND Tutorial 25)
# 驗證Tutorial的使用方法提示
add_test(NAME Usage COMMAND Tutorial)
set_tests_properties(Usage
PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number"
)
# 定義函數以簡化測試添加
function(do_test target arg result)
add_test(NAME Comp${arg} COMMAND ${target} ${arg})
set_tests_properties(Comp${arg}
PROPERTIES PASS_REGULAR_EXPRESSION ${result}
)
endfunction(do_test)
# 批量添加基於結果的測試
do_test(Tutorial 4 "4 is 2")
do_test(Tutorial 9 "9 is 3")
do_test(Tutorial 5 "5 is 2.236")
do_test(Tutorial 7 "7 is 2.645")
do_test(Tutorial 25 "25 is 5")
do_test(Tutorial -25 "-25 is [-nan|nan|0]")
do_test(Tutorial 0.0001 "0.0001 is 0.01")
命令行使用示例
將調試版安裝到D:\Temp2\ttt\debug
$ mkdir build
$ cd build
$ cmake ..
生成並安裝調試版
$ cmake --build .
$ cmake --install . --prefix D:\Temp2\ttt\debug --config Debug
生成並安裝發行版
$ cmake --build . -- config Release
$ cmake --install . --prefix D:\Temp2\ttt\Release --config Release
win10 VS2019 測試
在build目錄測試應用程序
$ mkdir build
$ cd build
$ cmake ..
生成並測試調試版
$ cmake --build .
$ ctest -C Debug [-vv]
生成並測試發行版
$ cmake --build . -- config Release
$ ctest -C Release [-vv]
5. 系統檢測
在上一步的基礎上, 本節示例展示了:
- CMake系統功能檢測, 以判斷平臺是否支持特定功能;
- 目標編譯定義(宏定義);
注1: 本節示例初始代碼在示例目錄的
Step5
子目錄, 成果在Step6
子目錄
注2: 在win10下測試失敗, 沒有發現log,exp函數
核心代碼更改
庫目錄CMakeLists.txt變化如下:
# 生成庫
add_library(MathFunctions mysqrt.cxx)
# 設置目錄頭文件搜索路徑. INTERFACE是使用者需要, 庫本身不需要
# 通過INTERFACE可以將頭文件搜索路徑轉遞給使用者
target_include_directories(MathFunctions
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)
# 檢測系統是否支持log,exp函數?
include(CheckSymbolExists)
set(CMAKE_REQUIRED_LIBRARIES "m")
check_symbol_exists(log "math.h" HAVE_LOG)
check_symbol_exists(exp "math.h" HAVE_EXP)
if(HAVE_LOG AND HAVE_EXP)
# 目標宏定義
target_compile_definitions(MathFunctions
PRIVATE "HAVE_LOG" "HAVE_EXP")
endif()
# 安裝規則
install(TARGETS MathFunctions DESTINATION lib)
install(FILES MathFunctions.h DESTINATION include)
6. 添加自定義命令以及生成文件
在上一步的基礎上, 本節示例展示了:
- CMake使用命令;
- 使用生成文件;
注: 本節示例初始代碼在示例目錄的
Step6
子目錄, 成果在Step7
子目錄
核心代碼更改
庫目錄CMakeLists.txt變化如下:
# 首先生成一個用於產生預定義值表源代碼的執行程序
add_executable(MakeTable MakeTable.cxx)
# 添加自定義命令以產生源代碼(依賴於MakeTable目標)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
DEPENDS MakeTable
)
# 生成主庫(包含上一步中生成的預定義值表源代碼)
add_library(MathFunctions
mysqrt.cxx
${CMAKE_CURRENT_BINARY_DIR}/Table.h
)
# 通過INTERFACE向使用者傳播頭文件搜索路徑
# 通過PRIVATE定義目標內部使用頭文件搜索路徑
target_include_directories(MathFunctions
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
)
# 安裝規則
install(TARGETS MathFunctions DESTINATION lib)
install(FILES MathFunctions.h DESTINATION include)
7. 構建安裝程序
在上一步的基礎上, 本節示例展示了:
- 製作安裝包;
注1: 本節示例初始代碼在示例目錄的
Step7
子目錄, 成果在Step8
子目錄
注2: 爲測試需要, 在win10上, 首先安裝NSIS(Nulsoft Install System).
核心代碼更改
頂層目錄CMakeLists.txt末尾添加如下內容即可:
# 設置安裝器
include(InstallRequiredSystemLibraries)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set(CPACK_PACKAGE_VERSION_MAJOR "${Tutorial_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${Tutorial_VERSION_MINOR}")
include(CPack)
命令行使用示例
在項目目錄下
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .
VS generator 注意:目錄不能含有中文
生成發行版安裝包(Tutorial-1.0-win64.exe)
$ cmake --build . --target PACKAGE --config Release
生成調試版安裝包(Tutorial-1.0-win64.exe)
$ cmake --build . --target PACKAGE --config Debug
8. 將測試結果提交到Kitware的公共指示板
在上一步的基礎上, 本節示例展示了:
- 將測試結果提交到Kitware的公共指示板;
注: 本節示例初始代碼在示例目錄的
Step8
子目錄, 成果在Step9
子目錄
核心代碼更改
頂層目錄CMakeLists.txt將:
# enable testing
enable_testing()
替換爲:
# enable dashboard scripting
include(CTest)
在頂層目錄創建CTestConfig.cmake:
set(CTEST_PROJECT_NAME "CMakeTutorial")
set(CTEST_NIGHTLY_START_TIME "00:00:00 EST")
set(CTEST_DROP_METHOD "http")
set(CTEST_DROP_SITE "my.cdash.org")
set(CTEST_DROP_LOCATION "/submit.php?project=CMakeTutorial")
set(CTEST_DROP_SITE_CDASH TRUE)
命令行使用示例
在項目目錄下
$ mkdir build
$ cd build
$ cmake ..
VS generator 注意:目錄不能含有中文
發佈發行版測試結果
$ ctest [-VV] -C Release -D Experimental
發佈調試版測試結果
$ ctest [-VV] -C Debug -D Experimental
9. 混合靜態和共享庫
在上一步的基礎上, 本節示例展示了:
- 在動態庫中使用靜態庫
- 使用
BUILD_SHARED_LIBS
屬性設置庫默認生成類型(共享/非共享)(默認生成靜態庫); - 使用目標宏定義(target_compile_definitions)設置windows動態庫標誌(
__declspec(dllexport),__declspec(dllimport)
) - 在add_library中控制庫生成類型[STATIC | SHARED | MODULE]
注: 本節示例初始代碼在示例目錄的
Step9
子目錄, 成果在Step10
子目錄
核心代碼更改
頂層CMakeLists.txt的起始部分更改爲:
# 指定CMake最小版本
cmake_minimum_required(VERSION 3.10)
# 設置項目名稱及版本號
project(Tutorial VERSION 1.0)
# 指定C++版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 控制動靜態庫生成目錄,這樣在windows上不用考慮運行時路徑問題
# we don't need to tinker with the path to run the executable
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
# 配置頭文件, 將一些CMake屬性值保存到源代碼中
configure_file(TutorialConfig.h.in TutorialConfig.h)
# 添加自定義數學庫
add_subdirectory(MathFunctions)
# 生成執行程序
add_executable(Tutorial tutorial.cxx)
target_link_libraries(Tutorial PUBLIC MathFunctions)
MathFunctions/CMakeLists.txt更改如下:
# 生成運行時需要的動態庫
add_library(MathFunctions MathFunctions.cxx)
# 通過INTERFACE向使用者傳播頭文件搜索路徑
target_include_directories(MathFunctions
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)
# 是否使用自定義數學庫
option(USE_MYMATH "Use tutorial provided math implementation" ON)
if(USE_MYMATH)
# 數學庫目標宏定義
target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")
# 首先生成一個用於產生預定義值表源代碼的執行程序
add_executable(MakeTable MakeTable.cxx)
# 添加自定義命令以產生源代碼(依賴於MakeTable目標)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/Table.h
COMMAND MakeTable ${CMAKE_CURRENT_BINARY_DIR}/Table.h
DEPENDS MakeTable
)
# 生成僅進行sqrt計算的靜態庫
add_library(SqrtLibrary STATIC
mysqrt.cxx
${CMAKE_CURRENT_BINARY_DIR}/Table.h
)
# 通過PRIVATE定義目標內部使用頭文件搜索路徑
# Table.h文件生成在${CMAKE_CURRENT_BINARY_DIR}中
target_include_directories(SqrtLibrary PRIVATE
${CMAKE_CURRENT_BINARY_DIR}
)
# 設置SqrtLibrary目標屬性: 如果默認生成共享庫, 需要將PIC(POSITION_INDEPENDENT_CODE)設置爲True
set_target_properties(SqrtLibrary PROPERTIES
POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS}
)
# 將數學庫鏈接到自定義sqrt庫
target_link_libraries(MathFunctions PRIVATE SqrtLibrary)
endif()
# 定義目標宏用於在windows上設置動態庫標誌declspec(dllexport)
target_compile_definitions(MathFunctions PRIVATE "EXPORTING_MYMATH")
# 安裝規則
install(TARGETS MathFunctions DESTINATION lib)
install(FILES MathFunctions.h DESTINATION include)
MathFunctions/MathFunctions.h使用dll導出(dll export)定義:
#if defined(_WIN32)
# if defined(EXPORTING_MYMATH)
# define DECLSPEC __declspec(dllexport)
# else
# define DECLSPEC __declspec(dllimport)
# endif
#else // non windows
# define DECLSPEC
#endif
namespace mathfunctions {
double DECLSPEC sqrt(double x);
}
其它對C++代碼的修改見CMake教程
命令行使用示例
在項目目錄下
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build .
Checking Build System
Building Custom Rule E:/Help/Other/CMake/CMake_Tutorial/guide/tutorial/Step10/MathFunctions/CMakeLists.txt
MakeTable.cxx
MakeTable.vcxproj -> E:\Help\Other\CMake\CMake_Tutorial\guide\tutorial\Step10\build\Debug\MakeTable.exe
Generating Table.h
Building Custom Rule E:/Help/Other/CMake/CMake_Tutorial/guide/tutorial/Step10/MathFunctions/CMakeLists.txt
mysqrt.cxx
SqrtLibrary.vcxproj -> E:\Help\Other\CMake\CMake_Tutorial\guide\tutorial\Step10\build\Debug\SqrtLibrary.lib
Building Custom Rule E:/Help/Other/CMake/CMake_Tutorial/guide/tutorial/Step10/MathFunctions/CMakeLists.txt
MathFunctions.cxx
正在創建庫 E:/Help/Other/CMake/CMake_Tutorial/guide/tutorial/Step10/build/Debug/MathFunctions.lib 和對象 E:/Help/Other/CMake/CMake_Tutorial/guide/tutorial/St
ep10/build/Debug/MathFunctions.exp
MathFunctions.vcxproj -> E:\Help\Other\CMake\CMake_Tutorial\guide\tutorial\Step10\build\Debug\MathFunctions.dll
Building Custom Rule E:/Help/Other/CMake/CMake_Tutorial/guide/tutorial/Step10/CMakeLists.txt
tutorial.cxx
Tutorial.vcxproj -> E:\Help\Other\CMake\CMake_Tutorial\guide\tutorial\Step10\build\Debug\Tutorial.exe
Building Custom Rule E:/Help/Other/CMake/CMake_Tutorial/guide/tutorial/Step10/CMakeLists.txt
10. 生成器表達式,條件判斷
在上一步的基礎上, 本節示例展示了:
- 在構建過程中計算生成器表達式值,以生成特定於每個構建配置的信息
- 生成器表達式有三類: 邏輯表達式、信息表達式和輸出表達式(Logical, Informational, and Output expressions)
- 邏輯表達式:
$<0:...>
的結果是空字符串,$<1:...>
的結果是“…”的內容。它們也可以嵌套。 - 生成器表達式通常用來按需添加編譯標誌
- 使用INTERFACE目標在目標間傳遞屬性
注: 本節示例初始代碼在示例目錄的
Step10
子目錄, 成果在Step11
子目錄
核心代碼更改
頂層CMakeLists.txt的相應部分:
# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
更改爲:
add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)
# 通過BUILD_INTERFACE生成器表達式添加編譯器警告標誌
set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU>")
set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")
target_compile_options(tutorial_compiler_flags INTERFACE
"$<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>"
"$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>"
)
庫目錄CMakeLists.txt目標鏈接庫代碼:
target_link_libraries(MakeTable[SqrtLibrary|MathFunctions] PRIVATE[PUBLIC] tutorial_compiler_flags)
11. 添加導出配置,以支持find_package
在上一步的基礎上, 本節示例展示了:
- 如何讓其他項目方便地使用本項目
- 在install(TARGETS)中使用EXPORT關鍵字, 它用於將目標從安裝樹導入到另一個項目
- 生成MathFunctionsConfig.cmake, 以讓find_package()命令可以找到本項目
- 顯式安裝生成的MathFunctionsTargets.cmake
注: 本節示例初始代碼在示例目錄的
Step11
子目錄, 成果在Step12
子目錄
核心代碼更改
在MathFunctions/CMakeLists.txt中增加EXPORT:
# 根據項目內與安裝方式包含不同的頭文件目錄
target_include_directories(MathFunctions
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<INSTALL_INTERFACE:include>
)
# 此處省略其他代碼...
# 安裝規則
install(TARGETS MathFunctions tutorial_compiler_flags
DESTINATION lib
EXPORT MathFunctionsTargets)
install(FILES MathFunctions.h DESTINATION include)
在頂層目錄中添加Config.cmake.in, 用來生成MathFunctionsTargets.cmake:
@PACKAGE_INIT@
include ( "${CMAKE_CURRENT_LIST_DIR}/MathFunctionsTargets.cmake" )
在頂層CMakeLists.txt,爲了正確配置和安裝MathFunctionsTargets.cmake, 添加以下內容:
install(EXPORT MathFunctionsTargets
FILE MathFunctionsTargets.cmake
DESTINATION lib/cmake/MathFunctions
)
include(CMakePackageConfigHelpers)
# generate the config file that is includes the exports
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake"
INSTALL_DESTINATION "lib/cmake/example"
NO_SET_AND_CHECK_MACRO
NO_CHECK_REQUIRED_COMPONENTS_MACRO
)
# generate the version file for the config file
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake"
VERSION "${Tutorial_VERSION_MAJOR}.${Tutorial_VERSION_MINOR}"
COMPATIBILITY AnyNewerVersion
)
# install the configuration file
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake
DESTINATION lib/cmake/MathFunctions
)
到這裏,這是一個可以在項目安裝或打包以後重定位的CMake配置。 如果需要項目在一個構建目錄中使用,在頂層CMakeLists.txt的結尾添加以下內容:
export(EXPORT MathFunctionsTargets
FILE "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsTargets.cmake"
)
通過這個導出調用,我們現在生成一個
Targets.cmake
,使得在構建目錄中配置生成的MathFunctionsConfig.cmake
可以被其他項目使用,而不需要安裝它。
此處未試驗, 不理解
12. 將調試版和發行版打包在一起
在上一步的基礎上, 本節示例展示了:
- 爲調試版文件設置後綴: 非執行程序目標會根據CMAKE_DEBUG_POSTFIX生成它的**_POSTFIX**
- 執行程序目錄的DEBUG_POSTFIX需要手工設置
注1: 本節示例初始代碼在示例目錄的
Step12
子目錄, 成果在Complete
子目錄
注2: 本節打包工作在win10上沒有成功
核心代碼更改
在頂層CMakeLists.txt中更改:
# 設置非可執行程序目標的調試後綴
set(CMAKE_DEBUG_POSTFIX d)
...
# 設置可執行程序目標的調試後綴
set_target_properties(Tutorial PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})