##// END OF EJS Templates
Ajout du support clang analyser. L'idée est de recompiler le projet avec ninja dans un build dédié pour effectuer l'analyse statique.
Ajout du support clang analyser. L'idée est de recompiler le projet avec ninja dans un build dédié pour effectuer l'analyse statique.

File last commit:

r2:451739a45362
r11:50964fafb751
Show More
use_vera++.cmake
342 lines | 10.9 KiB | text/x-cmake | CMakeLexer
#
# use_vera++.cmake
#
# The following functions are defined in this document:
# - ADD_VERA_TARGETS
# - ADD_VERA_CHECKSTYLE_TARGET
#
# ADD_VERA_TARGETS(<globExpression> ...
# [ADD_TO_ALL]
# [NAME <name>]
# [NAME_ALL <nameall>]
# [ROOT <directory>]
# [PROFILE <profile>]
# [RECURSE]
# [EXCLUSION <exclusionFile> ...]
# [PARAMETER <name>=<value> ...]
# [PARAMETERFILE <parameterFile> ...])
#
# Two custom targets will be created:
# * style_reports is run as part of the build, and is not rerun unless one of
# the file checked is modified (only created if ADD_TO_ALL is provided);
# * style must be explicitely called (make style) and is rerun even if the files
# to check have not been modified. To achieve this behavior, the commands used
# in this target pretend to produce a file without actually producing it.
# Because the output file is not there after the run, the command will be rerun
# again at the next target build.
# The report style is selected based on the build environment, so the style
# problems are properly reported in the IDEs
#
# If ADD_TO_ALL is provided then a target will be added to the default build
# targets so that each time a source file is compiled, it is analyzed with
# vera++.
#
# NAME and NAME_ALL customize the name of the targets (style and style_reports
# by default respectively).
#
# ROOT set the vera++ root directory, containing the rules and profiles (default
# to the current binary directory).
#
# PROFILE selects the vera++ profile to use (default to "default").
#
# RECURSE selects if the glob expressions should be applied recursively or not.
#
# EXCLUSION list of vera++ exclusion files. Can be used several times.
#
# PARAMETER list of vera++ parameters (name=value). Can be used several times.
#
# PARAMETERFILE list of vera++ parameter files. Can be used several times.
function(add_vera_targets)
# default values
set(target "style")
set(target_all "style_reports")
set(profile "default")
set(root "${CMAKE_CURRENT_BINARY_DIR}")
set(exclusions)
set(parameters)
set(parameterFiles)
set(recurse OFF)
set(addToAll OFF)
set(globs)
# parse the options
math(EXPR lastIdx "${ARGC} - 1")
set(i 0)
while(i LESS ${ARGC})
set(arg "${ARGV${i}}")
if("${arg}" STREQUAL "ADD_TO_ALL")
set(addToAll ON)
elseif("${arg}" STREQUAL "NAME")
vera_incr(i)
set(target "${ARGV${i}}")
elseif("${arg}" STREQUAL "NAME_ALL")
vera_incr(i)
set(target_all "${ARGV${i}}")
elseif("${arg}" STREQUAL "ROOT")
vera_incr(i)
set(root "${ARGV${i}}")
elseif("${arg}" STREQUAL "PROFILE")
vera_incr(i)
set(profile "${ARGV${i}}")
elseif("${arg}" STREQUAL "EXCLUSION")
vera_incr(i)
list(APPEND exclusions --exclusions "${ARGV${i}}")
elseif("${arg}" STREQUAL "RECURSE")
set(recurse ON)
elseif("${arg}" STREQUAL "PARAMETER")
vera_incr(i)
list(APPEND parameters --parameter "${ARGV${i}}")
elseif("${arg}" STREQUAL "PARAMETERFILE")
vera_incr(i)
list(APPEND parameterFiles --parameters "${ARGV${i}}")
else()
list(APPEND globs ${arg})
endif()
vera_incr(i)
endwhile()
if(recurse)
file(GLOB_RECURSE srcs ${globs})
else()
file(GLOB srcs ${globs})
endif()
list(SORT srcs)
if(NOT VERA++_EXECUTABLE AND TARGET vera)
set(vera_program "$<TARGET_FILE:vera>")
else()
set(vera_program "${VERA++_EXECUTABLE}")
endif()
# Two custom targets will be created:
# * style_reports is run as part of the build, and is not rerun unless one of
# the file checked is modified;
# * style must be explicitely called (make style) and is rerun even if the files
# to check have not been modified. To achieve this behavior, the commands used
# in this target pretend to produce a file without actually producing it.
# Because the output file is not there after the run, the command will be rerun
# again at the next target build.
# The report style is selected based on the build environment, so the style
# problems are properly reported in the IDEs
if(MSVC)
set(style vc)
else()
set(style std)
endif()
set(xmlreports)
set(noreports)
set(reportNb 0)
set(reportsrcs)
list(GET srcs 0 first)
get_filename_component(currentDir ${first} PATH)
# add a fake src file in a fake dir to trigger the creation of the last
# custom command
list(APPEND srcs "#12345678900987654321#/0987654321#1234567890")
# Create the directory where the reports will be saved
SET(reportDirectory "${CMAKE_CURRENT_BINARY_DIR}/vera")
FILE(MAKE_DIRECTORY ${reportDirectory})
foreach(s ${srcs})
get_filename_component(d ${s} PATH)
if(NOT "${d}" STREQUAL "${currentDir}")
# this is a new dir - lets generate everything needed for the previous dir
string(LENGTH "${CMAKE_SOURCE_DIR}" len)
string(SUBSTRING "${currentDir}" 0 ${len} pre)
if("${pre}" STREQUAL "${CMAKE_SOURCE_DIR}")
string(SUBSTRING "${currentDir}" ${len} -1 currentDir)
string(REGEX REPLACE "^/" "" currentDir "${currentDir}")
endif()
if("${currentDir}" STREQUAL "")
set(currentDir ".")
endif()
set(xmlreport ${reportDirectory}/vera_report_${reportNb}.xml)
if(addToAll)
add_custom_command(
OUTPUT ${xmlreport}
COMMAND ${vera_program}
--root ${root}
--profile ${profile}
--${style}-report=-
--show-rule
--warning
--xml-report=${xmlreport}
${exclusions}
${parameters}
${parameterFiles}
${reportsrcs}
DEPENDS ${reportsrcs}
COMMENT "Checking style with vera++ in ${currentDir}"
)
endif()
set(noreport ${reportDirectory}/vera_noreport_${reportNb}.xml)
add_custom_command(
OUTPUT ${noreport}
COMMAND ${vera_program}
--root ${root}
--profile ${profile}
--${style}-report=-
--show-rule
--warning
# --xml-report=${noreport}
${exclusions}
${parameters}
${parameterFiles}
${reportsrcs}
DEPENDS ${reportsrcs}
COMMENT "Checking style with vera++ in ${currentDir}"
)
list(APPEND xmlreports ${xmlreport})
list(APPEND noreports ${noreport})
vera_incr(reportNb)
# clear the list for the next dir
set(reportsrcs)
set(currentDir ${d})
endif()
list(APPEND reportsrcs ${s})
endforeach()
# Create the custom targets that will trigger the custom command created
# previously
if(addToAll)
add_custom_target(${target_all} ALL DEPENDS ${xmlreports})
endif()
add_custom_target(${target} DEPENDS ${noreports})
endfunction()
# ADD_VERA_CHECKSTYLE_TARGET(<globExpression> ...
# [NAME <name>]
# [ROOT <directory>]
# [PROFILE <profile>]
# [RECURSE]
# [EXCLUSION <exclusionFile> ...]
# [PARAMETER <name>=<value> ...]
# [PARAMETERFILE <parameterFile> ...])
#
# The checkstyle custom target will be created. This target runs vera++ and
# create checkstyle reports in the ${CMAKE_CURRENT_BINARY_DIR}/checkstyle
# directory.
#
# NAME customize the name of the target (checkstyle by default).
#
# ROOT set the vera++ root directory, containing the rules and profiles (default
# to the current binary directory).
#
# PROFILE selects the vera++ profile to use (default to "default").
#
# RECURSE selects if the glob expressions should be applied recursively or not.
#
# EXCLUSION list of vera++ exclusion files. Can be used several times.
#
# PARAMETER list of vera++ parameters (name=value). Can be used several times.
#
# PARAMETERFILE list of vera++ parameter files. Can be used several times.
function(add_vera_checkstyle_target)
# default values
set(target "checkstyle")
set(profile "default")
set(root "${CMAKE_CURRENT_BINARY_DIR}")
set(exclusions)
set(parameters)
set(parameterFiles)
set(recurse OFF)
set(globs)
# parse the options
math(EXPR lastIdx "${ARGC} - 1")
set(i 0)
while(i LESS ${ARGC})
set(arg "${ARGV${i}}")
if("${arg}" STREQUAL "NAME")
vera_incr(i)
set(target "${ARGV${i}}")
elseif("${arg}" STREQUAL "ROOT")
vera_incr(i)
set(root "${ARGV${i}}")
elseif("${arg}" STREQUAL "PROFILE")
vera_incr(i)
set(profile "${ARGV${i}}")
elseif("${arg}" STREQUAL "EXCLUSION")
vera_incr(i)
list(APPEND exclusions --exclusions "${ARGV${i}}")
elseif("${arg}" STREQUAL "RECURSE")
set(recurse ON)
elseif("${arg}" STREQUAL "PARAMETER")
vera_incr(i)
list(APPEND parameters --parameter "${ARGV${i}}")
elseif("${arg}" STREQUAL "PARAMETERFILE")
vera_incr(i)
list(APPEND parameterFiles --parameters "${ARGV${i}}")
else()
list(APPEND globs ${arg})
endif()
vera_incr(i)
endwhile()
if(recurse)
file(GLOB_RECURSE srcs ${globs})
else()
file(GLOB srcs ${globs})
endif()
list(SORT srcs)
if(NOT VERA++_EXECUTABLE AND TARGET vera)
set(vera_program "$<TARGET_FILE:vera>")
else()
set(vera_program "${VERA++_EXECUTABLE}")
endif()
set(checkstylereports)
set(reportNb 0)
set(reportsrcs)
list(GET srcs 0 first)
get_filename_component(currentDir ${first} PATH)
# add a fake src file in a fake dir to trigger the creation of the last
# custom command
list(APPEND srcs "#12345678900987654321#/0987654321#1234567890")
# Create the directory where the reports will be saved
SET(checkstyleDirectory "${CMAKE_CURRENT_BINARY_DIR}/checkstyle")
FILE(MAKE_DIRECTORY ${checkstyleDirectory})
foreach(s ${srcs})
get_filename_component(d ${s} PATH)
if(NOT "${d}" STREQUAL "${currentDir}")
# this is a new dir - lets generate everything needed for the previous dir
string(LENGTH "${CMAKE_SOURCE_DIR}" len)
string(SUBSTRING "${currentDir}" 0 ${len} pre)
if("${pre}" STREQUAL "${CMAKE_SOURCE_DIR}")
string(SUBSTRING "${currentDir}" ${len} -1 currentDir)
string(REGEX REPLACE "^/" "" currentDir "${currentDir}")
endif()
if("${currentDir}" STREQUAL "")
set(currentDir ".")
endif()
set(checkstylereport ${checkstyleDirectory}/vera_checkstylereport_${reportNb}.xml)
add_custom_command(
OUTPUT ${checkstylereport}
COMMAND ${vera_program}
--root ${root}
--profile ${profile}
--show-rule
--checkstyle-report ${checkstylereport}
${exclusions}
${parameters}
${parameterFiles}
${reportsrcs}
DEPENDS ${reportsrcs}
COMMENT "Checking style with vera++ in ${currentDir}"
)
list(APPEND checkstylereports ${checkstylereport})
vera_incr(reportNb)
# clear the list for the next dir
set(reportsrcs)
set(currentDir ${d})
endif()
list(APPEND reportsrcs ${s})
endforeach()
# Create the custom targets that will trigger the custom command created
# previously
add_custom_target(${target} DEPENDS ${checkstylereports})
endfunction()
macro(vera_incr var_name)
math(EXPR ${var_name} "${${var_name}} + 1")
endmacro()