我想知道CMake是否可以运行测试,例如可能使用configure脚本运行。具体来说,我想测试我正在编译的系统是否支持rdtscp指令。
我正在使用Linux,如果我使用的是配置脚本,我可以执行以下操作:
cat /proc/cpuinfo | head -n 19 | tail -1 | grep -c rdtscp
如果rdtscp功能不存在,则会给我0
;如果存在,则为1
。然后,我可以使用它来确定是否#define RDTSCP。我想知道是否可以用CMake做类似的事情,即使它不是完全可移植的(我只在Linux下运行,我不使用Visual Studio等)。
答案 0 :(得分:0)
选择第19行正好使它变脆。在我的台式机(i7-6700k上为Linux 4.20)上,该行是
wp : yes
代替使用grep
的模式匹配功能来检查flags\t\t:
行。
grep -l '^flags[[:space:]]*:.*rdtscp' /proc/cpuinfo
打印文件名,并在第一个匹配项后成功退出。或不打印任何内容,如果找不到匹配项,则显示失败状态。
我不了解CMake,但根据您可能会使用的其他答案
execute_process(COMMAND grep -l '^flags[[:space:]]*:.*rdtscp' /proc/cpuinfo
OUTPUT_VARIABLE OUT)
更简单的版本是grep -l rdtscp /proc/cpuinfo
,但是在flags :
行中要求匹配将防止任何可能的假阳性。 (要成为更多的腰带悬挂者,您可能需要在空格之前或之后加空格或行尾,也许使用PCREgrep进行零宽度声明。如果将来有某些功能标记,例如XYZrdtscpABC
,而没有RDTSCP,可能会出现支持将成为将来的事情。或者像broken_rdtscp
)。或者我们可以假设rdtscp
永远不在行的末尾,然后寻找^flags.*:.* rdtscp
。
如果您使用头/尾作为优化以避免在大型多核系统(例如至强融核)上处理更多的行,使用-l
会使grep在第一场比赛后退出。如果rdtscp
不匹配,它将仍然读取整个文件,但是可能任何大型多核系统都将具有RDTSCP。而且grep还是非常很快。