当前位置: 首页 > news >正文

Makefile if语句用法

文章目录

  • 语法
          • 1.Basic Expressions:
      • 2.Logic Operators:
          • 3.Existence Checks
          • 4.File Operations
          • 5.Comparisons
      • 示例
          • 1、判断两个字符串是否相等
          • 2、判断文件路径是否目录

语法

CMake中的if命令用于有条件地执行一组命令,其格式如下:

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

根据Condition syntax评估if子句的条件参数()。如果结果为true,则执行if块(block)中的命令。否则,以相同方式处理可选的elseif块.最后,如果没有条件为true,则执行可选else块中的命令。

1.Basic Expressions:
  • if(<constant>):如果常量为1, ON, YES, TRUE, Y或非零数(包括浮点数),则为true。如果常量为0, OFF, NO, FALSE, N, IGNORE, NOTFOUND, 空字符串或以后缀-NOTFOUND结尾,则为false.命名布尔常量不区分大小写。如果参数不是这些特定常量之一,则将其视为变量或字符串,并适用以下两种形式之一
  • if(<variable>):如果给定一个定义非false常量的值的变量,则为true。否则为false,包括变量未定义时。注意:宏参数不是变量。环境变量也不能以这种方式测试,例如if(ENV{some_var})将始终评估为false.
  • if(<string>):带引号的字符串始终评估为false,除非:字符串的值是真正的常量之一,或者Policy CMP0054为设置为NEW,并且字符串的值恰好是受CMP0054行为影响的变量名称。
if(ON)message("on") # print
endif()
if(OFF)message("off") # won't print
endif()if(YES)message("yes") # print
endif()
if(NO)message("no") # won't print
endif()if(true)message("true") # print
endif()
if(TRUE)message("TRUE") # print
endif()
if(FALSE)message("FALSE") # won't print
endif()set(ENV{CMAKE_PREFIX_PATH} "github/fengbingchun")
if(ENV{CMAKE_PREFIX_PATH})message("env") # won't print
endif()if("csdn")message("csdn") # won't print
endif()

2.Logic Operators:

  • if(NOT ):如果条件不为ture,,则为true.
  • if( AND ):如果这两个条件都被单独被认为是true,则为true.
  • if( OR ):如果任一条件单独被认为是true,则为true.
  • if((condition) AND (condition OR (condition))):首先评估括号内的条件,然后像其它示例一样评估其它条件。在有嵌套括号的地方,最里面的小括号作为条件的一部分被评估
set(var "csdn")if(NOT var2)message("not var2") # print
endif()if(var OR var2)message("var OR var2") # print
endif()
if(var AND var2)message("var AND var2") # won't print
endif()
3.Existence Checks
  • if(COMMAND command-name):如果给定的name是可以调用的命令、宏或函数,则为true.
  • if(POLICY policy-id):如果给定的name是存在的policy(形式为CMP),则为true.
  • if(TARGET target-name):如果给定的name是通过调用(在任何目录中)add_executable, add_library, 或add_custom_target命令创建的现有逻辑目标名称(existing logical target name),则为true.
  • if(TEST test-name):如果给定的name是由add_test命令创建的现有测试名称(existing test name),则为true.
  • if(DEFINED |CACHE{}|ENV{}):如果定义了给定的变量、缓存变量或环境变量,则为true.变量的值无关紧要。注意:宏参数不是变量。无法直接测试是否为非缓存变量。如果存在缓存或非缓存变量someName,则表达式if(DEFINED someName)将评估为true.相比之下,表达式if(DEFINED CACHE{someName})仅在缓存变量someName存在时才为true。如果你需要知道是否存在非缓存变量,则需要测试两个表达式:if(DEFINED someName AND NOT DEFINED CACHE{someName})
function(func)message("hello func")
endfunction()if(COMMAND func)message("func") # print
endif()if(POLICY CMP0010)message("policy") # print
endif()find_package(OpenCV 3.4.2) # -- Found OpenCV: /opt/opencv3.4.2 (found suitable version "3.4.2", minimum required is "3.4.2")
if(TARGET opencv_core)message("opencv_core") # print
endif()set(var OFF) # 变量的值无关紧要
if(DEFINED var)message("defined var") # print
endif()set(var2 )
if(DEFINED var2)message("defined var2") # won't print
endif()
4.File Operations
  • if(EXISTS path-to-file-or-directory):如果指定的文件或目录存在,则为true。仅针对显式完整路径(Behavior is well-defined only for explicit full paths).解析符号链接,如果符号链接的目标存在,则为true.
  • if(file1 IS_NEWER_THAN file2):如果file1比file2新,或两个文件中的一个不存在,则为true。仅针对完整路径。如果文件时间戳完全相同,则IS_NEWER_THAN比较返回true,这包括为file1和file2传递相同文件名的情况。
  • if(IS_DIRECTORY path-to-directory):如果给定name是目录,则为true。仅针对完整路径。
  • if(IS_SYMLINK file-name):如果给定name是符号链接,则为true.仅针对完整路径。
  • if(IS_ABSOLUTE path):如果给定路径是绝对路径,则为true。注意以下特殊情况:空路径评估为false。在windows主机上,任何以驱动器号和冒号(例如 C:)、正斜杠或反斜杠开头的路径都将评估为true.这意味着像C:no\base\dir这样的路径将评估为true.在非windows主机上,任何以波浪号(~)开头的路径都为true.
if(EXISTS /home/spring/GitHub/Linux_Code_Test/Samples_CMake/messy_usage)message("exists messy_usage") # print
endif()
if(EXISTS ../../Samples_Make)message("exists samples_make") # won't print
endif()if(/home/spring/GitHub/Linux_Code_Test/Samples_CMake/messy_usage/test_find_package.cmake IS_NEWER_THAN /home/spring/GitHub/Linux_Code_Test/Samples_CMake/messy_usage/test_xxxx.cmake)message("is newer") # print
endif()if(IS_DIRECTORY /home/spring/GitHub)message("is directory")
endif()if(IS_SYMLINK /usr/bin/gcc) # /usr/bin/gcc -> gcc-11*message("is symlink") # print
endif()if(IS_ABSOLUTE ~/.bashrc)message("is absolute") # print
endif()
5.Comparisons
  • if(<variable|string> MATCHES regex):如果给定的字符串或变量的值与给定的正则表达式匹配(matches),则为true.
  • if(<variable|string> LESS <variable|string>):如果给定的字符串或变量的值是有效数字且小于右侧的数字,则为true.
  • if(<variable|string> GREATER <variable|string>):如果给定的字符串或变量的值是有效数字且大于右侧的数字,则为true.
  • if(<variable|string> EQUAL <variable|string>):如果给定的字符串或变量的值是有效数字且等于右侧的数字,则为true.
  • if(<variable|string> LESS_EQUAL <variable|string>):如果给定的字符串或变量的值是有效数字且小于或等于右侧的数字,则为true.
  • if(<variable|string> GREATER_EQUAL <variable|string>):如果给定的字符串或变量的值是有效数字且大于或等于右侧的数字,则为true.
  • if(<variable|string> STRLESS <variable|string>):如果给定的字符串或变量的值按字典顺序(lexicographically)小于右侧的字符串或变量,则为true.
  • if(<variable|string> STRGREATER <variable|string>):如果给定的字符串或变量的值按字典顺序(lexicographically)大于右侧的字符串或变量,则为true.
  • if(<variable|string> STREQUAL <variable|string>):如果给定的字符串或变量的值按字典顺序(lexicographically)等于右侧的字符串或变量,则为true.
  • if(<variable|string> STRLESS_EQUAL <variable|string>):如果给定的字符串或变量的值按字典顺序(lexicographically)小于或等于右侧的字符串或变量,则为true.
    -if(<variable|string> STRGREATER_EQUAL <variable|string>):如果给定的字符串或变量的值按字典顺序(lexicographically)大于或等于右侧的字符串或变量,则为true.
if("cSdN" MATCHES [A-Za-z])message("matches") # print
endif()set(var1 4.1)
set(var2 4.2)
if(var1 LESS var2)message("less") # print
endif()
if(var2 GREATER var1)message("greater") # print
endif()
if(var1 EQUAL var1)message("equal") # print
endif()set(var3 "abc")
set(var4 "ABC")
if(var4 STRLESS var3)message("strless") # print
endif()
if(var4 STRLESS_EQUAL var3)message("strelss equal") # print
endif()
if(var3 STRGREATER var4)message("strgreater") # print
endif()

示例

1、判断两个字符串是否相等
set(NAME_1 yexindong)
# 判断2个值或字符串是否相等
if(${NAME_1} VERSION_EQUAL  yexindong)message(STATUS "yes")
endif()

打印

-- yes
2、判断文件路径是否目录
file (GLOB dirs *) # 创建变量files
# 循环
foreach(item ${dirs})if(IS_DIRECTORY ${item}) # 判断是否目录,必须加上${} ,如果不加 ${} 就是字符串,无法判断是否目录message(STATUS "is dir" ${item})endif()
endforeach()

打印

-- is dir/Users/yexd/Documents/project_cpp/cpp_learn/.git
-- is dir/Users/yexd/Documents/project_cpp/cpp_learn/.idea
-- is dir/Users/yexd/Documents/project_cpp/cpp_learn/cmake-build-debug
-- is dir/Users/yexd/Documents/project_cpp/cpp_learn/lesson_17_header_file
-- is dir/Users/yexd/Documents/project_cpp/cpp_learn/lesson_20_class

http://www.lryc.cn/news/602688.html

相关文章:

  • Linux内核驱动开发核心问题全解
  • Python全栈项目--基于深度学习的视频内容分析系统
  • 使用Docker在Rocky Linux 9.5上在线部署LangFlow
  • GoldenDB 分布式数据库详解
  • 在CentOS上以源码编译的方式安装PostgreSQL
  • <七> CentOS 8 安装最新版本Docker
  • 很妙的一道题 Leetcode234. 回文链表
  • 力扣 之 最小覆盖子串(变长滑动窗口,越短越好)
  • 电磁兼容五:仿真技术
  • Mac安装navicat17版本教程mac下载Navicat Premium for Mac v17.1.9【好用】
  • 微算法科技(NASDAQ:MLGO)利用基于区块链的机器学习模型进行交易分类,实现交易数据的匿名化
  • redis数据库的四种取得 shell方法
  • 安宝特案例丨户外通信机房施工革新:AR+作业流技术破解行业难题
  • 免费版酒店收银系统弹窗在押金原路退回流程中的应用价值探究 ——仙盟创梦IDE
  • 设计模式(二十一)行为型:状态模式详解
  • python生成 requirement.txt 文件
  • fchown/fchownat系统调用及示例
  • 技术总结|如何使用提升 strlen 的性能?
  • lesson26-2:使用Tkinter打造简易画图软件优化版
  • 数据链路层 和 ARP协议
  • MQTT的原理
  • 华为Huawei 6730交换机查看接口收发光命令 transceiver
  • 9.c语言常用算法
  • Anaconda创建环境报错:CondaHTTPEFTOT: HTTP 403 FORBIDDEN for url
  • Linux中配置haproxy
  • gitlab 在线合并分支a-分支b,解决冲突后,反向合并分支b-分支a
  • 数据结构——图(二、图的存储和基本操作)
  • 人机交互打字游戏
  • Leetcode——11. 盛最多水的容器
  • 力扣-39.组合总和