QMake不匹配正则表达式以进行发行版检测

时间:2019-05-31 00:49:08

标签: regex qt 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中的正则表达式语法是否有特殊之处?有什么原因不起作用?

1 个答案:

答案 0 :(得分:0)

对于 RegEx:

这对我有用:

OSDISTRO = $$system(cat /proc/version)
contains(OSDISTRO, .*Ubuntu.*){
  message("Found Ubuntu")
}

注意: 匹配区分大小写。

例如,您可以使用.*[uU]buntu.*来匹配ubuntuUbuntu

说明 为什么您的解决方案不起作用:

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仅搜索值{{1} }。

希望它对您有帮助。