IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ CMake入门和进阶(二):CMake语法 -> 正文阅读

[C++知识库]C++ CMake入门和进阶(二):CMake语法

CMake也是有语法的,这里总结一些。CMake系列学习个人笔记:

分支 if/elseif/else/endif

分支的应用十分广泛,可以用于判断值、比较大小、判断文件是否存在、版本比较、新旧比较等等。语法格式如下:

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

例子:

if(NOT <condition>)
if(<cond1> AND <cond2>)
if(<cond1> OR <cond2>)
if((condition) AND (condition OR (condition)))		# 优先级
if(TARGET target-name)  							# 判断是否是内部已建立的目标
if(DEFINED <name>|CACHE{<name>}|ENV{<name>})		# 判断指定类型的变量是否声明
if(<variable|string> IN_LIST <variable>)			# 判断变量是否在列表中
if(EXISTS path-to-file-or-directory)				# 路径或文件名存在,必须是绝对完整路径,链接文件指向的目录也支持检测
if(file1 IS_NEWER_THAN file2)
if(IS_DIRECTORY path-to-directory)					# 判断绝对路径是否是文件夹
if(<variable|string> LESS|GREATER|EQUAL|LESS_EQUAL|GREATER_EQUAL| \
		STRLESS|STRGREATER|STREQUAL|STRLESS_EQUAL|STRGREATER_EQUAL <variable|string>)

列表 list

很像python的语法,支持插入、查找、删除、读取、排序、反转。

Reading
  list(LENGTH <list> <out-var>)
  list(GET <list> <element index> [<index> ...] <out-var>)
  list(JOIN <list> <glue> <out-var>)
  list(SUBLIST <list> <begin> <length> <out-var>)

Search
  list(FIND <list> <value> <out-var>)

Modification
  list(APPEND <list> [<element>...])
  list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>)
  list(INSERT <list> <index> [<element>...])
  list(POP_BACK <list> [<out-var>...])
  list(POP_FRONT <list> [<out-var>...])
  list(PREPEND <list> [<element>...])
  list(REMOVE_ITEM <list> <value>...)
  list(REMOVE_AT <list> <index>...)
  list(REMOVE_DUPLICATES <list>)
  list(TRANSFORM <list> <ACTION> [...])

Ordering
  list(REVERSE <list>)
  list(SORT <list> [...])

例子:

# list eample
set(test_list 0 2 3 1 4 5 6)
list(LENGTH test_list output_length)
message("The length of test_list is ${output_length}")
list(GET test_list 5 5th_val)
message("5th_val is ${5th_val}")
list(SORT test_list ORDER DESCENDING)

# foreach test
message("\nlist sort result:")
foreach(x IN LISTS test_list)
    message(STATUS "x = ${x}")
endforeach()

结果:

The length of test_list is 7
5th_val is 5

list sort result:
-- x = 6
-- x = 5
-- x = 4
-- x = 3
-- x = 2
-- x = 1
-- x = 0

循环 foreach/while/break/continue

foreach即可以用来循环计数又可以遍历列表:

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

foreach(<loop_var> RANGE <stop>)
foreach(<loop_var> RANGE <start> <stop> [<step>])
foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])

while(<condition>)  # condition的规则和if一致
  <commands>        # 可以使用continue和break继续或者终止循环
endwhile()

例子:

# exp1 注意循环计数是0 1 2,包括2
message("\nforeach RABGE test result:")
foreach(i RANGE 0 2)
    message(STATUS "i = ${i}")
endforeach()

# exp2 搜索路径下是否有带有关键字的文件
set(file_groups output.txt output.log output.error)
foreach(file_name IN LISTS file_groups)
    if(EXISTS "${CMAKE_SOURCE_DIR}/${file_name}")
        message("output file exists, file is in ${CMAKE_SOURCE_DIR}/${file_name}")
    endif()
endforeach()

# exp3 3.17引入的新的多列表循环,按较长的循环
list(APPEND English one two three four)
list(APPEND Bahasa satu dua tiga)
foreach(num IN ZIP_LISTS English Bahasa)
    message(STATUS "num_0=${num_0}, num_1=${num_1}")
endforeach()
foreach(en ba IN ZIP_LISTS English Bahasa)
    message(STATUS "en=${en}, ba=${ba}")
endforeach()

# exp4 while循环
set(condition OFF)
while(NOT condition)
    message("This is a while loop")
    set(condition ON)
endwhile()

结果:

foreach RABGE test result:
-- i = 0
-- i = 1
-- i = 2
output file exists, file is in /home/sjl/learn/cmake-examples/grammer/output.log
-- num_0=one, num_1=satu
-- num_0=two, num_1=dua
-- num_0=three, num_1=tiga
-- num_0=four, num_1=
-- en=one, ba=satu
-- en=two, ba=dua
-- en=three, ba=tiga
-- en=four, ba=
This is a while loop

函数

函数声明必须在使用之前。格式如下:

function(<name> [<arg1> ...])
  <commands>
endfunction()

例子,判断条件并设定值,如果依赖条件成立设置为ON,如果不成立设置为OFF(FORCE设置),这里的函数功能和官方cmake_dependent_option()函数用法一致,先看一下这个函数的用法:

cmake_dependent_option(<option> "<help_text>" <value> <depends> <force>)

# If USE_BAR is true and USE_ZOT is false, this provides an option called USE_FOO that defaults to ON. 
# Otherwise, it sets USE_FOO to OFF and hides the option from the user. If the status of USE_BAR or
# USE_ZOT ever changes, any value for the USE_FOO option is saved so that when the option is re-enabled
# it retains its old value.
cmake_dependent_option(USE_FOO "Use Foo" ON
                       "USE_BAR;NOT USE_ZOT" OFF)

这里如果depends支持,则设置值为value(CACHE设置),如果不支持则设置为force,这是强制设置。我们来实现一下这个函数:

function(sync_test target_config depend_config str)
    if(${depend_config})
        set(${target_config} OFF CACHE BOOL ${str})
    endif()
endfunction()
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 15:11:24  更:2021-08-17 15:15:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 10:12:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码