aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--CMakeLists.txt7
-rw-r--r--utils/health/README.md34
-rwxr-xr-xutils/health/build-scripts/clang-build-time-analyzer-clone-build.sh54
-rwxr-xr-xutils/health/clang-build-time-analyzer-run.sh75
5 files changed, 171 insertions, 0 deletions
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"
+