CMake语法—流程控制(if-foreach-while)

CMake语法—流程控制(if-foreach-while)

1 流程控制

1.1 代码结构

目录结构

  • learn_cmake:为根目录
  • build:为CMake配置输出目录(在此例中即生成sln解决方案的地方)
  • cmake_config.bat:执行CMake配置过程的脚本(双击直接运行)
  • CMakeLists.txt:CMake脚本

1.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 "\n########## BEGIN_TEST_PROCESS_CONTROL")
    # if example
    set(var_3 "camke")
    if (DEFINED var_1)
    message("defined var_1")
    elseif (DEFINED var_2)
    message("defined var_2")
    elseif (DEFINED var_3)
    message("defined var_3")
    else()
    message("defined nothing")
    endif()
    # endif
    ## foreach example
    ## foreach 方式一:
    set(var_list "C++" "JAVA" Python "CMake" 1024)
    foreach(item ${var_list})
    message("当前变量是:${item}")
    endforeach()
    ## foreach 方式二:
    set(result 0)
    set(end 0)
    foreach(element RANGE 0 100)
    math(EXPR result "${result} + ${element}")
    if (result LESS 100)
    continue() ## continue
    endif()
    if (result GREATER 1000)
    set(end ${element})
    break() ## break
    endif()
    endforeach()
    message("from 0 plus to ${end} is : ${result}\n")
    ## foreach 方式三:
    foreach(every RANGE 0 10 2)
    message(STATUS "every = ${every}")
    endforeach()
    ## foreach 方式四:
    set(X a b c)
    foreach(var IN LISTS X)
    message(STATUS "var = ${var}")
    endforeach()
    ## foreach 方式五:
    set(A a b c)
    set(B 3 4 5)
    set(C "11 22")
    set(D 8;9 10)
    set(E "")
    foreach(m IN LISTS A B C D E)
    message(STATUS "m = ${m}")
    endforeach()
    ## foreach 方式六:
    foreach(pair IN ZIP_LISTS A B)
    message(STATUS "pair_0 = ${pair_0}, pair_1 = ${pair_1}")
    endforeach()
    ## foreach 方式七:
    foreach(first second IN ZIP_LISTS A B)
    message(STATUS "first = ${first}, second = ${second}")
    endforeach()
    ## endforeach
    ### while
    set(var_max 5)
    while(${var_max} GREATER 0)
    message(${var_max})
    math(EXPR var_max "${var_max} - 1")
    endwhile()
    ### endwhile
    # 打印结束日志
    message(STATUS "########## END_TEST_PROCESS_CONTROL\n")
  2. cmake_config.bat

    @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

1.3 运行结果

  1. 本地环境

    本地安装VS版本:Visual Studio 2019(2015工具集)

    CMake版本:3.18.2

    F:\learn_cmake
    λ cmake --version
    cmake version 3.18.2
    CMake suite maintained and supported by Kitware (kitware.com/cmake).
  2. 输出结果

    -- 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_PROCESS_CONTROL
    defined var_3
    当前变量是:C++
    当前变量是:JAVA
    当前变量是:Python
    当前变量是:CMake
    当前变量是:1024
    from 0 plus to 45 is : 1035
    -- every = 0
    -- every = 2
    -- every = 4
    -- every = 6
    -- every = 8
    -- every = 10
    -- var = a
    -- var = b
    -- var = c
    -- m = a
    -- m = b
    -- m = c
    -- m = 3
    -- m = 4
    -- m = 5
    -- m = 11 22
    -- m = 8
    -- m = 9
    -- m = 10
    -- pair_0 = a, pair_1 = 3
    -- pair_0 = b, pair_1 = 4
    -- pair_0 = c, pair_1 = 5
    -- first = a, second = 3
    -- first = b, second = 4
    -- first = c, second = 5
    5
    4
    3
    2
    1
    -- ########## END_TEST_PROCESS_CONTROL
    -- Configuring done
    -- Generating done
    -- Build files have been written to: F:/learn_cmake/build
    请按任意键继续. . .

1.4 小结

  1. if 概要

    if(<condition>)
    <commands>
    elseif(<condition>) # optional block, can be repeated
    <commands>
    else() # optional block
    <commands>
    endif()

    具体可参考最钟情官方文档:https://cmake.org/cmake/help/latest/command/if.html

  2. foreach 概要

    foreach(<loop_var> <items>)
    <commands>
    endforeach()

    具体可参考最钟情官方文档:https://cmake.org/cmake/help/latest/command/foreach.html

  3. while 概要

    while(<condition>)
    <commands>
    endwhile()

    具体看参考最钟情官方文档:https://cmake.org/cmake/help/latest/command/while.html

posted @   kaizenly  阅读(486)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
历史上的今天:
2013-12-01 队列
2013-12-01
2013-12-01 单链表
打赏

喜欢请打赏

扫描二维码打赏

微信打赏

点击右上角即可分享
微信分享提示