我在Windows上有一个cmake项目,该项目使用JOM
作为生成器,使用MSVC 19
作为编译器。现在,我正在尝试向该项目中的某些目标添加clang-tidy
检查。这是启用clang-tidy的代码的一部分:
if ( CLANG_TIDY_EXE )
set( _clang_tidy_checkable_headers_abs_path_list ${_tgt_cmn_ct_PUBLIC_INCLUDE_ABS_PATH_LIST} )
list( APPEND _clang_tidy_checkable_headers_abs_path_list ${_tgt_cmn_ct_PRIVATE_INCLUDE_ABS_PATH_LIST} )
#Don't check autogenerated headers
list( FILTER _clang_tidy_checkable_headers_abs_path_list EXCLUDE REGEX "generated/.+" )
#Clang-tidy is looking for just the header names!
foreach ( path IN ITEMS ${_clang_tidy_checkable_headers_abs_path_list} )
get_filename_component( FILE_NAME ${path} NAME )
list( APPEND HEADERS ${FILE_NAME} )
endforeach ()
#Create a regex containing headers name
set( HEADER_FILTER_REGEX "" )
string( JOIN "|" HEADER_FILTER_REGEX ${HEADERS} )
string( REPLACE "."
"\\." HEADER_FILTER_REGEX
${HEADER_FILTER_REGEX} )
string( PREPEND HEADER_FILTER_REGEX "(" )
string( APPEND HEADER_FILTER_REGEX ")" )
#--extra-arg=/EHsc is to get rid of the `clang-diagnostic-error` warning on Windows regarding disabled exceptions!
set_target_properties(
${IN_TARGET_NAME} PROPERTIES
CXX_CLANG_TIDY "${DO_CLANG_TIDY};--header-filter=${HEADER_FILTER_REGEX};-p=${CMAKE_BINARY_DIR}/compile_commands.json;--extra-arg=/EHsc"
)
在上面的代码中,我基本上从私有和公共标头中创建了一个正则表达式,我将通过clang-tidy检查该正则表达式并将其传递给--header-filter
参数。您还可以看到,我也提供了compile_commands.json
文件的路径。但是一旦建立启用了clang_tidy的目标,就会出现以下错误:
error: 'project_x/common/loggerWrapper/loggerWrapper.hpp' file not found [clang-diagnostic-error]
请注意,这个loggerWrapper.hpp
实际上是我在正则表达式中列出的文件之一。
这里有趣的一点是,以上解决方案与Ninja
完美搭配,但与JOM
完美搭配。
任何想法可能是什么问题?