CMake教程小結

CMake教程小結

簡介

CMake教程通過一個示例項目, 逐步介紹了CMake構建系統的主要功能, 包括:

  1. 生成執行程序
  2. 生成庫(使用舊式CMake宏定義方法)
  3. 生成庫(使用新式CMake宏定義方法–使用要求)
  4. 基於源代碼的安裝與測試
  5. 系統檢測
  6. 添加自定義命令以及生成文件
  7. 構建安裝程序
  8. 將測試結果提交到Kitware的公共指示板
  9. 混合靜態和共享(動態)庫
  10. 生成器表達式,條件判斷
  11. find_package()支持(添加導出配置)
  12. 將調試版和發行版打包在一起(win10試驗沒有成功)

注:

  1. 示例項目目錄在CMake源代碼樹的Help\guide\tutorial目錄
  2. 本摘要主要關注CMake使用, 一些關於源代碼的更改在請查看CMake教程
  3. 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子目錄

生成庫

  1. 創建庫目錄;
  2. 在庫目錄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})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章