From b0612796b1fde0532c06744f23f8ee59eee156c2 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 28 Sep 2023 12:01:53 -0400 Subject: cmDebugTools: add header This provides a utility macro which prints out: - location of the call; - the expression being evaluated; and - the value of the expression. Evaluates to the value of the expression. Inspired by Rust's `dbg!` macro. See: https://doc.rust-lang.org/stable/std/macro.dbg.html --- Source/cmDebugTools.h | 23 +++++++++++++++++++++++ Tests/CMakeLib/CMakeLists.txt | 1 + Tests/CMakeLib/testDebug.cxx | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 Source/cmDebugTools.h create mode 100644 Tests/CMakeLib/testDebug.cxx diff --git a/Source/cmDebugTools.h b/Source/cmDebugTools.h new file mode 100644 index 0000000..99c0c6b --- /dev/null +++ b/Source/cmDebugTools.h @@ -0,0 +1,23 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#pragma once + +#include + +#define CM_DBG(expr) cm::dbg_impl(__FILE__, __LINE__, #expr, expr) + +namespace cm { + +namespace { + +template +T dbg_impl(const char* fname, int line, const char* expr, T value) +{ + std::cerr << fname << ':' << line << ": " << expr << " = " << value + << std::endl; + return value; +} + +} // namespace + +} // namespace cm diff --git a/Tests/CMakeLib/CMakeLists.txt b/Tests/CMakeLib/CMakeLists.txt index 225a1e7..b44c8dd 100644 --- a/Tests/CMakeLib/CMakeLists.txt +++ b/Tests/CMakeLib/CMakeLists.txt @@ -11,6 +11,7 @@ set(CMakeLib_TESTS testCTestResourceAllocator.cxx testCTestResourceSpec.cxx testCTestResourceGroups.cxx + testDebug.cxx testGccDepfileReader.cxx testGeneratedFileStream.cxx testJSONHelpers.cxx diff --git a/Tests/CMakeLib/testDebug.cxx b/Tests/CMakeLib/testDebug.cxx new file mode 100644 index 0000000..657ef50 --- /dev/null +++ b/Tests/CMakeLib/testDebug.cxx @@ -0,0 +1,33 @@ +#include +#include + +#include "cmDebugTools.h" + +#define check(expr, value) \ + do { \ + if (expr != value) { \ + std::cerr << "Failed to return " #value " for " #expr << std::endl; \ + retval = 1; \ + } \ + } while (false) + +int testDebug(int argc, char** const /*argv*/) +{ + if (argc != 1) { + std::cout << "Invalid arguments.\n"; + return -1; + } + + int retval = 0; + check(CM_DBG(true), true); + check(CM_DBG(4), 4); + check(CM_DBG(1.), 1.); + check(CM_DBG('c'), 'c'); + check(CM_DBG("literal string"), std::string("literal string")); + + std::string str = "std string"; + check(CM_DBG(str), "std string"); + check(CM_DBG(str.empty()), false); + + return retval; +} -- cgit v0.12