diff --git a/CMakeLists.txt b/CMakeLists.txt index 47b8262c..7f0ce80a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,16 +15,33 @@ set(CLANG_UML_INSTALL_BIN_DIR ${PROJECT_SOURCE_DIR}/bin) set(UML_HEADERS_DIR ${PROJECT_SOURCE_DIR}/src/uml) -set(LLVM_PREFERRED_VERSION 12.0.0) +option(LLVM_CONFIG_PATH "Path to custom llvm-config executable") + +if(LLVM_CONFIG_PATH) + set(LIBCLANG_LLVM_CONFIG_EXECUTABLE ${LLVM_CONFIG_PATH}) +endif(LLVM_CONFIG_PATH) + +message(STATUS "Checking for fmt...") +find_package(fmt REQUIRED) message(STATUS "Checking for spdlog...") find_package(spdlog REQUIRED) -add_definitions(-DSPDLOG_FMT_EXTERNAL) +if(APPLE) + get_target_property(SPDLOG_INCLUDE_DIRS spdlog::spdlog_header_only INTERFACE_INCLUDE_DIRECTORIES) +else(APPLE) + get_target_property(SPDLOG_INCLUDE_DIRS spdlog::spdlog INTERFACE_INCLUDE_DIRECTORIES) + add_definitions(-DSPDLOG_FMT_EXTERNAL) +endif(APPLE) + message(STATUS "Checking for yaml-cpp...") find_package(yaml-cpp REQUIRED) message(STATUS "Checking for libclang...") +set(LLVM_PREFERRED_VERSION 12.0.0) +# Add +# -DLLVM_CONFIG_PATH=/path/to/llvm-config +# to use custom LLVM version find_package(LibClang REQUIRED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 ${LIBCLANG_CXXFLAGS}") @@ -47,6 +64,7 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") endif() include_directories(${CLANG_UML_INSTALL_INCLUDE_DIR}) include_directories(${YAML_CPP_INCLUDE_DIR}) +include_directories(${SPDLOG_INCLUDE_DIRS}) include_directories(${UML_HEADERS_DIR}) include_directories(${THIRDPARTY_HEADERS_DIR}) include_directories(${THIRDPARTY_HEADERS_DIR}/cppast/include) @@ -62,7 +80,13 @@ add_library(clang-umllib OBJECT ${SOURCES}) add_executable(clang-uml ${MAIN_SOURCE_FILE}) install(TARGETS clang-uml DESTINATION ${CLANG_UML_INSTALL_BIN_DIR}) -target_link_libraries(clang-uml ${LIBCLANG_LIBRARIES} ${YAML_CPP_LIBRARIES} spdlog::spdlog cppast clang-umllib) +target_link_libraries(clang-uml ${LIBCLANG_LIBRARIES} ${YAML_CPP_LIBRARIES} fmt::fmt cppast clang-umllib) +if(APPLE) + target_link_libraries(clang-uml spdlog::spdlog_header_only) +else(APPLE) + target_link_libraries(clang-uml spdlog::spdlog) +endif(APPLE) + target_compile_features(clang-uml PRIVATE cxx_std_17) install( diff --git a/Makefile b/Makefile index 231f3eed..86f84643 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,8 @@ NUMPROC ?= $(shell nproc) +LLVM_CONFIG_PATH ?= + .PHONY: clean clean: rm -rf debug release @@ -29,12 +31,14 @@ clean: debug/CMakeLists.txt: cmake -S . -B debug \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -DCMAKE_BUILD_TYPE=Debug + -DCMAKE_BUILD_TYPE=Debug \ + -DLLVM_CONFIG_PATH=$(LLVM_CONFIG_PATH) release/CMakeLists.txt: cmake -S . -B release \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -DCMAKE_BUILD_TYPE=Release + -DCMAKE_BUILD_TYPE=Release \ + -DLLVM_CONFIG_PATH=$(LLVM_CONFIG_PATH) debug: debug/CMakeLists.txt echo "Using ${NUMPROC} cores" diff --git a/README.md b/README.md index 858cb07b..c343dfb5 100644 --- a/README.md +++ b/README.md @@ -26,10 +26,14 @@ Main features supported so far include: ### Building from source Currently the only method to install `clang-uml` is from source. First make sure -that you have the following dependencies installed (example for Ubuntu): +that you have the following dependencies installed: ```bash +# Ubuntu apt install ccache cmake libyaml-cpp-dev libfmt-dev libspdlog-dev clang-12 libclang-12-dev libclang-cpp12-dev + +# macos +brew install ccache cmake llvm fmt spdlog yaml-cpp ``` Then proceed with building the sources: @@ -42,6 +46,9 @@ make submodules make release release/clang-uml --help +# To build using a specific installed version of LLVM use: +LLVM_CONFIG_PATH=/usr/bin/llvm-config-13 make release + # Optionally make install # or diff --git a/cmake/FindLibClang.cmake b/cmake/FindLibClang.cmake index 670c8616..20d6e153 100644 --- a/cmake/FindLibClang.cmake +++ b/cmake/FindLibClang.cmake @@ -57,13 +57,13 @@ if (NOT LIBCLANG_LLVM_CONFIG_EXECUTABLE) find_program(LIBCLANG_LLVM_CONFIG_EXECUTABLE NAMES llvm-config PATHS "${BREW_LLVM_PATH}/bin") else () set(llvm_config_names llvm-config) - foreach(major RANGE 12 3) + foreach(major RANGE 13 3) list(APPEND llvm_config_names "llvm-config${major}" "llvm-config-${major}") foreach(minor RANGE 9 0) list(APPEND llvm_config_names "llvm-config${major}${minor}" "llvm-config-${major}.${minor}" "llvm-config-mp-${major}.${minor}") endforeach () endforeach () - find_program(LIBCLANG_LLVM_CONFIG_EXECUTABLE NAMES ${llvm_config_names}) + find_program(LIBCLANG_LLVM_CONFIG_EXECUTABLE NAMES ${llvm_config_names} PATHS /usr/bin) endif () endif () if (LIBCLANG_LLVM_CONFIG_EXECUTABLE) diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index 39cc4e61..2ce17a31 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -600,8 +600,10 @@ void translation_unit_visitor::process_field( auto &tr = cx::util::unreferenced(cppast::remove_cv(mv.type())); +#ifndef __APPLE__ LOG_DBG("Processing field {} with unreferenced type of kind {}", mv.name(), tr.kind()); +#endif if (tr.kind() == cppast::cpp_type_kind::builtin_t) { LOG_DBG("Builtin type found for field: {}", m.name()); @@ -1076,8 +1078,10 @@ bool translation_unit_visitor::find_relationships(const cppast::cpp_type &t_, const auto fn = cx::util::full_name(cppast::remove_cv(t_), ctx.entity_index(), false); +#ifndef __APPLE__ LOG_DBG("Finding relationships for type {}, {}, {}", cppast::to_string(t_), t_.kind(), fn); +#endif relationship_t relationship_type = relationship_hint; const auto &t = cppast::remove_cv(cx::util::unreferenced(t_)); diff --git a/src/package_diagram/model/package.h b/src/package_diagram/model/package.h index 451827a4..7f9ac088 100644 --- a/src/package_diagram/model/package.h +++ b/src/package_diagram/model/package.h @@ -31,7 +31,7 @@ namespace clanguml::package_diagram::model { namespace detail { -template class Container, +template class Container, typename Ptr = std::unique_ptr> class package_trait { public: @@ -104,8 +104,9 @@ public: packages_.end(); } - typedef typename Container::iterator iterator; - typedef typename Container::const_iterator const_iterator; + typedef typename Container>::iterator iterator; + typedef typename Container>::const_iterator + const_iterator; inline iterator begin() noexcept { return packages_.begin(); } inline const_iterator cbegin() const noexcept { return packages_.cbegin(); } @@ -113,7 +114,7 @@ public: inline const_iterator cend() const noexcept { return packages_.cend(); } protected: - Container> packages_; + Container> packages_; }; } diff --git a/src/package_diagram/visitor/translation_unit_visitor.cc b/src/package_diagram/visitor/translation_unit_visitor.cc index fe1e3f45..b16cd376 100644 --- a/src/package_diagram/visitor/translation_unit_visitor.cc +++ b/src/package_diagram/visitor/translation_unit_visitor.cc @@ -381,8 +381,10 @@ bool translation_unit_visitor::find_relationships(const cppast::cpp_type &t_, const auto fn_ns = cx::util::ns(cppast::remove_cv(t_), ctx.entity_index()); +#ifndef __APPLE__ LOG_DBG("Finding relationships for type {}, {}, {}", cppast::to_string(t_), t_.kind(), fn); +#endif relationship_t relationship_type = relationship_hint; const auto &t = cppast::remove_cv(cx::util::unreferenced(t_)); diff --git a/tests/t00006/t00006.cc b/tests/t00006/t00006.cc index f1bd5d2e..8018dc67 100644 --- a/tests/t00006/t00006.cc +++ b/tests/t00006/t00006.cc @@ -1,3 +1,4 @@ +#include #include #include diff --git a/tests/t00017/t00017.cc b/tests/t00017/t00017.cc index d10162a4..92464186 100644 --- a/tests/t00017/t00017.cc +++ b/tests/t00017/t00017.cc @@ -1,3 +1,5 @@ +#include + namespace clanguml { namespace t00017 { class A { @@ -34,6 +36,15 @@ class K { }; class R { + explicit R(int &some_int, C &cc, const E &ee, F &&ff, I *&ii) + : some_int_reference{some_int} + , c{cc} + , e{ee} + , f{std::move(ff)} + , i{ii} + { + } + private: int some_int; int *some_int_pointer; @@ -43,7 +54,7 @@ private: B *b; C &c; const D *d; - const E &e{}; + const E &e; F &&f; G **g; H ***h; diff --git a/tests/t00028/t00028.cc b/tests/t00028/t00028.cc index 3a0eb8f2..ca55afb1 100644 --- a/tests/t00028/t00028.cc +++ b/tests/t00028/t00028.cc @@ -39,6 +39,11 @@ enum class F { one, two, three }; /// \uml{note[right] R class note.} class R { + explicit R(C &c) + : ccc(c) + { + } + A aaa; B *bbb;