##// END OF EJS Templates
Fixes slowness when opening variable
Fixes slowness when opening variable

File last commit:

r2:451739a45362
r768:46391f71d5a3
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()