use_vera++.cmake
342 lines
| 10.9 KiB
| text/x-cmake
|
CMakeLexer
r2 | # | |||
# 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() | ||||