From a8f5fd02f1cdaaa021c19b34783a243548b3d7bf Mon Sep 17 00:00:00 2001 From: Andreas Stallinger Date: Thu, 18 Feb 2016 17:20:27 +0100 Subject: [PATCH] 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 --- .gitignore | 5 +- CMakeLists.txt | 75 ++++++++++--- cmake/BotanConfig.cmake | 45 -------- cmake/CLANGConfig.cmake | 21 +++- cmake/external.cmake | 13 +++ script/clean.sh | 23 +++- script/getSystemString.py | 11 ++ src/app/main.cpp | 2 - src/lib/CMakeLists.txt | 2 + .../SolutionParserCompilationDatabase.cpp | 103 ++++++++++++++++++ .../SolutionParserCompilationDatabase.h | 37 +++++++ 11 files changed, 265 insertions(+), 72 deletions(-) delete mode 100644 cmake/BotanConfig.cmake create mode 100644 cmake/external.cmake create mode 100644 script/getSystemString.py create mode 100644 src/lib/utility/solution/SolutionParserCompilationDatabase.cpp create mode 100644 src/lib/utility/solution/SolutionParserCompilationDatabase.h diff --git a/.gitignore b/.gitignore index 6525db52..ac6e9ff9 100644 --- a/.gitignore +++ b/.gitignore @@ -55,4 +55,7 @@ *.sqlite *.pch *.swp -.clang_complete \ No newline at end of file +.clang_complete +.ycm_extra_conf.py +.ycm_extra_conf.pyc +compile_commands.json diff --git a/CMakeLists.txt b/CMakeLists.txt index de9e9ab9..4107fda0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/cmake/BotanConfig.cmake b/cmake/BotanConfig.cmake deleted file mode 100644 index b1e79a01..00000000 --- a/cmake/BotanConfig.cmake +++ /dev/null @@ -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 diff --git a/cmake/CLANGConfig.cmake b/cmake/CLANGConfig.cmake index 3a7b12e4..a686b547 100644 --- a/cmake/CLANGConfig.cmake +++ b/cmake/CLANGConfig.cmake @@ -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") diff --git a/cmake/external.cmake b/cmake/external.cmake new file mode 100644 index 00000000..3fcabafd --- /dev/null +++ b/cmake/external.cmake @@ -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}") + diff --git a/script/clean.sh b/script/clean.sh index 5195baca..65308b01 100755 --- a/script/clean.sh +++ b/script/clean.sh @@ -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 diff --git a/script/getSystemString.py b/script/getSystemString.py new file mode 100644 index 00000000..4eb249ee --- /dev/null +++ b/script/getSystemString.py @@ -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) + diff --git a/src/app/main.cpp b/src/app/main.cpp index 5730ce37..1ed945f9 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -18,8 +18,6 @@ #include "qt/window/QtSplashScreen.h" #include "version.h" - -#include "utility/solution/SolutionParserVisualStudio.h" #include "settings/ProjectSettings.h" void init() diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index ddd955ad..bb3f14e9 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -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 diff --git a/src/lib/utility/solution/SolutionParserCompilationDatabase.cpp b/src/lib/utility/solution/SolutionParserCompilationDatabase.cpp new file mode 100644 index 00000000..86c27540 --- /dev/null +++ b/src/lib/utility/solution/SolutionParserCompilationDatabase.cpp @@ -0,0 +1,103 @@ +#include "utility/solution/SolutionParserCompilationDatabase.h" + +#include + +#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 SolutionParserCompilationDatabase::getProjects() +{ + return std::vector(); +} + +std::vector SolutionParserCompilationDatabase::getProjectItems() +{ + return getDatabase()->getAllFiles(); +} + +std::vector SolutionParserCompilationDatabase::getIncludePaths() +{ + std::vector commands = getDatabase()->getAllCompileCommands(); + + std::set 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 paths; + for(std::string p : searchPaths) + { + paths.push_back(p); + } + + return paths; +} + +std::vector SolutionParserCompilationDatabase::getProjectFiles() +{ + return std::vector(); +} + +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::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(); +} diff --git a/src/lib/utility/solution/SolutionParserCompilationDatabase.h b/src/lib/utility/solution/SolutionParserCompilationDatabase.h new file mode 100644 index 00000000..30a79d82 --- /dev/null +++ b/src/lib/utility/solution/SolutionParserCompilationDatabase.h @@ -0,0 +1,37 @@ +#ifndef COATI_SOLUTIONPARSERCOMPILATIONDATABASE_H +#define COATI_SOLUTIONPARSERCOMPILATIONDATABASE_H + +#include "utility/solution/ISolutionParser.h" + +#include +#include + +class FilePath; +namespace clang +{ + namespace tooling + { + class JSONCompilationDatabase; + } +} + +class SolutionParserCompilationDatabase : public ISolutionParser +{ +public: + SolutionParserCompilationDatabase(); + ~SolutionParserCompilationDatabase(); + + virtual std::string getSolutionName(); + virtual std::vector getProjects(); + virtual std::vector getProjectFiles(); + virtual std::vector getProjectItems(); + virtual std::vector getIncludePaths(); + +private: + std::shared_ptr m_database; + clang::tooling::JSONCompilationDatabase* getDatabase(); + std::string getIncludePath(const std::string& argument, const std::string& dir); +}; + + +#endif //COATI_SOLUTIONPARSERCOMPILATIONDATABASE_H