Приветсвую коллег. Возникла интересная ситуация с вашим файлом для интеграции PVS в cmake.
В файле PVS-Studio.cmake есть функция pvs_studio_add_target(...). У нее есть параметр для формирования своего *.cfg - CFG_TEXT. Мне нужно добавить фильтрацию для обработки файлов через опцию exclude-path. Данный параметр, как я понял, принимает только один путь за раз, но самих опций exclude-path можно задать несколько. Получился вот такой вот вызов:
pvs_studio_add_target(TARGET ${PVS_TARGET} ALL
OUTPUT RECURSIVE FORMAT errorfile
ANALYZE ${SOME_TARGET}
MODE GA:1,2 OP
LOG target.err
CFG_TEXT "exclude-path=*/Path_1/*
exclude-path=*/Path_2/*"
)
При таком вызове сборка таргета с pvs падает с ошибкой следующего вида:
CMakeFiles/pvs_analyze.dir/build.make:281: *** missing separator. Stop.
gmake[2]: *** [CMakeFiles/Makefile2:74: CMakeFiles/pvs_analyze.dir/all] Error 2
gmake[1]: *** [CMakeFiles/Makefile2:87: CMakeFiles/pvs_analyze.dir/rule] Error 2
При чем, эту ошибку при текущей реализации генерации cfg файла никак не обойти, ни экранированием, ни добавлением спецсимволов типа "\n". В тоже время, если перенос строки не делать, то фильтрация не отрабатывает ни на один из заданных путей. Я пробовал следующие способы задания этого параметра:
CFG_TEXT "exclude-path=*/Path_1/* \n exclude-path=*/Path_2/*"
CFG_TEXT "exclude-path=*/Path_1/* \
exclude-path=*/Path_2/*"
CFG_TEXT "\"exclude-path=*/Path_1/*
exclude-path=*/Path_2/*\""
В любом случае получаем либо ошибку, либо не отрабатывает фильтр. Порылся в исходниках вашего cmake файла и нашем корень проблемы (начиная с 379 строки):
if (PVS_STUDIO_EMPTY_CONFIG)
set(PVS_STUDIO_CONFIG_COMMAND "${CMAKE_COMMAND}" -E echo "${PVS_STUDIO_CFG_TEXT}" > "${PVS_STUDIO_CONFIG}")
else ()
set(PVS_STUDIO_CONFIG_COMMAND "${CMAKE_COMMAND}" -E touch "${PVS_STUDIO_CONFIG}")
endif ()
add_custom_command(OUTPUT "${PVS_STUDIO_CONFIG}"
COMMAND ${PVS_STUDIO_CONFIG_COMMAND}
WORKING_DIRECTORY "${BINARY_DIR}"
COMMENT "Generating PVS-Studio.cfg")
Вот здесь и происходить некорректная генерация команды. На выходе cmake выплевывает файл, содержащий строку ввида:
PVS-Studio.cfg:
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=... --progress-num=$(CMAKE_PROGRESS_25) "Generating PVS-Studio.cfg"
.../cmake -E echo exclude-path=*/Path_1/*
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ exclude-path=*/Path_2/* > .../cmake-build-debug-intel/PVS-Studio.cfg
Я смог это починить заменой выше представленного кода строкой вида:
file(GENERATE OUTPUT ${PVS_STUDIO_CONFIG} CONTENT ${PVS_STUDIO_CFG_TEXT})
После чего файл PVS-Studio.cfg стал генерироваться корректно. Это временный фикс, там нужно посерьезней порыться и добавить проверок, но этот вариант рабочий. Одно но - он для более новых версий cmake, кажется начиная с 3.10. Может есть другое решение? Или может я где-то не увидил другой способ задания данного параметра?