2018-06-09 15:14:08 +00:00
|
|
|
#
|
|
|
|
# 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}"
|
2020-08-19 06:17:10 +00:00
|
|
|
"--quiet"
|
|
|
|
"--linelength=120"
|
|
|
|
"--filter=-build/header_guard, -runtime/references, -whitespace/indent"
|
2018-06-09 15:14:08 +00:00
|
|
|
${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()
|