From 8e73db6ccd9b5b844af61807ed34470182170886 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Fri, 11 Feb 2022 22:51:55 +0100 Subject: [PATCH 1/5] Fixed building on macos --- CMakeLists.txt | 3 ++- src/class_diagram/visitor/translation_unit_visitor.cc | 4 ++++ src/package_diagram/model/package.h | 9 +++++---- src/package_diagram/visitor/translation_unit_visitor.cc | 2 ++ tests/t00006/t00006.cc | 1 + tests/t00028/t00028.cc | 5 +++++ 6 files changed, 19 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 47b8262c..bb7c2bbd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ set(LLVM_PREFERRED_VERSION 12.0.0) message(STATUS "Checking for spdlog...") find_package(spdlog REQUIRED) -add_definitions(-DSPDLOG_FMT_EXTERNAL) +get_target_property(SPDLOG_INCLUDE_DIRS spdlog::spdlog INTERFACE_INCLUDE_DIRECTORIES) message(STATUS "Checking for yaml-cpp...") find_package(yaml-cpp REQUIRED) @@ -47,6 +47,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) 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/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; From b11396cbf3569b7d76585c6ce9c60ac5aee029e4 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 12 Feb 2022 18:55:42 +0100 Subject: [PATCH 2/5] Fixed building with clang --- CMakeLists.txt | 8 +++++--- Makefile | 2 +- tests/t00017/t00017.cc | 13 ++++++++++++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb7c2bbd..566a3895 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,16 +15,18 @@ 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) message(STATUS "Checking for spdlog...") find_package(spdlog REQUIRED) -get_target_property(SPDLOG_INCLUDE_DIRS spdlog::spdlog INTERFACE_INCLUDE_DIRECTORIES) +get_target_property(SPDLOG_INCLUDE_DIRS spdlog::spdlog_header_only INTERFACE_INCLUDE_DIRECTORIES) +add_definitions(-DSPDLOG_FMT_EXTERNAL) message(STATUS "Checking for yaml-cpp...") find_package(yaml-cpp REQUIRED) message(STATUS "Checking for libclang...") +set(LLVM_PREFERRED_VERSION 12.0.0) +set(LIBCLANG_LLVM_CONFIG_EXECUTABLE "/usr/local/opt/llvm@12/bin/llvm-config") find_package(LibClang REQUIRED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 ${LIBCLANG_CXXFLAGS}") @@ -63,7 +65,7 @@ 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} spdlog::spdlog_header_only cppast clang-umllib) target_compile_features(clang-uml PRIVATE cxx_std_17) install( diff --git a/Makefile b/Makefile index 231f3eed..2960c91f 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ release/CMakeLists.txt: debug: debug/CMakeLists.txt echo "Using ${NUMPROC} cores" - make -C debug -j$(NUMPROC) + make -C debug -j$(NUMPROC) VERBOSE=1 release: release/CMakeLists.txt make -C release -j 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; From 47554060f4dd9ab2929d5549f160cb6449ec46fb Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 12 Feb 2022 19:08:07 +0100 Subject: [PATCH 3/5] Added CMake option to build using specific llvm version --- CMakeLists.txt | 27 ++++++++++++++++++++++++--- Makefile | 10 +++++++--- README.md | 3 +++ cmake/FindLibClang.cmake | 4 ++-- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 566a3895..e231e608 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,10 +15,23 @@ set(CLANG_UML_INSTALL_BIN_DIR ${PROJECT_SOURCE_DIR}/bin) set(UML_HEADERS_DIR ${PROJECT_SOURCE_DIR}/src/uml) +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) -get_target_property(SPDLOG_INCLUDE_DIRS spdlog::spdlog_header_only INTERFACE_INCLUDE_DIRECTORIES) +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) +endif(APPLE) + add_definitions(-DSPDLOG_FMT_EXTERNAL) message(STATUS "Checking for yaml-cpp...") @@ -26,7 +39,9 @@ find_package(yaml-cpp REQUIRED) message(STATUS "Checking for libclang...") set(LLVM_PREFERRED_VERSION 12.0.0) -set(LIBCLANG_LLVM_CONFIG_EXECUTABLE "/usr/local/opt/llvm@12/bin/llvm-config") +# 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}") @@ -65,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_header_only 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 2960c91f..86f84643 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,8 @@ NUMPROC ?= $(shell nproc) +LLVM_CONFIG_PATH ?= + .PHONY: clean clean: rm -rf debug release @@ -29,16 +31,18 @@ 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" - make -C debug -j$(NUMPROC) VERBOSE=1 + make -C debug -j$(NUMPROC) release: release/CMakeLists.txt make -C release -j diff --git a/README.md b/README.md index 858cb07b..24ec4634 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,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) From fb392cb32b214cd295b81e5aa7d759d708aafccb Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 13 Feb 2022 00:17:05 +0100 Subject: [PATCH 4/5] Disable SPDLOG_FMT_EXTERNAL cmake setting on macos --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e231e608..7f0ce80a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,9 +30,9 @@ 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) -add_definitions(-DSPDLOG_FMT_EXTERNAL) message(STATUS "Checking for yaml-cpp...") find_package(yaml-cpp REQUIRED) From 0f068ec8fbbfd560e3da2118f2dbef23952d6b99 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 13 Feb 2022 00:19:55 +0100 Subject: [PATCH 5/5] Updated README --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 24ec4634..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: