logic: compilationdatabase parsing

* compilationdatabase cleaned
* add SolutionparserCompliationDatabase
* added cmake_build_type_init as release for better autocomplition on linux
* external source handling for different linux versions
* clean script remove windows symbolic links only on windows
* linux external lib handling for different build easier
This commit is contained in:
Andreas Stallinger
2016-02-18 17:20:27 +01:00
parent 59232bda69
commit a8f5fd02f1
11 changed files with 265 additions and 72 deletions
+4 -1
View File
@@ -55,4 +55,7 @@
*.sqlite
*.pch
*.swp
.clang_complete
.clang_complete
.ycm_extra_conf.py
.ycm_extra_conf.pyc
compile_commands.json
+61 -14
View File
@@ -11,6 +11,10 @@ include(cmake/version.cmake)
include(cmake/version_setup.cmake)
include(cmake/licenses.cmake)
# set Standerd build type to Release
set(CMAKE_BUILD_TYPE_INIT "Release")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Variables --------------------------------------------------------------------
set(PROJECT_NAME Coati)
@@ -42,25 +46,40 @@ endif ()
# Project ----------------------------------------------------------------------
project(${PROJECT_NAME})
#RPATH
set(CMAKE_SKIP_BUILD_RPATH FALSE)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib/:$$ORIGIN/lib/")
if(UNIX AND NOT APPLE)
include(cmake/external.cmake)
endif()
# Clang ------------------------------------------------------------------------
if (UNIX)
if (UNIX AND APPLE)
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
find_package(LLVM REQUIRED PATHS "$ENV{CLANG_DIR}/build_release/share/llvm/cmake" NO_DEFAULT_PATH)
else()
find_package(LLVM REQUIRED PATHS "$ENV{CLANG_DIR}/build_debug/share/llvm/cmake" NO_DEFAULT_PATH)
endif()
elseif(UNIX)
find_package(LLVM REQUIRED PATHS "${EXTERNAL_BUILD}/llvm/share/llvm/cmake" NO_DEFAULT_PATH)
else()
find_package(LLVM REQUIRED PATHS "$ENV{CLANG_DIR}/build/share/llvm/cmake")
endif()
find_package(CLANG REQUIRED PATHS "${CMAKE_SOURCE_DIR}/cmake")
find_package(CLANG REQUIRED PATHS "${CMAKE_SOURCE_DIR}/cmake" NO_DEFAULT_PATH)
add_definitions(${CLANG_DEFINITIONS})
# Boost ------------------------------------------------------------------------
set(BOOST_ROOT $ENV{BOOST_159_DIR})
if(UNIX AND NOT APPLE)
set(BOOST_ROOT ${EXTERNAL_BUILD}/boost)
else()
set(BOOST_ROOT $ENV{BOOST_159_DIR})
endif()
set(Boost_USE_MULTITHREAD ON)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_STATIC_RUNTIME OFF)
@@ -72,17 +91,33 @@ find_package(Boost 1.59 COMPONENTS system program_options filesystem date_time R
# Eigen ------------------------------------------------------------------------
add_definitions(-DEIGEN_MPL2_ONLY)
set(EIGEN_ROOT $ENV{EIGEN_DIR})
if(UNIX AND NOT APPLE)
set(EIGEN_ROOT ${EXTERNAL_SRC}/eigen)
else()
set(EIGEN_ROOT $ENV{EIGEN_DIR})
endif()
# Botan -------------------------------------------------------------------------
if(UNIX)
if(UNIX AND APPLE)
find_library(BOTAN botan-1.11 $ENV{BOTAN_DIR}/release NO_DEFAULT_PATH)
find_library(BOTAN_D botan-1.11 $ENV{BOTAN_DIR}/debug NO_DEFAULT_PATH)
elseif(UNIX)
find_library(BOTAN botan-1.11 "${EXTERNAL_BUILD}/botan/lib" NO_DEFAULT_PATH)
else()
find_library(BOTAN botan "$ENV{BOTAN_DIR}/release")
find_library(BOTAN_D botan "$ENV{BOTAN_DIR}/debug")
endif()
if(${BOTAN} STREQUAL "BOTAN-NOTFOUND")
message(FATAL_ERROR "Botan not found")
else()
message(STATUS "Botan found")
endif()
if(UNIX AND NOT APPLE)
set(BOTAN_INCLUDE_DIR "${EXTERNAL_SRC}/botan")
else()
set(BOTAN_INCLUDE_DIR "$ENV{BOTAN_DIR}")
endif()
# Lib --------------------------------------------------------------------------
@@ -151,8 +186,10 @@ target_include_directories(${LIB_PARSER_PROJECT_NAME} SYSTEM
)
link_directories(${LLVM_LIBRARY_DIRS} ${CLANG_LIBRARY_DIRS} ${Boost_LIBRARY_DIRS})
llvm_map_components_to_libnames(REQ_LLVM_LIBS support core libdriver)
target_link_libraries(${LIB_PARSER_PROJECT_NAME} ${CLANG_LIBRARIES} ${LLVM_AVAILABLE_LIBS})
#target_link_libraries(${LIB_PARSER_PROJECT_NAME} ${CLANG_LIBRARIES} ${LLVM_AVAILABLE_LIBS})
target_link_libraries(${LIB_PARSER_PROJECT_NAME} ${CLANG_LIBRARIES} ${REQ_LLVM_LIBS})
# Lib License -------------------------------------------------------------------
@@ -175,7 +212,7 @@ target_include_directories(${LIB_LICENSE_PROJECT_NAME} SYSTEM
PUBLIC
${Boost_INCLUDE_DIRS}
${LIB_LICENSE_PROJECT_NAME}
"$ENV{BOTAN_DIR}"
${BOTAN_INCLUDE_DIR}
)
# target_include_directories(${LIB_LICENSE_PROJECT_NAME} optimized "$ENV{BOTAN_DIR}/release")
@@ -204,10 +241,16 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
# Find the QtWidgets library
set(CMAKE_PREFIX_PATH "$ENV{QT_DIR}/")
if(UNIX AND NOT APPLE)
set(CMAKE_PREFIX_PATH ${EXTERNAL_BUILD}/qt)
else()
set(CMAKE_PREFIX_PATH "$ENV{QT_DIR}/")
endif()
set(Qt5Widgets_DIR "$ENV{QT_DIR}/cmake/Qt5Widgets/")
set(Qt5PrintSupport_DIR "$ENV{QT_DIR}/cmake/Qt5PrintSupport/")
if(UNIX AND APPLE)
set(Qt5Widgets_DIR "$ENV{QT_DIR}/cmake/Qt5Widgets/")
set(Qt5PrintSupport_DIR "$ENV{QT_DIR}/cmake/Qt5PrintSupport/")
endif()
find_package(Qt5Widgets)
find_package(Qt5PrintSupport)
@@ -255,7 +298,7 @@ set_property(
# include external header without warnings
target_include_directories(${LIB_GUI_PROJECT_NAME} SYSTEM
PUBLIC "${CMAKE_SOURCE_DIR}/src/external"
PUBLIC "$ENV{BOTAN_DIR}"
PUBLIC ${BOTAN_INCLUDE_DIR}
PUBLIC ${Boost_INCLUDE_DIRS}
)
@@ -383,7 +426,7 @@ create_source_groups(${TRIAL_FILES})
target_link_libraries(${TRIAL_PROJECT_NAME} ${LIB_GUI_PROJECT_NAME} ${LIB_PROJECT_NAME} ${LIB_LICENSE_PROJECT_NAME} )
if(UNIX AND NOT APPLE)
target_link_libraries(${TRIAL_PROJECT_NAME} pthread dl)
target_link_libraries(${TRIAL_PROJECT_NAME} pthread dl rt)
endif()
set_property(
@@ -479,7 +522,7 @@ target_include_directories(${LICENSE_GENERATOR_PROJECT_NAME} SYSTEM
)
if(UNIX AND NOT APPLE)
target_link_libraries(${LICENSE_GENERATOR_PROJECT_NAME} pthread dl)
target_link_libraries(${LICENSE_GENERATOR_PROJECT_NAME} pthread dl rt)
endif()
target_link_libraries(${LICENSE_GENERATOR_PROJECT_NAME} ${LIB_LICENSE_PROJECT_NAME} ${Boost_LIBRARIES} )
@@ -494,7 +537,11 @@ endif ()
add_subdirectory(src/test)
set(CXXTEST_INCLUDE_DIR $ENV{CXX_TEST_DIR})
if(UNIX AND NOT APPLE)
set(CXXTEST_INCLUDE_DIR ${EXTERNAL_SRC}/cxxtest)
else()
set(CXXTEST_INCLUDE_DIR $ENV{CXX_TEST_DIR})
endif()
set(CXXTEST_PYTHON_TESTGEN_EXECUTABLE ${CXXTEST_INCLUDE_DIR}/bin/cxxtestgen)
set(TESTGEN_FILE ${CMAKE_CURRENT_BINARY_DIR}/test_main.cpp)
-45
View File
@@ -1,45 +0,0 @@
SET(BOTAN_URL https://github.com/randombit/botan.git/)
SET(BOTAN_VERSION 1.11.23)
SET(BOTAN_MODULES "base,ecdsa,emsa1,passhash9,rng,rsa,egd,emsa_pssr,emsa_pkcs1,x509,aes,dev_random")
SET(BOTAN_DIR $ENV{COATI_DEPEND_DIR}/botan)
find_package(Git)
if(Git_FOUND)
else()
message(ERROR "git not found: git not in path")
endif()
if(EXISTS $ENV{COATI_DEPEND_DIR})
else()
message(ERROR "coati dependency directory does not exist")
endif()
if(EXISTS ${BOTAN_DIR})
else()
execute_process(
COMMAND ${GIT_EXECUTABLE} clone ${BOTAN_URL}
WORKING_DIRECTORY $ENV{COATI_DEPEND_DIR}
)
endif()
execute_process(
COMMAND ${GIT_EXECUTABLE} checkout ${BOTAN_VERSION}
WORKING_DIRECTORY ${BOTAN_DIR}
)
# system specific botan modules
if(UNIX)
elseif(MSVC)
endif()
execute_process(
COMMAND ./configure.py --gen-amalgamation --minimized-build --enable-modules=${BOTAN_MODULES}
WORKING_DIRECTORY ${BOTAN_DIR}
)
#linux
#./configure.py --gen-amalgamation --minimized-build --enable-modules=base,ecdsa,emsa1,passhash9,rng,rsa,egd,dev_random,emsa_pssr,emsa_pkcs1,x509,aes
+16 -5
View File
@@ -1,9 +1,13 @@
if (UNIX)
include(cmake/external.cmake)
if (UNIX AND APPLE)
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
set(CLANG_BUILD_PATH "$ENV{CLANG_DIR}/build_release")
else()
set(CLANG_BUILD_PATH "$ENV{CLANG_DIR}/build_debug")
endif()
elseif(UNIX)
set(CLANG_BUILD_PATH "${EXTERNAL_BUILD}/llvm")
else()
set(CLANG_BUILD_PATH "$ENV{CLANG_DIR}/build")
endif()
@@ -17,10 +21,17 @@ execute_process(
string(REPLACE "-fno-exceptions" "" CLANG_DEFINITIONS "${CLANG_DEFINITIONS}")
string(REPLACE "-fno-rtti" "" CLANG_DEFINITIONS "${CLANG_DEFINITIONS}")
set(CLANG_INCLUDE_DIRS
"$ENV{CLANG_DIR}/llvm/tools/clang/include"
"${CLANG_BUILD_PATH}/tools/clang/include"
)
if(UNIX AND NOT APPLE)
set(CLANG_INCLUDE_DIRS
"${EXTERNAL_SRC}/clang/include"
"${CLANG_BUILD_PATH}/tools/clang/include"
)
else()
set(CLANG_INCLUDE_DIRS
"$ENV{CLANG_DIR}/llvm/tools/clang/include"
"${CLANG_BUILD_PATH}/tools/clang/include"
)
endif()
set(CLANG_LIBRARY_DIRS "${CLANG_BUILD_PATH}/lib")
+13
View File
@@ -0,0 +1,13 @@
find_package(PythonInterp REQUIRED)
execute_process(
COMMAND ${PYTHON_EXECUTABLE} "${CMAKE_SOURCE_DIR}/script/getSystemString.py"
OUTPUT_VARIABLE SYSSTRING
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(EXTERNAL_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../Coati_External")
set(EXTERNAL_SRC "${EXTERNAL_ROOT}/src")
set(EXTERNAL_BUILD "${EXTERNAL_ROOT}/${SYSSTRING}/${CMAKE_BUILD_TYPE}")
+18 -5
View File
@@ -2,15 +2,28 @@
SUCCESS="\033[32mSuccess:\033[00m"
# Determine current platform
PLATFORM='unknown'
if [ "$(uname)" == "Darwin" ]; then
PLATFORM='MacOS'
elif [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; then
PLATFORM='Linux'
elif [ "$(expr substr $(uname -s) 1 10)" == "MINGW32_NT" ]; then
PLATFORM='Windows'
fi
# Enter masterproject directory
MY_PATH=`dirname "$0"`
cd $MY_PATH/..
# Remove symbolic links
cmd //c 'rmdir '.$MY_PATH.'\..\bin\app\Debug\data' &
cmd //c 'rmdir '.$MY_PATH.'\..\bin\app\Debug\user' &
cmd //c 'rmdir '.$MY_PATH.'\..\bin\app\Release\data' &
cmd //c 'rmdir '.$MY_PATH.'\..\bin\app\Release\user' &
if [ $PLATFORM == "Windows" ]; then
# Remove symbolic links
cmd //c 'rmdir '.$MY_PATH.'\..\bin\app\Debug\data' &
cmd //c 'rmdir '.$MY_PATH.'\..\bin\app\Debug\user' &
cmd //c 'rmdir '.$MY_PATH.'\..\bin\app\Release\data' &
cmd //c 'rmdir '.$MY_PATH.'\..\bin\app\Release\user' &
fi
# Remove folders and contents
rm -rf build
+11
View File
@@ -0,0 +1,11 @@
#!/bin/python2
#simple script to get System and architecture as a string
import os
import platform
arch = platform.machine()
system = platform.system()
dist = (platform.linux_distribution(distname="unknown", full_distribution_name=0)[0])
s = system + '-' + arch + '/' + dist
print (s)
-2
View File
@@ -18,8 +18,6 @@
#include "qt/window/QtSplashScreen.h"
#include "version.h"
#include "utility/solution/SolutionParserVisualStudio.h"
#include "settings/ProjectSettings.h"
void init()
+2
View File
@@ -276,6 +276,8 @@ add_files(
utility/solution/ISolutionParser.cpp
utility/solution/ISolutionParser.h
utility/solution/SolutionParserCompilationDatabase.cpp
utility/solution/SolutionParserCompilationDatabase.h
utility/solution/SolutionParserVisualStudio.cpp
utility/solution/SolutionParserVisualStudio.h
@@ -0,0 +1,103 @@
#include "utility/solution/SolutionParserCompilationDatabase.h"
#include <set>
#include "utility/file/FilePath.h"
#include "utility/logging/logging.h"
#include "clang/Tooling/JSONCompilationDatabase.h"
SolutionParserCompilationDatabase::SolutionParserCompilationDatabase()
{
}
SolutionParserCompilationDatabase::~SolutionParserCompilationDatabase()
{
}
std::string SolutionParserCompilationDatabase::getSolutionName()
{
return "";
}
std::vector<std::string> SolutionParserCompilationDatabase::getProjects()
{
return std::vector<std::string>();
}
std::vector<std::string> SolutionParserCompilationDatabase::getProjectItems()
{
return getDatabase()->getAllFiles();
}
std::vector<std::string> SolutionParserCompilationDatabase::getIncludePaths()
{
std::vector<clang::tooling::CompileCommand> commands = getDatabase()->getAllCompileCommands();
std::set<std::string> searchPaths;
bool insertNext = false;
for(clang::tooling::CompileCommand command : commands)
{
std::string dir = command.Directory;
for(std::string argument : command.CommandLine)
{
if(insertNext)
{
searchPaths.insert(getIncludePath(argument, command.Directory));
insertNext = false;
}
if(argument.substr(0,2) == "-I")
{
searchPaths.insert(getIncludePath(argument.substr(2), command.Directory));
}
if(argument == "-isystem")
{
insertNext = true;
}
// TODO Implement iframework handling
}
}
std::vector<std::string> paths;
for(std::string p : searchPaths)
{
paths.push_back(p);
}
return paths;
}
std::vector<std::string> SolutionParserCompilationDatabase::getProjectFiles()
{
return std::vector<std::string>();
}
std::string SolutionParserCompilationDatabase::getIncludePath(const std::string& path, const std::string& dir)
{
if (FilePath(path).isAbsolute())
{
return path;
}
return dir + "/" + path;
}
clang::tooling::JSONCompilationDatabase* SolutionParserCompilationDatabase::getDatabase()
{
if(m_database == nullptr)
{
if(m_solutionPath.empty())
{
LOG_ERROR("No compilation database file");
}
else
{
std::string error;
m_database = std::shared_ptr<clang::tooling::JSONCompilationDatabase>
( clang::tooling::JSONCompilationDatabase::loadFromFile(m_solutionPath + m_solutionName,error) );
}
if(m_database == nullptr)
{
LOG_ERROR("Could not load compilation database from file: " + m_solutionPath );
}
}
return m_database.get();
}
@@ -0,0 +1,37 @@
#ifndef COATI_SOLUTIONPARSERCOMPILATIONDATABASE_H
#define COATI_SOLUTIONPARSERCOMPILATIONDATABASE_H
#include "utility/solution/ISolutionParser.h"
#include <memory>
#include <string>
class FilePath;
namespace clang
{
namespace tooling
{
class JSONCompilationDatabase;
}
}
class SolutionParserCompilationDatabase : public ISolutionParser
{
public:
SolutionParserCompilationDatabase();
~SolutionParserCompilationDatabase();
virtual std::string getSolutionName();
virtual std::vector<std::string> getProjects();
virtual std::vector<std::string> getProjectFiles();
virtual std::vector<std::string> getProjectItems();
virtual std::vector<std::string> getIncludePaths();
private:
std::shared_ptr<clang::tooling::JSONCompilationDatabase> m_database;
clang::tooling::JSONCompilationDatabase* getDatabase();
std::string getIncludePath(const std::string& argument, const std::string& dir);
};
#endif //COATI_SOLUTIONPARSERCOMPILATIONDATABASE_H