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:
Eberhard Graether
2014-04-09 16:25:32 +02:00
parent 9902288cab
commit 4b4c9f56d8
7 changed files with 150 additions and 21 deletions
+27 -21
View File
@@ -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()
+2
View File
@@ -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
+50
View File
@@ -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)
+4
View File
@@ -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>();
+3
View File
@@ -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
+58
View File
@@ -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;
}
+6
View File
@@ -0,0 +1,6 @@
#ifndef CLANG_MAIN_H
#define CLANG_MAIN_H
int clang_main(int argc, char **argv);
#endif // CLANG_MAIN_H