From 9f502108bfb056575bfc49d60ffc5c7aed05728e Mon Sep 17 00:00:00 2001 From: mj-xmr Date: Sun, 1 Nov 2020 09:36:10 +0100 Subject: [PATCH] Add ClangBuildAnalyzer under utils/health for analyzing build times --- .gitignore | 1 + CMakeLists.txt | 7 ++ utils/health/README.md | 34 +++++++++ .../clang-build-time-analyzer-clone-build.sh | 54 +++++++++++++ utils/health/clang-build-time-analyzer-run.sh | 75 +++++++++++++++++++ 5 files changed, 171 insertions(+) create mode 100644 utils/health/README.md create mode 100755 utils/health/build-scripts/clang-build-time-analyzer-clone-build.sh create mode 100755 utils/health/clang-build-time-analyzer-run.sh diff --git a/.gitignore b/.gitignore index 08c310e66..049fc2562 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ cscope.po.out external/miniupnpc/Makefile miniupnpcstrings.h version/ +ClangBuildAnalyzerSession.txt # Created by https://www.gitignore.io ### C++ ### diff --git a/CMakeLists.txt b/CMakeLists.txt index 050269218..c09b9b39a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,6 +54,13 @@ if (USE_CCACHE) else() message(STATUS "ccache deselected") endif() +option (USE_COMPILATION_TIME_PROFILER "Use compilation time profiler (for CLang >= 9 only)" OFF) +if (USE_COMPILATION_TIME_PROFILER) + if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") + message(FATAL_ERROR "The flag USE_COMPILATION_TIME_PROFILER is meant to be set only for CLang compiler!") + endif() + add_compile_options("-ftime-trace") +endif() if (${CMAKE_VERSION} VERSION_GREATER "3.0.0" AND CMAKE_MAKE_PROGRAM MATCHES "ninja") set(MONERO_PARALLEL_COMPILE_JOBS "" CACHE STRING "The maximum number of concurrent compilation jobs.") diff --git a/utils/health/README.md b/utils/health/README.md new file mode 100644 index 000000000..dea46280e --- /dev/null +++ b/utils/health/README.md @@ -0,0 +1,34 @@ +#Intro +This directory contains tools, which can be used for checking the health of the project, like build/run time analyzers, lints, etc. + +#Usage +Unless it's stated differently, these scripts should be called from a given source directory, where you want the checks to be performed, for instance: + +`og@ghetto:~/dev/monero$ utils/health/clang-build-time-analyzer-run.sh` + +##ClangBuildAnalyzer +`utils/health/clang-build-time-analyzer-run.sh` +The CBA helps in finding culprints of slow compilation. +On the first run, the script will complain about the missing ClangBuildAnalyzer binary and will point you to another script, which is able to clone and build the required binary. + +##clang-tidy +`utils/health/clang-tidy-run.sh` +Performs Lint checks on the source code and stores the result in the build directory. More information on the [home page](https://clang.llvm.org/extra/clang-tidy/). + + +##Valgrind checks +`utils/health/valgrind-tests.sh` +This script is able to run valgrind's callgrind, cachegrind and memcheck for a given set of executables. +It expects ONE PARAMETER, which points to a file with paths to executables and their arguments, written line by line. For example: + +``` +ls -l -h +build/tests/unit_tests/unit_tests +``` + +The `*.out` results can be interpreted with the `kcachegrind` tool. +The memcheck output is just a readable text file with a summary at the end. + +#Footer +Responsible: mj-xmr + diff --git a/utils/health/build-scripts/clang-build-time-analyzer-clone-build.sh b/utils/health/build-scripts/clang-build-time-analyzer-clone-build.sh new file mode 100755 index 000000000..de5f35a38 --- /dev/null +++ b/utils/health/build-scripts/clang-build-time-analyzer-clone-build.sh @@ -0,0 +1,54 @@ +#!/bin/bash -e + +# Copyright (c) 2014-2020, The Monero Project +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are +# permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other +# materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be +# used to endorse or promote products derived from this software without specific +# prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This script checkouts and builds ClangBuildAnalyzer. +# The result is put into bin directory + +DIR_THIS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +TAG="v1.2.0" +PROG="ClangBuildAnalyzer" +DIR_OUT="$DIR_THIS/../bin" +DIR_BUILD="build" + +mkdir -p "$DIR_BUILD" && cd "$DIR_BUILD" +if [ ! -d "$PROG" ]; then + git clone https://github.com/aras-p/$PROG.git +fi +cd "$PROG" +git checkout "$TAG" +mkdir -p build && cd build +cmake .. +make -j`nproc` + +mkdir -p "$DIR_OUT" +cp -v "$PROG" "$DIR_OUT" +make clean # Clean the used space + diff --git a/utils/health/clang-build-time-analyzer-run.sh b/utils/health/clang-build-time-analyzer-run.sh new file mode 100755 index 000000000..fb7eeaced --- /dev/null +++ b/utils/health/clang-build-time-analyzer-run.sh @@ -0,0 +1,75 @@ +#!/bin/bash -e + +# Copyright (c) 2014-2020, The Monero Project +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, are +# permitted provided that the following conditions are met: +# +# 1. Redistributions of source code must retain the above copyright notice, this list of +# conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright notice, this list +# of conditions and the following disclaimer in the documentation and/or other +# materials provided with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its contributors may be +# used to endorse or promote products derived from this software without specific +# prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +# THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# ClangBuildAnalyzer is able to analyze the aggregate build time of particular headers. + +DIR_THIS="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +# Build variables +PROG="ClangBuildAnalyzer" +PROG_PATH="$DIR_THIS/bin/$PROG" +DIR_BUILD="build/clang-build-analyser" + +# ClangBuildAnalyzer variables +DIR_MONITORED="." +RESULT="cba-result.txt" +TRACE="cba-trace.txt" + +if [ -f "$PROG_PATH" ]; then + echo "Found: $PROG_PATH" +else + echo "Couldn't find: $PROG_PATH" + echo "Please run the below script to clone and build $PROG:" + echo "$DIR_THIS/build-scripts/clang-build-time-analyzer-clone-build.sh" + exit 1 +fi + +mkdir -p "$DIR_BUILD" && cd "$DIR_BUILD" + +cmake ../.. \ +-DCMAKE_C_COMPILER=clang \ +-DCMAKE_CXX_COMPILER=clang++ \ +-DUSE_CCACHE=OFF \ +-DUSE_COMPILATION_TIME_PROFILER=ON \ +-DBUILD_SHARED_LIBS=ON \ +-DBUILD_TESTS=ON + +make clean # Clean up, so that the trace can be regenerated from scratch +$PROG_PATH --start $DIR_MONITORED # Start monitoring +time make # Build +#time make easylogging # Quick testing: build a single target +$PROG_PATH --stop $DIR_MONITORED $TRACE # Stop and output to trace file +$PROG_PATH --analyze $TRACE | tee $RESULT # Analyze the trace, and store it in a readable format +gzip -f $TRACE # Zip the trace, because it's huge. -f overwrites the previously generated trace + +echo "" +echo "Readable result stored in: $DIR_BUILD/$RESULT" +echo "The trace (analyser's input data) in: $DIR_BUILD/$TRACE.gz" +