CMake测试处理器功能

时间:2012-01-24 21:14:34

标签: linux cmake

我想知道CMake是否可以运行测试,例如可能使用configure脚本运行。具体来说,我想测试我正在编译的系统是否支持rdtscp指令。

我正在使用Linux,如果我使用的是配置脚本,我可以执行以下操作:

cat /proc/cpuinfo | head -n 19 | tail -1 | grep -c rdtscp

如果rdtscp功能不存在,则会给我0;如果存在,则为1。然后,我可以使用它来确定是否#define RDTSCP。我想知道是否可以用CMake做类似的事情,即使它不是完全可移植的(我只在Linux下运行,我不使用Visual Studio等)。

1 个答案:

答案 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还是非常很快。