Тест CMake для функции процессора - PullRequest
1 голос
/ 25 января 2012

Мне интересно, возможно ли для CMake запускать тесты, как можно запустить с помощью скрипта configure.В частности, я хочу проверить, поддерживает ли система, на которой я работаю, инструкцию rdtscp.

Я использую Linux, и если бы я использовал скрипт конфигурации, я мог бы сделать что-то вроде:

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

, что дало бы мне 0, если функция rdtscp отсутствовала или 1 если бы это было.Затем я мог бы использовать это, чтобы определить, стоит ли определять # RDTSCP.Мне интересно, возможно ли сделать что-то подобное с CMake, даже если он не полностью переносим (я работаю только под Linux, я не использую Visual Studio и т. Д.).

Ответы [ 2 ]

3 голосов
/ 25 января 2012
execute_process(COMMAND cat /proc/cpuinfo
    COMMAND head -n 19
    COMMAND tail -1
    COMMAND grep -c rdtscp
    OUTPUT_VARIABLE OUT)
0 голосов
/ 22 февраля 2019

Выбор строки 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 очень быстрый в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...