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:
+4
-1
@@ -55,4 +55,7 @@
|
||||
*.sqlite
|
||||
*.pch
|
||||
*.swp
|
||||
.clang_complete
|
||||
.clang_complete
|
||||
.ycm_extra_conf.py
|
||||
.ycm_extra_conf.pyc
|
||||
compile_commands.json
|
||||
|
||||
+61
-14
@@ -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)
|
||||
|
||||
|
||||
@@ -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
@@ -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")
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -18,8 +18,6 @@
|
||||
#include "qt/window/QtSplashScreen.h"
|
||||
#include "version.h"
|
||||
|
||||
|
||||
#include "utility/solution/SolutionParserVisualStudio.h"
|
||||
#include "settings/ProjectSettings.h"
|
||||
|
||||
void init()
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user