CMake語法—打印幫助(CMakePrintHelpers)


CMake語法—打印幫助(CMakePrintHelpers)

1 CMakePrintHelpers

1.1 cmake_print_variable

1.1.1 定義
cmake_print_variables(var1 var2 ..  varN)
1.1.2 說明

打印每個變量值

1.2 cmake_print_properties

1.2.1 定義
cmake_print_properties([TARGETS target1 ..  targetN]
                      [SOURCES source1 .. sourceN]
                      [DIRECTORIES dir1 .. dirN]
                      [TESTS test1 .. testN]
                      [CACHE_ENTRIES entry1 .. entryN]
                      PROPERTIES prop1 .. propN )
1.2.2 說明

打印屬性值。支持TARGETS、SOURCES、DIRECTORIES、TESTS、CACHE_ENTRIES的屬性打印

特別注意:PROPERTIES關鍵字不能丟

2 應用示例

2.1 代碼結構

目錄結構

  • learn_cmake:為根目錄

  • build:為CMake配置輸出目錄(在此例中即生成sln解決方案的地方)

  • CMakeLists.txt:CMake腳本

  • cmake_config.bat:執行CMake配置過程的腳本(雙擊直接運行)

    @echo off
    set currentDir=%~dp0
    set buildDir=%currentDir%
    set cmakeOutputDir=%currentDir%\build
    cmake -S %buildDir% -B %cmakeOutputDir% -G"Visual Studio 16 2019" -T v140 -A x64
    pause
    
  • src:工程源文件目錄

  • main.cpp:源文件

2.2 代碼內容

  1. CMakeLists.txt

    cmake_minimum_required(VERSION 3.18)
    
    # 設置工程名稱
    set(PROJECT_NAME KAIZEN)
    
    # 設置工程版本號
    set(PROJECT_VERSION "1.0.0.10" CACHE STRING "默認版本號")
    
    # 工程定義
    project(${PROJECT_NAME}
        LANGUAGES CXX C
        VERSION ${PROJECT_VERSION}
    )
    
    # 打印開始日志
    message(STATUS "########## BEGIN_TEST")
    
    include(CMakePrintHelpers)
    
    # 1.cmake_print_variables
    ## 1.1 打印CMAKE內置變量
    cmake_print_variables(CMAKE_VERSION)
    cmake_print_variables(CMAKE_GENERATOR)
    ## 若采用MSVC構建,可直接使用CMAKE_VS_PLATFORM_NAME
    if (MSVC)
        cmake_print_variables(CMAKE_VS_PLATFORM_NAME)
    endif()
    
    ## 1.2 打印普通變量
    cmake_print_variables(PROJECT_NAME)
    cmake_print_variables(${PROJECT_NAME})
    # 若采用Ninja構建,沒有CMAKE_VS_PLATFORM_NAME,可通過CMAKE_SIZEOF_VOID_P變通處理
    if (CMAKE_SIZEOF_VOID_P EQUAL 8)
        set(${PROJECT_NAME}_PLATFORM_NAME "x64")
    else()
        set(${PROJECT_NAME}_PLATFORM_NAME "Win32")
    endif()
    
    cmake_print_variables(${PROJECT_NAME}_PLATFORM_NAME)
    
    ## 1.3 打印緩存變量
    cmake_print_variables(PROJECT_VERSION)
    
    ## 1.4 同時打印多個變量
    set(var_1 "var1")
    set(var_2 "var2")
    cmake_print_variables(var_1 var_2)
    
    # 2.cmake_print_properties
    
    ## 2.1 打印屬性
    
    set(TARGET_NAME component)
    
    set(${TARGET_NAME}_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
    
    # 提取所有源文件(include和src分開提取)
    file(GLOB_RECURSE ${TARGET_NAME}_HEADER_FILES
        LIST_DIRECTORIES False CONFIGURE_DEPENDS
        "${${TARGET_NAME}_SOURCE_DIR}/include/*.h*"
    )
    file(GLOB_RECURSE ${TARGET_NAME}_SRC_FILES
        LIST_DIRECTORIES False CONFIGURE_DEPENDS
        "${${TARGET_NAME}_SOURCE_DIR}/src/*.h*"
        "${${TARGET_NAME}_SOURCE_DIR}/src/*.c*"
    )
    
    # 為VS設置源代碼文件夾
    source_group(
        TREE "${${TARGET_NAME}_SOURCE_DIR}/include"
        PREFIX "Header Files"
        FILES ${${TARGET_NAME}_HEADER_FILES}
    )
    source_group(
        TREE "${${TARGET_NAME}_SOURCE_DIR}/src/"
        PREFIX "Source Files" 
        FILES ${${TARGET_NAME}_SRC_FILES}
    )
    
    # 添加target
    add_library(${TARGET_NAME} SHARED)
    
    # 指定源文件
    target_sources(${TARGET_NAME}
        PRIVATE ${${TARGET_NAME}_SRC_FILES}
        PRIVATE ${${TARGET_NAME}_HEADER_FILES}
    )
    
    # 設置target屬性
    set_target_properties(${TARGET_NAME} PROPERTIES
        WINDOWS_EXPORT_ALL_SYMBOLS  True  ##自動導出符號
        FOLDER  "libs"  ##設置VS路徑
    )
    
    cmake_print_properties(TARGETS ${TARGET_NAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS FOLDER)
    
    # 打印結束日志
    message(STATUS "########## END_TEST\n")
    
  2. main.cpp

    int main()
    {
        return 0;
    }
    

    簡單示例,此文件僅僅為了創建Target的完整性。

2.3 輸出結果

  • 運行結果

    -- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.17763.
    -- The CXX compiler identification is MSVC 19.0.24245.0
    -- The C compiler identification is MSVC 19.0.24245.0
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- ########## BEGIN_TEST
    -- CMAKE_VERSION="3.18.2"
    -- CMAKE_GENERATOR="Visual Studio 16 2019"
    -- CMAKE_VS_PLATFORM_NAME="x64"
    -- PROJECT_NAME="KAIZEN"
    -- KAIZEN=""
    -- KAIZEN_PLATFORM_NAME="x64"
    -- PROJECT_VERSION="1.0.0.10"
    -- var_1="var1" ; var_2="var2"
    --
     Properties for TARGET component:
       component.WINDOWS_EXPORT_ALL_SYMBOLS = "True"
       component.FOLDER = "libs"
    
    -- ########## END_TEST
    
    -- Configuring done
    -- Generating done
    -- Build files have been written to: F:/learn_cmake/build
    請按任意鍵繼續. . .
    

2.4 注意事項

2.4.1 使用前必須引入CMakePrintHelpers

使用兩者前提必須引入CMakePrintHelpers,詳見示例CMakeLists.txt代碼第18行。

2.4.2 打印屬性

本示例僅提供了TARGETS的屬性打印,也是最常用之一。其余支持的屬性,后期使用到會穿插在示例中演示。

特殊說明:示例CMakeLists.txt代碼第53行~93行即定義一個Target對象的常規必備項內容,后期會專門分析TARGET內容。

在此只要記住,target必須是由add_executable或者add_library(如示例CMakeLists.txt中第81行)生成即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM