generate-shapes/cmake/cpplint.cmake
2020-08-19 09:17:10 +03:00

136 lines
4.7 KiB
CMake

#
# CMake module to C++ static analysis against
# Google C++ Style Guide (https://google.github.io/styleguide/cppguide.html)
#
# For more detials please follow links:
#
# - https://github.com/google/styleguide
# - https://pypi.python.org/pypi/cpplint
# - https://github.com/theandrewdavis/cpplint
#
# Copyright (c) 2016 Piotr L. Figlarek
#
# Usage
# -----
# Include this module via CMake include(...) command and then add each source directory
# via introduced by this module cpplint_add_subdirectory(...) function. Added directory
# will be recursivelly scanned and all available files will be checked.
#
# Example
# -------
# # include CMake module
# include(cmake/cpplint.cmake)
#
# # add all source code directories
# cpplint_add_subdirectory(core)
# cpplint_add_subdirectory(modules/c-bind)
#
# License (MIT)
# -------------
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# select files extensions to check
option(CPPLINT_TEST_C_FILES "Check *.c files" ON)
option(CPPLINT_TEST_H_FILES "Check *.h files" ON)
option(CPPLINT_TEST_CPP_FILES "Check *.cpp files" ON)
option(CPPLINT_TEST_HPP_FILES "Check *.hpp files" ON)
option(CPPLINT_TEST_TPP_FILES "Check *.tpp files" ON)
# target to run cpplint.py for all configured sources
set(CPPLINT_TARGET lint CACHE STRING "Name of C++ style checker target")
# project root directory
set(CPPLINT_PROJECT_ROOT "${PROJECT_SOURCE_DIR}" CACHE STRING "Project ROOT directory")
# find cpplint.py script
if(CPPLINT)
message(STATUS "cpplint parser: ${CPPLINT}")
else()
message(FATAL_ERROR "cpplint script: NOT FOUND! "
"Please set the CPPLINT variable.")
endif()
# common target to concatenate all cpplint.py targets
add_custom_target(${CPPLINT_TARGET} ALL)
# use cpplint.py to check source code files inside DIR directory
function(cpplint_add_subdirectory DIR)
# create relative path to the directory
set(ABSOLUTE_DIR ${CMAKE_CURRENT_LIST_DIR}/${DIR})
# add *.c files
if(CPPLINT_TEST_C_FILES)
set(EXTENSIONS ${EXTENSIONS}c,)
set(FILES_TO_CHECK ${FILES_TO_CHECK} ${ABSOLUTE_DIR}/*.c)
endif()
# add *.h files
if(CPPLINT_TEST_H_FILES)
set(EXTENSIONS ${EXTENSIONS}h,)
set(FILES_TO_CHECK ${FILES_TO_CHECK} ${ABSOLUTE_DIR}/*.h)
endif()
# add *.cpp files
if(CPPLINT_TEST_CPP_FILES)
set(EXTENSIONS ${EXTENSIONS}cpp,)
set(FILES_TO_CHECK ${FILES_TO_CHECK} ${ABSOLUTE_DIR}/*.cpp)
endif()
# add *.hpp files
if(CPPLINT_TEST_HPP_FILES)
set(EXTENSIONS ${EXTENSIONS}hpp,)
set(FILES_TO_CHECK ${FILES_TO_CHECK} ${ABSOLUTE_DIR}/*.hpp)
endif()
# add *.tpp files
if(CPPLINT_TEST_TPP_FILES)
set(EXTENSIONS ${EXTENSIONS}tpp,)
set(FILES_TO_CHECK ${FILES_TO_CHECK} ${ABSOLUTE_DIR}/*.tpp)
endif()
# find all source files inside project
file(GLOB_RECURSE LIST_OF_FILES ${FILES_TO_CHECK})
# create valid target name for this check
string(REGEX REPLACE "/" "." TEST_NAME ${DIR})
set(TARGET_NAME ${CPPLINT_TARGET}.${TEST_NAME})
# perform cpplint check
add_custom_target(${TARGET_NAME}
COMMAND ${CPPLINT} "--extensions=${EXTENSIONS}"
"--root=${CPPLINT_PROJECT_ROOT}"
"--quiet"
"--linelength=120"
"--filter=-build/header_guard, -runtime/references, -whitespace/indent"
${LIST_OF_FILES}
DEPENDS ${LIST_OF_FILES}
COMMENT "cpplint: Checking source code style"
)
# run this target when root cpplint.py test is triggered
add_dependencies(${CPPLINT_TARGET} ${TARGET_NAME})
# add this test to CTest
add_test(${TARGET_NAME} ${CMAKE_MAKE_PROGRAM} ${TARGET_NAME})
endfunction()