diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index ad99970e9b2..d488646fd96 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -56,6 +56,14 @@ if ("$ENV{CMAKE_EXPORT_COMPILE_COMMANDS}" STREQUAL "1" OR CLANG_TIDY_FOUND) set(CMAKE_EXPORT_COMPILE_COMMANDS 1) endif() +find_package(InferTools) +if ("$ENV{CMAKE_EXPORT_COMPILE_COMMANDS}" STREQUAL "1" OR INFER_FOUND) + # Generate a Clang compile_commands.json "compilation database" file for use + # with various development tools, such as Vim's YouCompleteMe plugin. + # See http://clang.llvm.org/docs/JSONCompilationDatabase.html + set(CMAKE_EXPORT_COMPILE_COMMANDS 1) +endif() + find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_FOUND}) @@ -596,6 +604,19 @@ if (${CLANG_TIDY_FOUND}) endif() +############################################################ +# "make infer" target +############################################################ + +if (${INFER_FOUND}) + # runs infer capture + add_custom_target(infer ${BUILD_SUPPORT_DIR}/run-infer.sh ${INFER_BIN} ${CMAKE_BINARY_DIR}/compile_commands.json 1) + # runs infer analyze + add_custom_target(infer-analyze ${BUILD_SUPPORT_DIR}/run-infer.sh ${INFER_BIN} ${CMAKE_BINARY_DIR}/compile_commands.json 2) + # runs infer report + add_custom_target(infer-report ${BUILD_SUPPORT_DIR}/run-infer.sh ${INFER_BIN} ${CMAKE_BINARY_DIR}/compile_commands.json 3) +endif() + ############################################################ # "make iwyu" target ############################################################ diff --git a/cpp/build-support/run-infer.sh b/cpp/build-support/run-infer.sh new file mode 100755 index 00000000000..823685aef14 --- /dev/null +++ b/cpp/build-support/run-infer.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# Runs infer in the given directory +# Arguments: +# $1 - Path to the infer binary +# $2 - Path to the compile_commands.json to use +# $3 - Apply infer step (1=capture, 2=analyze, 3=report) +# +INFER=$1 +shift +COMPILE_COMMANDS=$1 +shift +APPLY_STEP=$1 +shift + +if [ "$APPLY_STEP" == "1" ]; then + $INFER capture --compilation-database $COMPILE_COMMANDS + echo "" + echo "Run 'make infer-analyze' next." +elif [ "$APPLY_STEP" == "2" ]; then + # infer's analyze step can take a very long time to complete + $INFER analyze + echo "" + echo "Run 'make infer-report' next." + echo "See: http://fbinfer.com/docs/steps-for-ci.html" +elif [ "$APPLY_STEP" == "3" ]; then + $INFER report --issues-csv ./infer-out/report.csv 1> /dev/null + $INFER report --issues-txt ./infer-out/report.txt 1> /dev/null + $INFER report --issues-json ./infer-out/report.json 1> /dev/null + echo "" + echo "Reports (report.txt, report.csv, report.json) can be found in the infer-out subdirectory." +else + echo "" + echo "See: http://fbinfer.com/docs/steps-for-ci.html" +fi diff --git a/cpp/cmake_modules/FindInferTools.cmake b/cpp/cmake_modules/FindInferTools.cmake new file mode 100644 index 00000000000..00c6709c677 --- /dev/null +++ b/cpp/cmake_modules/FindInferTools.cmake @@ -0,0 +1,45 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Tries to find the infer module +# +# Usage of this module as follows: +# +# find_package(InferTools) +# +# Variables used by this module, they can change the default behaviour and need +# to be set before calling find_package: +# +# InferTools_PATH - +# When set, this path is inspected instead of standard library binary locations +# to find infer +# +# This module defines +# INFER_BIN, The path to the clang tidy binary +# INFER_FOUND, Whether clang tidy was found + +find_program(INFER_BIN + NAMES infer + PATHS ${InferTools_PATH} $ENV{INFER_TOOLS_PATH} /usr/local/bin /usr/bin + /usr/local/homebrew/bin + /opt/local/bin + NO_DEFAULT_PATH +) + +if ( "${INFER_BIN}" STREQUAL "INFER_BIN-NOTFOUND" ) + set(INFER_FOUND 0) + message("infer not found") +else() + set(INFER_FOUND 1) + message("infer found at ${INFER_BIN}") +endif()