regex - QMake 不匹配用于发行版检测的正则表达式
问题描述
我有一个使用 QMake 的 C++ 项目。我正在尝试根据正在运行的 Linux 发行版的简单测试设置一些编译器选项,但测试没有通过。我的 qmake 文件包含:
OSDISTRO = $$(cat /proc/version)
contains(OSDISTRO, "Ubuntu"): {
message(Found ubuntu)
}
我从命令行测试了正则表达式,它可以工作!
cat /proc/version | pcregrep "Ubuntu"
Linux version 4.18.0-20-generic (buildd@lcy01-amd64-020) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21~18.04.1-Ubuntu SMP Wed May 8 08:43:37 UTC 2019
qmake 中的正则表达式语法有什么特别之处吗?为什么这不起作用?
解决方案
对于正则表达式:
这对我有用:
OSDISTRO = $$system(cat /proc/version)
contains(OSDISTRO, .*Ubuntu.*){
message("Found Ubuntu")
}
注意: 匹配区分大小写。
您可以使用.*[uU]buntu.*
例如来匹配ubuntu
和Ubuntu
。
解释为什么您的解决方案不起作用:
该QMake
函数contains
适用于值列表。
因此,您的解决方案的执行将如下所示:
1)第一条指令OSDISTRO = $$(cat /proc/version)
:
QMake
将执行$$system(cat /proc/version)
。然后将结果(按空格作为分隔符)拆分为值列表。
OSDISTRO
将包含此列表。
假设结果和你一样。第一条指令的结果是这样的:
OSDISTRO = "Linux" "version" "4.18.0-20-generic"...
.
2)第二条指令contains(OSDISTRO, "Ubuntu") : message(Found ubuntu)
:
QMake
将搜索变量是否OSDISTRO
包含该值,如果成功则Ubuntu
显示消息。Found ubuntu
在您的情况下,QMake
将永远找不到Ubuntu
,导致包含它的值是这样的(Ubuntu 7.3.0-16ubuntu3)
,并且QMake
只搜索值Ubuntu
。
希望它可以帮助你。
推荐阅读
- pyspark - 我们如何在本地机器上使用 pyspark 实现多核划分?
- firebase - Still get error 'Operation was rejected because the system is not in a state required for the operation's execution' after creating firebase index
- python - 当我有一些 Nan 值时,根据一个变量对我的数据进行分组不会产生预期的结果
- node.js - 如何使用commander.js实现诸如命令之类的来回问题?
- python-3.x - AWS Glue:在 AWS Glue python shell 作业 Python 库路径上安装 pandas==1.0.3
- javascript - Django rest 框架 PUT 方法与 Postman 一起使用,但不适用于 Javascript FormData
- node.js - Linux AWS 仍在寻找 Node 和 NPM 的卸载版本
- linux - 如何使用 ffplay 和 youtube-dl 在终端中播放 youtube 歌曲
- django - 如何使用当前对象作为变量
- r - ggplot 使用 drc 包的剂量反应曲线