• CMake中foreach的使用


          CMake中的foreach命令为list中的每个值评估一组命令(Evaluate a group of commands for each value in a list),其格式如下:其中是由分号或空格分割的项列表(list of items)

    1. foreach( )
    2. endforeach()
    3. foreach( RANGE ) # 1
    4. foreach( RANGE []) # 2
    5. foreach( IN [LISTS []] [ITEMS []]) # 3
    6. foreach(... IN ZIP_LISTS ) # 4

          foreach和匹配的endforeach之间的所有命令都被记录下来而不被调用。一旦评估了endforeach,记录的命令列表就会中的每个item调用一次在每次迭代迭代开始时,变量将被设置为当前item的值的范围仅限于循环范围
          break和continue命令提供了从正常控制流退出的方法
          endforeach命令接受一个可选的参数:endforeach([]) ,支持可选的参数仅是为了向后兼容。

    1. foreach(var 1 2)
    2. message("var: ${var}") # var: 1
    3. # var: 2
    4. endforeach()
    5. if(DEFINED var)
    6. message("defined var") # won't print
    7. endif()

          1.在这个变体中,foreach迭代数字0,1,...直至(包括)非负整数

    1. foreach(var RANGE 2)
    2. message("var: ${var}") # var: 0
    3. # var: 1
    4. # var: 2
    5. endforeach()

          2.在这个变体中,foreach以为步长(step)迭代从到最多的数字。如果未指定,则步长为1.三个参数, ,必须都是非负整数,且不能小于

    1. foreach(var RANGE 1 5 2)
    2. message("var: ${var}") # var: 1
    3. # var: 3
    4. # var: 5
    5. endforeach()

          3.在这个变体中,是一个空格或分号分割的列表值变量列表。foreach命令遍历每个给定list中的每个item。跟在ITEMS关键字后面的的处理方式与foreach命令的第一个变体一样。LISTS A和ITEMS ${A}的形式是等价的。

    1. set(A 0;1)
    2. set(B 2 3)
    3. set(C "4 5")
    4. set(D 6;7 8)
    5. set(E "")
    6. foreach(X IN LISTS A B C D E)
    7. message("X=${X}") # X=0
    8. # X=1
    9. # X=2
    10. # X=3
    11. # X=4 5
    12. # X=6
    13. # X=7
    14. # X=8
    15. endforeach()
    16. foreach(X IN ITEMS a b)
    17. message("X=${X}") # X=a
    18. # X=b
    19. endforeach()

          4.在这个变体中,是一个空格或分号分割的列表值变量列表。foreach命令同时迭代每个list,设置迭代变量如下:
          (1).如果只给出了loop_var,那么它将一系列loop_var_N变量设置为相应list中的当前项。
          (2).如果传递了多个变量名,则它们的计数(count)应与list变量计数匹配。
          (3).如果任何list较短,则未为当前迭代定义相应的迭代变量。

    1. list(APPEND English one two three four)
    2. list(APPEND Bahasa satu dua tiga)
    3. foreach(num IN ZIP_LISTS English Bahasa)
    4. message("num_0=${num_0}, num_1=${num_1}") # num_0=one, num_1=satu
    5. # num_0=two, num_1=dua
    6. # num_0=three, num_1=tiga
    7. # num_0=four, num_1=
    8. endforeach()
    9. foreach(en ba IN ZIP_LISTS English Bahasa)
    10. message("en=${en}, ba=${ba}") # en=one, ba=satu
    11. # en=two, ba=dua
    12. # en=three, ba=tiga
    13. # en=four, ba=
    14. endforeach()

          执行上述测试代码需要3个文件:build.sh, CMakeLists.txt, test_foreach.cmake

          build.sh内容如下:

    1. #! /bin/bash
    2. # supported input parameters(cmake commands)
    3. params=(function macro cmake_parse_arguments \
    4. find_library find_path find_file find_program find_package \
    5. cmake_policy cmake_minimum_required project include \
    6. string list set foreach message option if)
    7. usage()
    8. {
    9. echo "Error: $0 needs to have an input parameter"
    10. echo "supported input parameters:"
    11. for param in ${params[@]}; do
    12. echo " $0 ${param}"
    13. done
    14. exit -1
    15. }
    16. if [ $# != 1 ]; then
    17. usage
    18. fi
    19. flag=0
    20. for param in ${params[@]}; do
    21. if [ $1 == ${param} ]; then
    22. flag=1
    23. break
    24. fi
    25. done
    26. if [ ${flag} == 0 ]; then
    27. echo "Error: parameter \"$1\" is not supported"
    28. usage
    29. exit -1
    30. fi
    31. if [[ ! -d "build" ]]; then
    32. mkdir build
    33. cd build
    34. else
    35. cd build
    36. fi
    37. echo "==== test $1 ===="
    38. # test_set.cmake: cmake -DTEST_CMAKE_FEATURE=$1 --log-level=verbose ..
    39. # test_option.cmake: cmake -DTEST_CMAKE_FEATURE=$1 -DBUILD_PYTORCH=ON ..
    40. cmake -DTEST_CMAKE_FEATURE=$1 ..
    41. # It can be executed directly on the terminal, no need to execute build.sh, for example: cmake -P test_set.cmake

          CMakeLists.txt内容如下:

    1. cmake_minimum_required(VERSION 3.22)
    2. project(cmake_feature_usage)
    3. message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
    4. include(test_${TEST_CMAKE_FEATURE}.cmake)
    5. message("==== test finish ====")

          test_foreach.cmake:为上面的所有示例代码

          可能的执行结果如下图所示:

          GitHub:https://github.com/fengbingchun/Linux_Code_Test

  • 相关阅读:
    Python毕业设计源代码竞赛比赛平台
    2022年最新浙江机动车签字授权人考试模拟题库及答案
    Nginx 学习(九)集群概述与LVS工作模式的配置
    【数据库——MySQL(实战项目1)】(3)图书借阅系统——存储函数
    SQL教程之 10 个终极 SQL JOIN 问题和答案
    网络术语介绍 服务器、中间件、数据库、代码、静态资源 客户端,服务器,IP地址,域名,DNS,ISP,TCP/IP,HTTP
    postman如何设置才能SwitchHosts切换host无缓存请求到指定ip服务
    supOS APP开发者课程练习册
    stream final 生成序号
    C++深拷贝和浅拷贝
  • 原文地址:https://blog.csdn.net/fengbingchun/article/details/127819743