• CMake中list的使用


          CMake中的list命令用于列表操作,其格式如下:

    1. Reading
    2. list(LENGTH )
    3. list(GET [ ...] )
    4. list(JOIN )
    5. list(SUBLIST )
    6. Search
    7. list(FIND )
    8. Modification
    9. list(APPEND [...])
    10. list(FILTER {INCLUDE | EXCLUDE} REGEX )
    11. list(INSERT [...])
    12. list(POP_BACK [...])
    13. list(POP_FRONT [...])
    14. list(PREPEND [...])
    15. list(REMOVE_ITEM ...)
    16. list(REMOVE_AT ...)
    17. list(REMOVE_DUPLICATES )
    18. list(TRANSFORM [...])
    19. Ordering
    20. list(REVERSE )
    21. list(SORT [...])

          list子命令APPEND, INSERT, FILTER, PREPEND, POP_BACK, POP_FRONT, REMOVE_AT, REMOVE_ITEM, REMOVE_DUPLICATES, REVERSE和SORT可以在当前CMake变量范围内为list创建新值。与set命令类似,list命令在当前作用域中创建新的变量值,即使list本身实际上是在父作用域中定义的也是如此。要向上(upwards)传播这些操作的结果,需要使用带有PARENT_SCOPE的set命令、带有CACHE INTERNAL的set命令或其它一些值传播方式。
          cmake中的list是;分割的字符串组要创建list,可以使用set命令注意:macro参数不是变量,因此不能在list命令中使用

    1. set(var a b c d e) # create a list
    2. message("var: ${var}") # var: a;b;c;d;e
    3. set(var "a b c d e") # creates a string or a list with one item in it
    4. message("var: ${var}") # var: a b c d e

          指定索引值(index value)时,如果为0或更大,则从list的开头开始索引,0表示第一个list元素。如果为-1或更小,则从list末尾开始索引,-1表示最后一个list元素。使用负索引计数时要小心:它们不是从0开始的。-0相当于0,即第一个list元素。

          1.Reading:
          LENGTH:返回list的长度

    1. set(values a b c d e)
    2. list(LENGTH values var)
    3. message("var: ${var}") # var: 5

          GET:返回list中由索引指定的元素列表

    1. set(values a b c d e)
    2. list(GET values 1 3 var)
    3. message("var: ${var}") # var: b;d
    4. list(GET values -1 -3 -5 var)
    5. message("var: ${var}") # var: e;c;a

          JOIN:返回使用粘合字符串(glue string)连接所有list元素的字符串。要连接多个不属于list的字符串,需要使用string命令的JOIN操作符

    1. set(values a b c d e)
    2. list(JOIN values "-" var)
    3. message("var: ${var}") # var: a-b-c-d-e

          SUBLIST:返回给定list的子list.如果为0,将返回一个空list.如果为-1或list小于+则将返回list中从开始的剩余元素

    1. set(values a b c d e f g h i j)
    2. list(LENGTH values len)
    3. list(SUBLIST values 2 ${len} var)
    4. message("var: ${var}") # var: c;d;e;f;g;h;i;j
    5. list(SUBLIST values 2 2 var)
    6. message("var: ${var}") # var: c;d
    7. list(SUBLIST values 1 0 var)
    8. message("var: ${var}") # var:
    9. list(SUBLIST values 3 -1 var)
    10. message("var: ${var}") # var: d;e;f;g;h;i;j
    11. list(SUBLIST values 3 -2 var) # CMake Error at test_list.cmake:45 (list):
    12. # list length: -2 should be -1 or greater

          2.Search:返回list中指定元素的的索引,如果未找到则返回-1

    1. set(values a b c d e f g h i j)
    2. list(FIND values c var)
    3. message("var: ${var}") # var: 2
    4. list(FIND values w var)
    5. message("var: ${var}") # var: -1

          3.Modification:
          APPEND:将元素附加到list中。如果当前范围内不存在名为的变量,则其值被视为空,并且元素将附加到该空list中

    1. set(values1 a b c d e)
    2. set(values2 1 2 3 4 5)
    3. list(APPEND var A B C)
    4. message("var: ${var}") # var: A;B;C
    5. list(APPEND var ${values1} ${values2})
    6. message("var: ${var}") # var: A;B;C;a;b;c;d;e;1;2;3;4;5

          FILTER:从list中includes或removes与模式匹配的项(item)。在REGEX模式下,items将与给定的正则表达式匹配

    1. set(values a 1 b 2 c 3 d 4 e 5)
    2. list(FILTER values INCLUDE REGEX "[a-z]")
    3. message("values: ${values}") # values: a;b;c;d;e
    4. set(values a 1 b 2 c 3 d 4 e 5)
    5. list(FILTER values EXCLUDE REGEX "[a-z]")
    6. message("values: ${values}") # values: 1;2;3;4;5

          INSERT:将元素插入到指定索引的list中。指定超出范围的索引会触发error。有效索引我0到N,其中N是list的长度,含N。空list的长度为0.如果当前范围内不存在名为的变量,则其值被视为空,并且元素将插入到该空list中

    1. set(values a b c d e)
    2. list(INSERT var 0 A B)
    3. message("var: ${var}") # var: A;B
    4. list(INSERT var 1 ${values})
    5. message("var: ${var}") # var: A;a;b;c;d;e;B
    6. list(INSERT var -2 C)
    7. message("var: ${var}") # var: A;a;b;c;d;C;e;B
    8. list(INCLUDE var 10 D) # CMake Error at test_list.cmake:84 (list):
    9. # list does not recognize sub-command INCLUDE

          POP_BACK:如果没有给出变量名,则只删除最后一个元素。否则,在提供N个变量名的情况下,将最后N个元素的值分配给给定变量,然后从中删除最后N个值

    1. set(values a b c d e)
    2. list(POP_BACK values)
    3. message("values: ${values}") # values: a;b;c;d
    4. set(values a b c d e)
    5. list(POP_BACK values var1 var2 var3)
    6. message("values: ${values}; var1: ${var1}; var2: ${var2}; var3: ${var3}") # values: a;b; var1: e; var2: d; var3: c

          POP_FRONT:如果没有给出变量名,则只删除最前一个元素。否则,在提供N个变量名的情况下,将最前N个元素的值分配给给定变量,然后从中删除最前N个值

    1. set(values a b c d e)
    2. list(POP_FRONT values)
    3. message("values: ${values}") # values: b;c;d;e
    4. set(values a b c d e)
    5. list(POP_FRONT values var1 var2 var3)
    6. message("values: ${values}; var1: ${var1}; var2: ${var2}; var3: ${var3}") # values: d;e; var1: a; var2: b; var3: c

          PREPEND:将元素插入到list中的第0位。如果当前作用域中不存在名为的变量,则其值被视为空,并且元素将附加到该空list中

    1. list(PREPEND var a b c d)
    2. message("var: ${var}") # var: a;b;c;d
    3. set(values a b c d e)
    4. list(PREPEND values 1 2 3)
    5. message("values: ${values}") # values: 1;2;3;a;b;c;d;e

          REMOVE_ITEM:从list中删除给定items的所有实例(removes all instances of the given items)

    1. set(values a 1 b 2 c 3 d 4 e 5)
    2. list(REMOVE_ITEM values 1 2 3 4 5)
    3. message("values: ${values}") # values: a;b;c;d;e

          REMOVE_AT:从list中删除给定index的item

    1. set(values a 1 b 2 c 3 d 4 e 5)
    2. list(REMOVE_AT values 0 2 4 6 8)
    3. message("values: ${values}") # values: 1;2;3;4;5

          REMOVE_DUPLICATES:删除list中的重复项。items的相对顺序被保留,但如果遇到重复项,则仅保留第一个实例

    1. set(values a 1 b 2 a 1 b 2 c 3)
    2. list(REMOVE_DUPLICATES values)
    3. message("values: ${values}") # values: a;1;b;2;c;3

          TRANSFORM:通过将应用于所有或通过指定的元素来转换list,将结果存储在原list或指定的中。TRANSFORM子命令不会更改list中元素的数量。如果指定了,则只会更改一些元素,其它元素将保持与转换前相同。指定应用于list元素的操作。这些操作与string命令的子命令具有完全相同的语义。必须是以下之一:

    1. list(TRANSFORM [] [OUTPUT_VARIABLE ])
    2. list(TRANSFORM ...) # 将指定的value追加或前置到list的每个元素
    3. list(TRANSFORM ...) # 将list的每个元素转换为大写或小写字符
    4. list(TRANSFORM STRIP ...) # 移除list中的前后空格
    5. list(TRANSFORM GENEX_STRIP ...) # 从list的每个元素中删除any generator expressions
    6. list(TRANSFORM REPLACE ...) # 匹配正则表达式,替换list中每个元素的匹配项
    1. set(values a b c d e)
    2. list(TRANSFORM values APPEND 1)
    3. message("values: ${values}") # values: a1;b1;c1;d1;e1
    4. list(TRANSFORM values PREPEND 2)
    5. message("values: ${values}") # values: 2a1;2b1;2c1;2d1;2e1
    6. set(values a b c d e)
    7. list(TRANSFORM values APPEND 1 OUTPUT_VARIABLE var)
    8. message("values: ${values}; var: ${var}") # values: a;b;c;d;e; var: a1;b1;c1;d1;e1
    9. set(values a b c d e)
    10. list(TRANSFORM values TOUPPER)
    11. message("values: ${values}") # values: A;B;C;D;E
    12. list(TRANSFORM values TOLOWER)
    13. message("values: ${values}") # values: a;b;c;d;e
    14. set(values a b c d e)
    15. list(APPEND values " f j " " p q ")
    16. message("values: ${values}") # values: a;b;c;d;e; f j ; p q
    17. list(TRANSFORM values STRIP)
    18. message("values: ${values}") # values: a;b;c;d;e;f j;p q
    19. set(value one;$<1:two;three>;four;$)
    20. list(TRANSFORM value GENEX_STRIP)
    21. message("value: ${value}") # value: one;$<1:two;three>;four;
    22. set(values a 1 b 2 c 3 d 4 e 5)
    23. list(TRANSFORM values REPLACE "[a-z]" "T")
    24. message("values: ${values}") # values: T;1;T;2;T;3;T;4;T;5
    25. set(values a b c d e)
    26. list(TRANSFORM values APPEND 1 AT 0 3)
    27. message("values: ${values}") # values: a1;b;c;d1;e
    28. set(values a b c d e 1 2 3 4 5)
    29. list(TRANSFORM values APPEND "#" FOR 2 8 2)
    30. message("values: ${values}") # values: a;b;c#;d;e#;1;2#;3;4#;5
    31. set(values a b c d e 1 2 3 4 5)
    32. list(TRANSFORM values APPEND "#" REGEX [a-c])
    33. message("values: ${values}") # values: a#;b#;c#;d;e;1;2;3;4;5

          确定转换list中的哪些元素。一次只能指定一种类型的selector,若给定,必须是以下之一:

    1. list(TRANSFORM AT [ ...] ...) # 指定list索引
    2. list(TRANSFORM FOR [] ...) # 指定一个范围,可选项,迭代增量
    3. list(TRANSFORM REGEX ...) # 正则表达式,只有匹配正则表达式的元素才会被转换

          4.Ordering:
          REVERSE:就地(in-place)反转list的内容

    1. set(values a b c d e)
    2. list(REVERSE values)
    3. message("values: ${values}") # values: e;d;c;b;a

          SORT:就地(in-place)按字母顺序对list进行排序

    list(SORT  [COMPARE ] [CASE <case>] [ORDER ])

          使用COMPARE关键字选择排序的比较方法,选项应该是其中之一:
          (1).STRING:按字母顺序对字符串list进行排序。如果没有给出COMPARE选项,这是默认行为
          (2).FILE_BASENAME:按文件的basenames对文件的路径名list进行排序
          (3).NATURAL:使用自然顺序(natural order)对字符串list进行排序
          使用CASE关键字选择区分大小写或不区分大小写的排序模式。选项应该是其中之一:
          (1).SENSITIVE:list items以区分大小写(case-sensitive)的方式排序。如果没有给出CASE选项,这是默认行为
          (2).INSENSITIVE:list items不区分大小写
          要控制排序顺序,可以给出ORDER关键字。选项应该是其中之一:
          (1).ASCENDING:按升序对list进行排序。这是未给出ORDER选项时的默认行为
          (2).DESCENDING:按降序对list进行排序

    1. set(values c 4 a I f 9 -1 B b)
    2. list(SORT values COMPARE STRING)
    3. message("values: ${values}") # values: -1;4;9;B;I;a;b;c;f
    4. set(values 10.0 1.1 2.1 8.0 2.0 3.1)
    5. list(SORT values)
    6. message("values: ${values}") # values: 1.1;10.0;2.0;2.1;3.1;8.0
    7. set(values 10.0 1.1 2.1 8.0 2.0 3.1)
    8. list(SORT values COMPARE NATURAL)
    9. message("values: ${values}") # values: 1.1;2.0;2.1;3.1;8.0;10.0
    10. set(values A c B e i H)
    11. list(SORT values CASE SENSITIVE)
    12. message("values: ${values}") # values: A;B;H;c;e;i
    13. set(values A c B e i H)
    14. list(SORT values CASE INSENSITIVE)
    15. message("values: ${values}") # values: A;B;c;e;H;i
    16. set(values A c B e i H)
    17. list(SORT values ORDER ASCENDING)
    18. message("values: ${values}") # values: A;B;H;c;e;i
    19. set(values A c B e i H)
    20. list(SORT values ORDER DESCENDING)
    21. message("values: ${values}") # values: i;e;c;H;B;A

          执行上述测试代码需要3个文件:build.sh, CMakeLists.txt, test_list.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)
    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. cmake -DTEST_CMAKE_FEATURE=$1 ..

          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_list.cmake:为上面的所有示例代码

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

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

  • 相关阅读:
    解决Selenium在运行中出现浏览器页面崩溃,最后导致丢失session id的问题。
    哈尔滨等保测评试题分享
    网络安全(黑客)自学
    【开源三方库】Easyui:基于OpenAtom OpenHarmony ArkUI深度定制的组件框架
    弘辽科技:淘宝同行店铺排名在哪看?如何提升?
    【计算机视觉】不来试试图片轮廓提取?
    Android深度性能优化-更底层、全局、多维度优化
    如何从数组对象中拿到指定的数据格式,数组对象数据处理
    mlr3绘制校准曲线
    基于单片机设计的智能窗帘控制系统
  • 原文地址:https://blog.csdn.net/fengbingchun/article/details/127715230