Выбор строки 19 точно делает эту хрупкость.На моем рабочем столе (Linux 4.20 на i7-6700k) эта строка имеет вид
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 для выхода после первого матча, если вы использовали head/ tail как оптимизация, чтобы избежать обработки большего количества строк в массовых многоядерных системах, таких как Xeon Phi?Он все равно будет читать весь файл, если нет совпадения с rdtscp
, но, вероятно, любая многоядерная система будет иметь RDTSCP.И grep очень быстрый в любом случае.