diff --git a/.gitignore b/.gitignore index a5309e6..70fb602 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ build*/ +*.pyc diff --git a/.travis.yml b/.travis.yml index 5cc31c4..a5d4775 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ install: - CMAKE_URL="http://www.cmake.org/files/v3.3/cmake-3.3.2-Linux-x86_64.tar.gz" - mkdir cmake && travis_retry wget --no-check-certificate --quiet -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C cmake - export PATH=${DEPS_DIR}/cmake/bin:${PATH} + - pip install --user conan && export PATH=$PATH:$HOME/.local/bin - cd ${TRAVIS_BUILD_DIR} - mkdir build && cd build - cmake .. -DBACKWARD_TESTS=ON @@ -21,3 +22,4 @@ install: script: - valgrind ctest .. --verbose + - cd ${TRAVIS_BUILD_DIR} && conan test_package --build=outdated diff --git a/CMakeLists.txt b/CMakeLists.txt index a5d672a..bf6aa6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,18 @@ set(BACKWARD_ENABLE $ CACHE STRING "Link with this object to setup backward automatically") +############################################################################### +# BACKWARD LIBRARY (Includes backward.cpp) +############################################################################### +option(BACKWARD_SHARED "Build dynamic backward-cpp shared lib" OFF) + +if(BACKWARD_SHARED) + set(libtype SHARED) +endif() +add_library(backward ${libtype} backward.cpp) +target_compile_definitions(backward PUBLIC ${BACKWARD_DEFINITIONS}) +target_include_directories(backward PUBLIC ${BACKWARD_INCLUDE_DIRS}) + ############################################################################### # TESTS ############################################################################### diff --git a/README.md b/README.md index a217566..d5b2dd1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Backward-cpp +Backward-cpp [![badge](https://img.shields.io/badge/conan.io-backward%2F0.0.0-green.svg?logo=data:image/png;base64%2CiVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAA1VBMVEUAAABhlctjlstkl8tlmMtlmMxlmcxmmcxnmsxpnMxpnM1qnc1sn85voM91oM11oc1xotB2oc56pNF6pNJ2ptJ8ptJ8ptN9ptN8p9N5qNJ9p9N9p9R8qtOBqdSAqtOAqtR%2BrNSCrNJ/rdWDrNWCsNWCsNaJs9eLs9iRvNuVvdyVv9yXwd2Zwt6axN6dxt%2Bfx%2BChyeGiyuGjyuCjyuGly%2BGlzOKmzOGozuKoz%2BKqz%2BOq0OOv1OWw1OWw1eWx1eWy1uay1%2Baz1%2Baz1%2Bez2Oe02Oe12ee22ujUGwH3AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfgBQkREyOxFIh/AAAAiklEQVQI12NgAAMbOwY4sLZ2NtQ1coVKWNvoc/Eq8XDr2wB5Ig62ekza9vaOqpK2TpoMzOxaFtwqZua2Bm4makIM7OzMAjoaCqYuxooSUqJALjs7o4yVpbowvzSUy87KqSwmxQfnsrPISyFzWeWAXCkpMaBVIC4bmCsOdgiUKwh3JojLgAQ4ZCE0AMm2D29tZwe6AAAAAElFTkSuQmCC)](http://www.conan.io/source/backward/0.0.0/Manu343726/testing) [![Build Status](https://travis-ci.org/Manu343726/backward-cpp.svg?branch=master)](https://travis-ci.org/Manu343726/backward-cpp) ============ Backward is a beautiful stack trace pretty printer for C++. diff --git a/conanfile.py b/conanfile.py new file mode 100644 index 0000000..8dc6c0f --- /dev/null +++ b/conanfile.py @@ -0,0 +1,57 @@ +from conans import ConanFile, CMake +import os + +class BackwardCpp(ConanFile): + settings = 'os', 'compiler', 'build_type', 'arch' + name = 'backward' + url = 'https:77github.com/Manu343726/backward-cpp' + license = 'MIT' + version = '0.0.0' + options = { + 'stack_walking_unwind': [True, False], + 'stack_walking_backtrace': [True, False], + 'stack_details_auto_detect': [True, False], + 'stack_details_backtrace_symbol': [True, False], + 'stack_details_dw': [True, False], + 'stack_details_bfd': [True, False], + 'shared': [True, False] + } + default_options = ( + 'stack_walking_unwind=True', + 'stack_walking_backtrace=False', + 'stack_details_auto_detect=True', + 'stack_details_backtrace_symbol=False', + 'stack_details_dw=False', + 'stack_details_bfd=False', + 'shared=False' + ) + exports = 'backward.cpp', 'backward.hpp', 'test/*', 'CMakeLists.txt', 'BackwardConfig.cmake' + generators = 'cmake' + + def cmake_option(self, option, prefix = ''): + return '-D{}{}={}'.format(prefix, option.upper(), self.options[option]) + + def build(self): + cmake = CMake(self.settings) + + options = '' + options += self.cmake_option('stack_walking_unwind') + options += self.cmake_option('stack_walking_backtrace') + options += self.cmake_option('stack_details_auto_detect') + options += self.cmake_option('stack_details_backtrace_symbol') + options += self.cmake_option('stack_details_dw') + options += self.cmake_option('stack_details_bfd') + options += self.cmake_option('shared', prefix = 'BACKWARD_') + + self.run('cmake {} {} {} -DBACKWARD_TESTS=OFF'.format(self.conanfile_directory, cmake.command_line, options)) + self.run('cmake --build . {}'.format(cmake.build_config)) + + def package(self): + self.copy('backward.hpp', os.path.join('include', 'backward')) + self.copy('*.a', dst='lib') + self.copy('*.so', dst='lib') + self.copy('*.lib', dst='lib') + self.copy('*.dll', dst='lib') + + def package_info(self): + self.cpp_info.libs = ['backward'] diff --git a/test_package/CMakeLists.txt b/test_package/CMakeLists.txt new file mode 100644 index 0000000..ca7e1a4 --- /dev/null +++ b/test_package/CMakeLists.txt @@ -0,0 +1,11 @@ +project(backward-package-test) +cmake_minimum_required(VERSION 2.8) + +include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake) +include(${CONAN_CMAKE-UTILS_ROOT}/conan.cmake) +conan_basic_setup() + +add_conan_library(backward) + +add_executable(example main.cpp) +target_link_libraries(example PRIVATE backward-conan) diff --git a/test_package/conanfile.py b/test_package/conanfile.py new file mode 100644 index 0000000..2e33cd7 --- /dev/null +++ b/test_package/conanfile.py @@ -0,0 +1,15 @@ +from conans import ConanFile, CMake +import os + +class TestBackward(ConanFile): + settings = 'os', 'compiler', 'build_type', 'arch' + requires = 'cmake-utils/0.0.0@Manu343726/testing', 'backward/0.0.0@Manu343726/testing' + generators = 'cmake' + + def build(self): + cmake = CMake(self.settings) + self.run('cmake {} {}'.format(self.conanfile_directory, cmake.command_line)) + self.run('cmake --build . {}'.format(cmake.build_config)) + + def test(self): + self.run(os.path.join('.', 'bin', 'example')) diff --git a/test_package/main.cpp b/test_package/main.cpp new file mode 100644 index 0000000..aa3cd11 --- /dev/null +++ b/test_package/main.cpp @@ -0,0 +1,60 @@ +#include +#include +#include +#include + +using namespace backward; + +class TracedException : public std::runtime_error +{ +public: + TracedException() : + std::runtime_error(_get_trace()) + {} + +private: + std::string _get_trace() + { + std::ostringstream ss; + + StackTrace stackTrace; + TraceResolver resolver; + stackTrace.load_here(); + resolver.load_stacktrace(stackTrace); + + for(std::size_t i = 0; i < stackTrace.size(); ++i) + { + const ResolvedTrace trace = resolver.resolve(stackTrace[i]); + + ss << "#" << i << " at " << trace.object_function << "\n"; + } + + return ss.str(); + } +}; + +void f(int i) +{ + if(i >= 42) + { + throw TracedException(); + } + else + { + std::cout << "i=" << i << "\n"; + f(i + 1); + } +} + +int main() +{ + try + { + f(0); + } catch (const TracedException& ex) + { + std::cout << ex.what(); + } +} + +