diff --git a/CMakeLists.txt b/CMakeLists.txt index 5eb5050e..ee6ebfce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,7 @@ cmake_minimum_required(VERSION 2.8.9) include(cmake/add_files.cmake) include(cmake/create_source_groups.cmake) + # Variables -------------------------------------------------------------------- set(PROJECT_NAME masterproject) @@ -16,22 +17,14 @@ if (WIN32) LINK_DIRECTORIES($ENV{VLD_DIR}/lib/Win32) # this adds the library path for VLD, must be done before the project target is created endif() + # Settings --------------------------------------------------------------------- - - - - - set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) if (UNIX) - - ADD_DEFINITIONS( - -std=c++11 # Or -std=c++0x - # Other flags - ) + add_definitions(-std=c++11) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}) else () set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) @@ -43,12 +36,19 @@ endif () project(${PROJECT_NAME}) +# Clang ------------------------------------------------------------------------ + +find_package(LLVM REQUIRED PATHS "$ENV{CLANG_DIR}/build/share/llvm/cmake") +find_package(CLANG REQUIRED PATHS "${CMAKE_SOURCE_DIR}/cmake") + +add_definitions(${CLANG_DEFINITIONS}) + # Lib -------------------------------------------------------------------------- + add_subdirectory(src/lib) add_subdirectory(src/external) - add_library(${LIB_PROJECT_NAME} ${LIB_FILES} ${EXTERNAL_FILES}) create_source_groups(${LIB_FILES}) @@ -60,14 +60,20 @@ set_target_properties( DEBUG_OUTPUT_NAME ${PROJECT_NAME}_d RELEASE_OUTPUT_NAME ${PROJECT_NAME} ) - + set_property( - TARGET ${LIB_PROJECT_NAME} - PROPERTY INCLUDE_DIRECTORIES + TARGET ${LIB_PROJECT_NAME} + PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/src/lib" "${CMAKE_SOURCE_DIR}/src/external" + ${LLVM_INCLUDE_DIRS} + ${CLANG_INCLUDE_DIRS} ) +link_directories(${LLVM_LIBRARY_DIRS} ${CLANG_LIBRARY_DIRS}) + +target_link_libraries(${LIB_PROJECT_NAME} ${CLANG_LIBRARIES} ${LLVM_AVAILABLE_LIBS}) + # App -------------------------------------------------------------------------- @@ -90,8 +96,8 @@ create_source_groups(${APP_FILES}) target_link_libraries(${APP_PROJECT_NAME} ${LIB_PROJECT_NAME}) set_property( - TARGET ${APP_PROJECT_NAME} - PROPERTY INCLUDE_DIRECTORIES + TARGET ${APP_PROJECT_NAME} + PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/src/lib" "${CMAKE_SOURCE_DIR}/src/app" "${CMAKE_SOURCE_DIR}/build/src/app" @@ -109,6 +115,7 @@ configure_file( set(CMAKE_AUTOMOC OFF) + # CxxTest ---------------------------------------------------------------------- add_subdirectory(src/test) @@ -117,8 +124,6 @@ set(CXXTEST_INCLUDE_DIR $ENV{CXX_TEST_DIR}) set(CXXTEST_PYTHON_TESTGEN_EXECUTABLE ${CXXTEST_INCLUDE_DIR}/bin/cxxtestgen) set(TESTGEN_FILE ${CMAKE_CURRENT_BINARY_DIR}/test_main.cpp) - - find_package(PythonInterp REQUIRED) add_executable (${TEST_PROJECT_NAME} ${TESTGEN_FILE} ${TEST_FILES}) @@ -130,8 +135,8 @@ target_link_libraries(${TEST_PROJECT_NAME} ${LIB_PROJECT_NAME}) find_package(CxxTest) if (CXXTEST_FOUND) set_property( - TARGET ${TEST_PROJECT_NAME} - PROPERTY INCLUDE_DIRECTORIES + TARGET ${TEST_PROJECT_NAME} + PROPERTY INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/src/lib" "${CXXTEST_INCLUDE_DIR}" "${CMAKE_SOURCE_DIR}/src/external" @@ -156,7 +161,6 @@ if (WIN32) elseif (UNIX) - add_custom_command( OUTPUT ${TESTGEN_FILE} PRE_BUILD @@ -170,6 +174,7 @@ elseif (UNIX) endif () + # Visual Leak Detector --------------------------------------------------------- if (WIN32) @@ -177,3 +182,4 @@ if (WIN32) include_directories($ENV{VLD_DIR}/include) endif() + diff --git a/README.md b/README.md index bec10896..588c4bc7 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,13 @@ * QT 5.2.1 * CxxTest 4.3 * Valgrind 3.9.0(linux, macOS) +* Clang & LLVM (installation guide http://clang.llvm.org/docs/LibASTMatchersTutorial.html) ##### Environment Variables * QT_DIR - ...\Qt\Qt5.2.1\5.2.1\\ * CXX_TEST_DIR - .../cxxtest-4.3/ +* CLANG_DIR - .../clang-llvm/ For Win32: * VLD_DIR - .../Visual Leak Detector diff --git a/cmake/CLANGConfig.cmake b/cmake/CLANGConfig.cmake new file mode 100644 index 00000000..2825742c --- /dev/null +++ b/cmake/CLANGConfig.cmake @@ -0,0 +1,50 @@ +execute_process( + COMMAND $ENV{CLANG_DIR}/build/bin/llvm-config --cxxflags + OUTPUT_VARIABLE CLANG_DEFINITIONS +) + +set(CLANG_DEFINITIONS ${CLANG_DEFINITIONS} "-fno-rtti") + +set(CLANG_INCLUDE_DIRS + "$ENV{CLANG_DIR}/llvm/tools/clang/include" + "$ENV{CLANG_DIR}/build/tools/clang/include" +) + +set(CLANG_LIBRARY_DIRS "$ENV{CLANG_DIR}/build/lib") + +set(CLANG_LIBRARIES + #clangApplyReplacements + #clangARCMigrate + #clangCodeGen + #clangDynamicASTMatchers + #clangFormat + #clangFrontendTool + #clangIndex + #clangQuer + #clangTidy + #clangTidyGoogleModule + #clangTidyLLVMModule + #clangTidyMiscModule + clangASTMatchers + clangFrontend + clangSerialization + clangDriver + clangTooling + clangParse + clangSema + clangStaticAnalyzerFrontend + clangStaticAnalyzerCheckers + clangStaticAnalyzerCore + clangAnalysis + clangRewriteFrontend + clangRewriteCore + clangEdit + clangAST + clangLex + clangBasic +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(CLANG DEFAULT_MSG CLANG_LIBRARIES CLANG_INCLUDE_DIRS) + +mark_as_advanced(CLANG_INCLUDE_DIRS CLANG_LIBRARIES) diff --git a/src/app/main.cpp b/src/app/main.cpp index 75100ef0..1a8d94d8 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -7,8 +7,12 @@ #include "includes.h" #include "qt/QtElementFactory.h" +#include "data/parser/clang.h" + int main(int argv, char **args) { + clang_main(argv, args); + QApplication qtApp(argv, args); std::shared_ptr elementFactory = std::make_shared(); diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 94928c2a..c00bccba 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -25,6 +25,9 @@ add_files( data/access/GraphAccess.cpp data/access/GraphAccess.h + data/parser/clang.cpp + data/parser/clang.h + data/Edge.cpp data/Edge.h data/Element.cpp diff --git a/src/lib/data/parser/clang.cpp b/src/lib/data/parser/clang.cpp new file mode 100644 index 00000000..88968a41 --- /dev/null +++ b/src/lib/data/parser/clang.cpp @@ -0,0 +1,58 @@ +#include "clang.h" + +#include "clang/AST/ASTContext.h" +#include "clang/AST/ASTConsumer.h" +#include "clang/AST/RecursiveASTVisitor.h" +#include "clang/Frontend/CompilerInstance.h" +#include "clang/Frontend/FrontendAction.h" +#include "clang/Tooling/Tooling.h" + +using namespace clang; + +class FindNamedClassVisitor + : public RecursiveASTVisitor { +public: + explicit FindNamedClassVisitor(ASTContext *Context) + : Context(Context) {} + + bool VisitCXXRecordDecl(CXXRecordDecl *Declaration) { + if (Declaration->getQualifiedNameAsString() == "n::m::C") { + FullSourceLoc FullLocation = Context->getFullLoc(Declaration->getLocStart()); + if (FullLocation.isValid()) + llvm::outs() << "Found declaration at " + << FullLocation.getSpellingLineNumber() << ":" + << FullLocation.getSpellingColumnNumber() << "\n"; + } + return true; + } + +private: + ASTContext *Context; +}; + +class FindNamedClassConsumer : public clang::ASTConsumer { +public: + explicit FindNamedClassConsumer(ASTContext *Context) + : Visitor(Context) {} + + virtual void HandleTranslationUnit(clang::ASTContext &Context) { + Visitor.TraverseDecl(Context.getTranslationUnitDecl()); + } +private: + FindNamedClassVisitor Visitor; +}; + +class FindNamedClassAction : public clang::ASTFrontendAction { +public: + virtual clang::ASTConsumer *CreateASTConsumer( + clang::CompilerInstance &Compiler, llvm::StringRef InFile) { + return new FindNamedClassConsumer(&Compiler.getASTContext()); + } +}; + +int clang_main(int argc, char **argv) { + if (argc > 1) { + clang::tooling::runToolOnCode(new FindNamedClassAction, argv[1]); + } + return 0; +} diff --git a/src/lib/data/parser/clang.h b/src/lib/data/parser/clang.h new file mode 100644 index 00000000..166b21bc --- /dev/null +++ b/src/lib/data/parser/clang.h @@ -0,0 +1,6 @@ +#ifndef CLANG_MAIN_H +#define CLANG_MAIN_H + +int clang_main(int argc, char **argv); + +#endif // CLANG_MAIN_H