diff options
author | Ben Boeckel <ben.boeckel@kitware.com> | 2023-09-28 16:01:53 (GMT) |
---|---|---|
committer | Ben Boeckel <ben.boeckel@kitware.com> | 2023-10-01 10:52:44 (GMT) |
commit | b0612796b1fde0532c06744f23f8ee59eee156c2 (patch) | |
tree | f4db388d397dfcff2b11ad265df03da515425ec2 | |
parent | 92adbb5d8c2a043c6e6c8539e9817a75a813fa1b (diff) | |
download | CMake-b0612796b1fde0532c06744f23f8ee59eee156c2.zip CMake-b0612796b1fde0532c06744f23f8ee59eee156c2.tar.gz CMake-b0612796b1fde0532c06744f23f8ee59eee156c2.tar.bz2 |
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
-rw-r--r-- | Source/cmDebugTools.h | 23 | ||||
-rw-r--r-- | Tests/CMakeLib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | Tests/CMakeLib/testDebug.cxx | 33 |
3 files changed, 57 insertions, 0 deletions
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 <iostream> + +#define CM_DBG(expr) cm::dbg_impl(__FILE__, __LINE__, #expr, expr) + +namespace cm { + +namespace { + +template <typename T> +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 <iostream> +#include <string> + +#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; +} |