setup: Added clang and llvm
Adds clang and llvm include directories and libraries to the build. The environment variable CLANG_DIR is used to define the location of llvm and clang. A simple clang tool implementation was added to assure proper operation of the libraries.
This commit is contained in:
+27
-21
@@ -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()
|
||||
|
||||
|
||||
@@ -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\<IDE>\
|
||||
* CXX_TEST_DIR - .../cxxtest-4.3/
|
||||
* CLANG_DIR - .../clang-llvm/
|
||||
|
||||
For Win32:
|
||||
* VLD_DIR - .../Visual Leak Detector
|
||||
|
||||
@@ -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)
|
||||
@@ -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<GuiElementFactory> elementFactory = std::make_shared<QtElementFactory>();
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<FindNamedClassVisitor> {
|
||||
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;
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#ifndef CLANG_MAIN_H
|
||||
#define CLANG_MAIN_H
|
||||
|
||||
int clang_main(int argc, char **argv);
|
||||
|
||||
#endif // CLANG_MAIN_H
|
||||
Reference in New Issue
Block a user