From 2305a74e6ce9a5622ed99caf37c9562392444586 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Tue, 8 Aug 2017 16:00:32 +0200 Subject: [PATCH] logic: Added cross-compilation UI to CXX source group setup (issue #370) Allows for defining specific target triple of architecture, vendor, OS and environment as set of dropdown lists in CXX source group setup. bug id = 370 --- src/app/main.cpp | 3 +- src/lib/CMakeLists.txt | 1 + src/lib/settings/ProjectSettings.cpp | 18 +- src/lib/settings/SourceGroupSettingsCxx.cpp | 209 +++++++++++++++++- src/lib/settings/SourceGroupSettingsCxx.h | 28 +++ src/lib/utility/OsType.h | 12 + src/lib_cxx/project/SourceGroupCxx.cpp | 11 +- src/lib_gui/CMakeLists.txt | 2 + src/lib_gui/qt/element/QtDirectoryListBox.cpp | 9 +- src/lib_gui/qt/graphics/QtGraphicsView.cpp | 4 +- src/lib_gui/qt/network/QtUpdateChecker.cpp | 23 +- src/lib_gui/qt/view/QtGraphViewStyleImpl.cpp | 8 +- src/lib_gui/qt/window/QtMainWindow.cpp | 4 +- src/lib_gui/qt/window/QtPreferencesWindow.cpp | 3 +- .../project_wizzard/QtProjectWizzard.cpp | 27 ++- ...tWizzardContentCrossCompilationOptions.cpp | 173 +++++++++++++++ ...ectWizzardContentCrossCompilationOptions.h | 41 ++++ .../QtProjectWizzardContentPreferences.cpp | 19 +- src/lib_gui/utility/utilityApp.cpp | 20 +- src/lib_gui/utility/utilityApp.h | 4 + src/lib_gui/utility/utilityPathDetection.cpp | 54 +++-- src/lib_java/data/parser/java/JavaParser.h | 2 + 22 files changed, 611 insertions(+), 64 deletions(-) create mode 100644 src/lib/utility/OsType.h create mode 100644 src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.cpp create mode 100644 src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.h diff --git a/src/app/main.cpp b/src/app/main.cpp index fe113009..ff4bb9ec 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -28,6 +28,7 @@ #include "utility/ResourcePaths.h" #include "utility/ScopedFunctor.h" #include "utility/UserPaths.h" +#include "utility/utilityApp.h" #include "utility/utilityPathDetection.h" #include "utility/Version.h" #include "version.h" @@ -169,7 +170,7 @@ int main(int argc, char *argv[]) { QApplication::setApplicationName("Sourcetrail"); - if (QSysInfo::windowsVersion() != QSysInfo::WV_None) + if (utility::getOsType() == OS_WINDOWS) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true); } diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index a90ea91a..4ba55b5c 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -482,6 +482,7 @@ add_files( utility/Cache.h utility/ConfigManager.cpp utility/ConfigManager.h + utility/OsType.h utility/Property.h utility/ResourcePaths.cpp utility/ResourcePaths.h diff --git a/src/lib/settings/ProjectSettings.cpp b/src/lib/settings/ProjectSettings.cpp index 6c5adac3..86226746 100644 --- a/src/lib/settings/ProjectSettings.cpp +++ b/src/lib/settings/ProjectSettings.cpp @@ -156,10 +156,18 @@ std::vector> ProjectSettings::getAllSourceG { cxxSettings->setCompilationDatabasePath(FilePath(getValue(key + "/build_file_path/compilation_db_path", ""))); } + if (type == SOURCE_GROUP_C_EMPTY || type == SOURCE_GROUP_CPP_EMPTY) + { + cxxSettings->setTargetOptionsEnabled(getValue(key + "/cross_compilation/target_options_enabled", false)); + cxxSettings->setTargetArch(getValue(key + "/cross_compilation/target/arch", "")); + cxxSettings->setTargetVendor(getValue(key + "/cross_compilation/target/vendor", "")); + cxxSettings->setTargetSys(getValue(key + "/cross_compilation/target/sys", "")); + cxxSettings->setTargetAbi(getValue(key + "/cross_compilation/target/abi", "")); + } cxxSettings->setShouldApplyAnonymousTypedefTransformation(getValue(key + "/should_apply_anonymous_typedef_transformation", true)); settings = cxxSettings; } - break; + break; case SOURCE_GROUP_JAVA_EMPTY: case SOURCE_GROUP_JAVA_MAVEN: { @@ -233,6 +241,14 @@ void ProjectSettings::setAllSourceGroupSettings(const std::vectorgetCompilationDatabasePath().str()); } + if (type == SOURCE_GROUP_C_EMPTY || type == SOURCE_GROUP_CPP_EMPTY) + { + setValue(key + "/cross_compilation/target_options_enabled", cxxSettings->getTargetOptionsEnabled()); + setValue(key + "/cross_compilation/target/arch", cxxSettings->getTargetArch()); + setValue(key + "/cross_compilation/target/vendor", cxxSettings->getTargetVendor()); + setValue(key + "/cross_compilation/target/sys", cxxSettings->getTargetSys()); + setValue(key + "/cross_compilation/target/abi", cxxSettings->getTargetAbi()); + } setValue(key + "/should_apply_anonymous_typedef_transformation", cxxSettings->getShouldApplyAnonymousTypedefTransformation()); } break; diff --git a/src/lib/settings/SourceGroupSettingsCxx.cpp b/src/lib/settings/SourceGroupSettingsCxx.cpp index 4b61c4d4..ffbadb17 100644 --- a/src/lib/settings/SourceGroupSettingsCxx.cpp +++ b/src/lib/settings/SourceGroupSettingsCxx.cpp @@ -1,6 +1,144 @@ #include "settings/SourceGroupSettingsCxx.h" #include "utility/utility.h" +#include "utility/utilityApp.h" + +std::vector SourceGroupSettingsCxx::getAvailableArchTypes() +{ + return { + "aarch64", + "aarch64_be", + "arm", + "armeb", + "avr", + "bpfel", + "bpfeb", + "hexagon", + "mips", + "mipsel", + "mips64", + "mips64el", + "msp430", + "powerpc64", + "powerpc64le", + "powerpc", + "r600", + "amdgcn", + "riscv32", + "riscv64", + "sparc", + "sparcv9", + "sparcel", + "s390x", + "tce", + "tcele", + "thumb", + "thumbeb", + "i386", + "x86_64", + "xcore", + "nvptx", + "nvptx64", + "le32", + "le64", + "amdil", + "amdil64", + "hsail", + "hsail64", + "spir", + "spir64", + "kalimba", + "lanai", + "shave", + "wasm32", + "wasm64", + "renderscript32", + "renderscript64", + }; +} + +std::vector SourceGroupSettingsCxx::getAvailableVendorTypes() +{ + return { + "unknown", + "apple", + "pc", + "scei", + "bgp", + "bgq", + "fsl", + "ibm", + "img", + "mti", + "nvidia", + "csr", + "myriad", + "amd", + "mesa" + }; +} + +std::vector SourceGroupSettingsCxx::getAvailableOsTypes() +{ + return { + "unknown", + "cloudabi", + "darwin", + "dragonfly", + "freebsd", + "fuchsia", + "ios", + "kfreebsd", + "linux", + "lv2", + "macosx", + "netbsd", + "openbsd", + "solaris", + "windows", + "haiku", + "minix", + "rtems", + "nacl", + "cnk", + "bitrig", + "aix", + "cuda", + "nvcl", + "amdhsa", + "ps4", + "elfiamcu", + "tvos", + "watchos", + "mesa3d", + "contiki" + }; +} + +std::vector SourceGroupSettingsCxx::getAvailableEnvironmentTypes() +{ + return { + "unknown", + "gnu", + "gnuabi64", + "gnueabihf", + "gnueabi", + "gnux32", + "code16", + "eabi", + "eabihf", + "android", + "musl", + "musleabi", + "musleabihf", + "msvc", + "itanium", + "cygnus", + "amdopencl", + "coreclr", + "opencl" + }; +} SourceGroupSettingsCxx::SourceGroupSettingsCxx(const std::string& id, SourceGroupType type, const ProjectSettings* projectSettings) : SourceGroupSettings(id, type, projectSettings) @@ -29,7 +167,8 @@ bool SourceGroupSettingsCxx::equals(std::shared_ptr other) utility::isPermutation(m_compilerFlags, otherCxx->m_compilerFlags) && m_useSourcePathsForHeaderSearch == otherCxx->m_useSourcePathsForHeaderSearch && m_hasDefinedUseSourcePathsForHeaderSearch == otherCxx->m_hasDefinedUseSourcePathsForHeaderSearch && - m_compilationDatabasePath == otherCxx->m_compilationDatabasePath + m_compilationDatabasePath == otherCxx->m_compilationDatabasePath && + getTargetFlag() == otherCxx->getTargetFlag() ); } @@ -126,6 +265,74 @@ void SourceGroupSettingsCxx::setFrameworkSearchPaths(const std::vector m_frameworkSearchPaths = frameworkSearchPaths; } +bool SourceGroupSettingsCxx::getTargetOptionsEnabled() const +{ + return m_targetOptionsEnabled; +} + +void SourceGroupSettingsCxx::setTargetOptionsEnabled(bool targetOptionsEnabled) +{ + m_targetOptionsEnabled = targetOptionsEnabled; +} + +std::string SourceGroupSettingsCxx::getTargetArch() const +{ + return m_targetArch; +} + +void SourceGroupSettingsCxx::setTargetArch(const std::string& arch) +{ + m_targetArch = arch; +} + +std::string SourceGroupSettingsCxx::getTargetVendor() const +{ + return m_targetVendor; +} + +void SourceGroupSettingsCxx::setTargetVendor(const std::string& vendor) +{ + m_targetVendor = vendor; +} + +std::string SourceGroupSettingsCxx::getTargetSys() const +{ + return m_targetSys; +} + +void SourceGroupSettingsCxx::setTargetSys(const std::string& sys) +{ + m_targetSys = sys; +} + +std::string SourceGroupSettingsCxx::getTargetAbi() const +{ + return m_targetAbi; +} + +void SourceGroupSettingsCxx::setTargetAbi(const std::string& abi) +{ + m_targetAbi = abi; +} + +std::string SourceGroupSettingsCxx::getTargetFlag() const +{ + std::string targetFlag = ""; + if (m_targetOptionsEnabled) + { + targetFlag = "--target="; + targetFlag += m_targetArch; + if (!m_targetSub.empty()) + { + targetFlag += m_targetSub; + } + targetFlag += "-" + m_targetVendor; + targetFlag += "-" + m_targetSys; + targetFlag += "-" + m_targetAbi; + } + return targetFlag; +} + std::vector SourceGroupSettingsCxx::getCompilerFlags() const { return m_compilerFlags; diff --git a/src/lib/settings/SourceGroupSettingsCxx.h b/src/lib/settings/SourceGroupSettingsCxx.h index 00de526c..d03e8e04 100644 --- a/src/lib/settings/SourceGroupSettingsCxx.h +++ b/src/lib/settings/SourceGroupSettingsCxx.h @@ -7,6 +7,11 @@ class SourceGroupSettingsCxx : public SourceGroupSettings { public: + static std::vector getAvailableArchTypes(); + static std::vector getAvailableVendorTypes(); + static std::vector getAvailableOsTypes(); + static std::vector getAvailableEnvironmentTypes(); + SourceGroupSettingsCxx(const std::string& id, SourceGroupType type, const ProjectSettings* projectSettings); virtual ~SourceGroupSettingsCxx(); @@ -22,6 +27,23 @@ public: std::vector getFrameworkSearchPathsExpandedAndAbsolute() const; void setFrameworkSearchPaths(const std::vector& frameworkSearchPaths); + bool getTargetOptionsEnabled() const; + void setTargetOptionsEnabled(bool targetOptionsEnabled); + + std::string getTargetArch() const; + void setTargetArch(const std::string& arch); + + std::string getTargetVendor() const; + void setTargetVendor(const std::string& vendor); + + std::string getTargetSys() const; + void setTargetSys(const std::string& sys); + + std::string getTargetAbi() const; + void setTargetAbi(const std::string& abi); + + std::string getTargetFlag() const; + std::vector getCompilerFlags() const; void setCompilerFlags(const std::vector& compilerFlags); @@ -45,6 +67,12 @@ private: std::vector m_headerSearchPaths; std::vector m_frameworkSearchPaths; + bool m_targetOptionsEnabled; + std::string m_targetArch; + std::string m_targetSub; + std::string m_targetVendor; + std::string m_targetSys; + std::string m_targetAbi; std::vector m_compilerFlags; bool m_useSourcePathsForHeaderSearch; bool m_hasDefinedUseSourcePathsForHeaderSearch; diff --git a/src/lib/utility/OsType.h b/src/lib/utility/OsType.h new file mode 100644 index 00000000..e12eadd6 --- /dev/null +++ b/src/lib/utility/OsType.h @@ -0,0 +1,12 @@ +#ifndef OS_TYPE +#define OS_TYPE + +enum OsType +{ + OS_UNKNOWN, + OS_LINUX, + OS_MAC, + OS_WINDOWS +}; + +#endif // OS_TYPE diff --git a/src/lib_cxx/project/SourceGroupCxx.cpp b/src/lib_cxx/project/SourceGroupCxx.cpp index f4b9f259..7387f1e8 100644 --- a/src/lib_cxx/project/SourceGroupCxx.cpp +++ b/src/lib_cxx/project/SourceGroupCxx.cpp @@ -106,7 +106,16 @@ std::vector> SourceGroupCxx::getIndexerCommands( utility::append(frameworkSearchPaths, m_settings->getFrameworkSearchPathsExpandedAndAbsolute()); utility::append(frameworkSearchPaths, appSettings->getFrameworkSearchPathsExpanded()); - const std::vector compilerFlags = m_settings->getCompilerFlags(); + std::vector compilerFlags; + { + const std::string targetFlag = m_settings->getTargetFlag(); + if (!targetFlag.empty()) + { + compilerFlags.push_back(targetFlag); + } + } + + utility::append(compilerFlags, m_settings->getCompilerFlags()); std::set indexedPaths; for (FilePath p: m_settings->getSourcePathsExpandedAndAbsolute()) diff --git a/src/lib_gui/CMakeLists.txt b/src/lib_gui/CMakeLists.txt index 31aaa36a..89d1415d 100644 --- a/src/lib_gui/CMakeLists.txt +++ b/src/lib_gui/CMakeLists.txt @@ -166,6 +166,8 @@ add_files( qt/window/project_wizzard/QtProjectWizzardContent.h qt/window/project_wizzard/QtProjectWizzardContentCDBSource.cpp qt/window/project_wizzard/QtProjectWizzardContentCDBSource.h + qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.cpp + qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.h qt/window/project_wizzard/QtProjectWizzardContentExtensions.cpp qt/window/project_wizzard/QtProjectWizzardContentExtensions.h qt/window/project_wizzard/QtProjectWizzardContentFlags.cpp diff --git a/src/lib_gui/qt/element/QtDirectoryListBox.cpp b/src/lib_gui/qt/element/QtDirectoryListBox.cpp index 2d8c9ced..04cb52a3 100644 --- a/src/lib_gui/qt/element/QtDirectoryListBox.cpp +++ b/src/lib_gui/qt/element/QtDirectoryListBox.cpp @@ -4,16 +4,15 @@ #include #include #include -#include #include #include -#include "utility/ResourcePaths.h" -#include "utility/utilityString.h" - #include "qt/element/QtIconButton.h" #include "qt/utility/utilityQt.h" #include "qt/window/QtTextEditDialog.h" +#include "utility/ResourcePaths.h" +#include "utility/utilityApp.h" +#include "utility/utilityString.h" QtListItemWidget::QtListItemWidget(QtDirectoryListBox* list, QListWidgetItem* item, QWidget *parent) : QWidget(parent) @@ -80,7 +79,7 @@ void QtListItemWidget::handleButtonPress() { QFileDialog dialog(this); - if (QSysInfo::macVersion() == QSysInfo::MV_None) + if (utility::getOsType() != OS_MAC) { dialog.setFileMode(QFileDialog::Directory); } diff --git a/src/lib_gui/qt/graphics/QtGraphicsView.cpp b/src/lib_gui/qt/graphics/QtGraphicsView.cpp index 12845e12..6ac5aa5c 100644 --- a/src/lib_gui/qt/graphics/QtGraphicsView.cpp +++ b/src/lib_gui/qt/graphics/QtGraphicsView.cpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #include @@ -18,6 +17,7 @@ #include "qt/utility/utilityQt.h" #include "settings/ApplicationSettings.h" #include "utility/messaging/type/MessageDisplayBookmarkCreator.h" +#include "utility/utilityApp.h" #include "utility/ResourcePaths.h" QtGraphicsView::QtGraphicsView(QWidget* parent) @@ -32,7 +32,7 @@ QtGraphicsView::QtGraphicsView(QWidget* parent) , m_zoomInButtonSpeed(20.0f) , m_zoomOutButtonSpeed(-20.0f) { - QString modifierName = QSysInfo::macVersion() == QSysInfo::MV_None ? "Ctrl" : "Cmd"; + QString modifierName = utility::getOsType() == OS_MAC ? "Cmd" : "Ctrl"; setTransformationAnchor(QGraphicsView::AnchorUnderMouse); diff --git a/src/lib_gui/qt/network/QtUpdateChecker.cpp b/src/lib_gui/qt/network/QtUpdateChecker.cpp index 77ebae68..77338327 100644 --- a/src/lib_gui/qt/network/QtUpdateChecker.cpp +++ b/src/lib_gui/qt/network/QtUpdateChecker.cpp @@ -11,6 +11,7 @@ #include "settings/ApplicationSettings.h" #include "utility/Version.h" #include "utility/utility.h" +#include "utility/utilityApp.h" #include "utility/utilityUuid.h" void QtUpdateChecker::check(bool force) @@ -30,17 +31,19 @@ void QtUpdateChecker::check(bool force) // OS std::string osString; - #if defined(Q_OS_WIN) - osString = "windows"; - #elif defined(Q_OS_MACOS) - osString = "macOS"; - #elif defined(Q_OS_LINUX) - osString = "linux"; - #endif - - if (!osString.size()) + switch (utility::getOsType()) { - return; + case OS_WINDOWS: + osString = "windows"; + break; + case OS_MAC: + osString = "macOS"; + break; + case OS_LINUX: + osString = "linux"; + break; + default: + return; } urlString += ("?os=" + osString).c_str(); diff --git a/src/lib_gui/qt/view/QtGraphViewStyleImpl.cpp b/src/lib_gui/qt/view/QtGraphViewStyleImpl.cpp index 7f37a7f5..868ab2ae 100644 --- a/src/lib_gui/qt/view/QtGraphViewStyleImpl.cpp +++ b/src/lib_gui/qt/view/QtGraphViewStyleImpl.cpp @@ -1,9 +1,9 @@ #include "qt/view/QtGraphViewStyleImpl.h" #include -#include #include "qt/view/graphElements/QtGraphNode.h" +#include "utility/utilityApp.h" QtGraphViewStyleImpl::~QtGraphViewStyleImpl() { @@ -21,10 +21,10 @@ float QtGraphViewStyleImpl::getCharHeightForNodeType(Node::NodeType type) float QtGraphViewStyleImpl::getGraphViewZoomDifferenceForPlatform() { - if (QSysInfo::macVersion() == QSysInfo::MV_None) + if (utility::getOsType() == OS_MAC) { - return 1.25; + return 1; } - return 1; + return 1.25; } diff --git a/src/lib_gui/qt/window/QtMainWindow.cpp b/src/lib_gui/qt/window/QtMainWindow.cpp index 7669db9c..195ed387 100644 --- a/src/lib_gui/qt/window/QtMainWindow.cpp +++ b/src/lib_gui/qt/window/QtMainWindow.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include "Application.h" @@ -50,6 +49,7 @@ #include "utility/ResourcePaths.h" #include "utility/tracing.h" #include "utility/UserPaths.h" +#include "utility/utilityApp.h" #include "utility/utilityString.h" @@ -752,7 +752,7 @@ void QtMainWindow::setupEditMenu() menuBar()->addMenu(menu); m_trialDisabledActions.push_back(menu->addAction(tr("&Refresh"), this, &QtMainWindow::refresh, QKeySequence::Refresh)); - if (QSysInfo::windowsVersion() != QSysInfo::WV_None) + if (utility::getOsType() == OS_WINDOWS) { m_trialDisabledActions.push_back( menu->addAction(tr("&Full Refresh"), this, &QtMainWindow::forceRefresh, QKeySequence(Qt::SHIFT + Qt::Key_F5)) diff --git a/src/lib_gui/qt/window/QtPreferencesWindow.cpp b/src/lib_gui/qt/window/QtPreferencesWindow.cpp index 028e3746..bf1a0daf 100644 --- a/src/lib_gui/qt/window/QtPreferencesWindow.cpp +++ b/src/lib_gui/qt/window/QtPreferencesWindow.cpp @@ -9,6 +9,7 @@ #include "qt/window/project_wizzard/QtProjectWizzardContentPaths.h" #include "qt/window/project_wizzard/QtProjectWizzardContentPreferences.h" #include "qt/window/project_wizzard/QtProjectWizzardContentSummary.h" +#include "utility/utilityApp.h" QtPreferencesWindow::QtPreferencesWindow(QWidget* parent) : QtProjectWizzardWindow(parent) @@ -27,7 +28,7 @@ QtPreferencesWindow::QtPreferencesWindow(QWidget* parent) summary->addContent(new QtProjectWizzardContentPreferences(this)); summary->addContent(new QtProjectWizzardContentPathsHeaderSearchGlobal(this)); - if (QSysInfo::macVersion() != QSysInfo::MV_None) + if (utility::getOsType() == OS_MAC) { summary->addContent(new QtProjectWizzardContentPathsFrameworkSearchGlobal(this)); } diff --git a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.cpp b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.cpp index 08c5e5b8..a631a1d3 100644 --- a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.cpp +++ b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzard.cpp @@ -8,6 +8,7 @@ #include "qt/window/project_wizzard/QtProjectWizzardContent.h" #include "qt/window/project_wizzard/QtProjectWizzardContentCDBSource.h" +#include "qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.h" #include "qt/window/project_wizzard/QtProjectWizzardContentExtensions.h" #include "qt/window/project_wizzard/QtProjectWizzardContentFlags.h" #include "qt/window/project_wizzard/QtProjectWizzardContentLanguageAndStandard.h" @@ -25,6 +26,7 @@ #include "utility/messaging/type/MessageStatus.h" #include "utility/ResourcePaths.h" #include "utility/utility.h" +#include "utility/utilityApp.h" #include "utility/utilityPathDetection.h" #include "utility/utilityString.h" #include "utility/utilityUuid.h" @@ -419,7 +421,7 @@ void QtProjectWizzard::selectedSourceGroupChanged(int index) } else { - const bool isCDB = group->getType() == SOURCE_GROUP_CXX_CDB || group->getType() == SOURCE_GROUP_CXX_CDB; + const bool isCDB = group->getType() == SOURCE_GROUP_CXX_CDB; if (isCDB) { @@ -434,6 +436,8 @@ void QtProjectWizzard::selectedSourceGroupChanged(int index) { summary->addContent(new QtProjectWizzardContentLanguageAndStandard(group, this)); summary->addSpace(); + summary->addContent(new QtProjectWizzardContentCrossCompilationOptions(group, this)); + summary->addSpace(); summary->addContent(new QtProjectWizzardContentPathsSource(group, this)); summary->addContent(new QtProjectWizzardContentExtensions(group, this)); @@ -452,7 +456,7 @@ void QtProjectWizzard::selectedSourceGroupChanged(int index) summary->addContent(new QtProjectWizzardContentPathsHeaderSearchGlobal(this)); summary->addSpace(); - if (QSysInfo::macVersion() != QSysInfo::MV_None) + if (utility::getOsType() == OS_MAC) { summary->addContent(new QtProjectWizzardContentPathsFrameworkSearch(group, this, isCDB)); summary->addContent(new QtProjectWizzardContentPathsFrameworkSearchGlobal(this)); @@ -644,11 +648,20 @@ void QtProjectWizzard::selectedProjectType(SourceGroupType sourceGroupType) void QtProjectWizzard::emptySourceGroup() { - QtProjectWizzardWindow* window = createWindowWithContent( - [this](QtProjectWizzardWindow* window) + QtProjectWizzardWindow* window = createWindowWithSummary( + [this](QtProjectWizzardWindow* window, QtProjectWizzardContentSummary* summary) { - window->setPreferredSize(QSize(470, 230)); - return new QtProjectWizzardContentLanguageAndStandard(m_newSourceGroupSettings, window); + summary->addContent(new QtProjectWizzardContentLanguageAndStandard(m_newSourceGroupSettings, window)); + if (m_newSourceGroupSettings->getType() == SOURCE_GROUP_C_EMPTY|| + m_newSourceGroupSettings->getType() == SOURCE_GROUP_CPP_EMPTY) + { + summary->addContent(new QtProjectWizzardContentCrossCompilationOptions(m_newSourceGroupSettings, window)); + window->setPreferredSize(QSize(470, 460)); + } + else + { + window->setPreferredSize(QSize(470, 230)); + } } ); @@ -731,7 +744,7 @@ void QtProjectWizzard::headerSearchPaths() void QtProjectWizzard::headerSearchPathsDone() { - if (QSysInfo::macVersion() != QSysInfo::MV_None) + if (utility::getOsType() == OS_MAC) { frameworkSearchPaths(); } diff --git a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.cpp b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.cpp new file mode 100644 index 00000000..fca81e77 --- /dev/null +++ b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.cpp @@ -0,0 +1,173 @@ +#include "qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.h" + +#include +#include +#include + +#include "settings/SourceGroupSettings.h" +#include "settings/SourceGroupSettingsCxx.h" +#include "utility/logging/logging.h" + +QtProjectWizzardContentCrossCompilationOptions::QtProjectWizzardContentCrossCompilationOptions( + std::shared_ptr sourceGroupSettings, + QtProjectWizzardWindow* window +) + : QtProjectWizzardContent(window) + , m_sourceGroupSettings(sourceGroupSettings) + , m_useTargetOptions(nullptr) + , m_arch(nullptr) + , m_vendor(nullptr) + , m_sys(nullptr) + , m_abi(nullptr) +{ +} + +void QtProjectWizzardContentCrossCompilationOptions::populate(QGridLayout* layout, int& row) +{ + if (!isInForm()) + { + layout->setRowMinimumHeight(row, 15); + row++; + } + + layout->addWidget(createFormLabel("Cross-Compilation"), row, QtProjectWizzardWindow::FRONT_COL, Qt::AlignRight); + addHelpButton( + "

Use these options to specify the target architecture for the provided source code. Even though Sourcetrail will " + "not generate a target binary, providing these options will affect which headers the indexer will be looking for " + "while analyzing your source code.

" + "

If you are not sure which value to pick for a certain option just choose \"unknown\" and Sourcetrail will try " + "to guess the correct value.

", + layout, row + ); + + { + m_useTargetOptions = new QCheckBox("Use specific target"); + connect(m_useTargetOptions, &QCheckBox::stateChanged, this, &QtProjectWizzardContentCrossCompilationOptions::onUseTargetOptionsChanged); + + QHBoxLayout* rowLayout = new QHBoxLayout(); + rowLayout->setContentsMargins(0, 0, 0, 0); + rowLayout->addWidget(m_useTargetOptions); + + QWidget* rowWidget = new QWidget(); + rowWidget->setLayout(rowLayout); + + layout->addWidget(rowWidget, row, QtProjectWizzardWindow::BACK_COL, Qt::AlignLeft | Qt::AlignTop); + row++; + } + + QGridLayout* gridLayout = new QGridLayout(); + + { + QLabel* label = new QLabel("Architecture:"); + + m_arch = new QComboBox(); + std::vector archTypes = SourceGroupSettingsCxx::getAvailableArchTypes(); + std::sort(archTypes.begin(), archTypes.end()); + for (size_t i = 0; i < archTypes.size(); i++) + { + m_arch->insertItem(i, archTypes[i].c_str()); + } + m_arch->setCurrentIndex(m_arch->findText("x86_64")); + + gridLayout->addWidget(label, 0, 0, Qt::AlignRight); + gridLayout->addWidget(m_arch, 0, 1, Qt::AlignLeft); + } + + { + QLabel* label = new QLabel("Vendor:"); + + m_vendor = new QComboBox(); + std::vector vendorTypes = SourceGroupSettingsCxx::getAvailableVendorTypes(); + std::sort(vendorTypes.begin() + 1, vendorTypes.end()); + for (size_t i = 0; i < vendorTypes.size(); i++) + { + m_vendor->insertItem(i, vendorTypes[i].c_str()); + } + + gridLayout->addWidget(label, 1, 0, Qt::AlignRight); + gridLayout->addWidget(m_vendor, 1, 1, Qt::AlignLeft); + } + + { + QLabel* label = new QLabel("OS:"); + + m_sys = new QComboBox(); + std::vector osTypes = SourceGroupSettingsCxx::getAvailableOsTypes(); + std::sort(osTypes.begin() + 1, osTypes.end()); + for (size_t i = 0; i < osTypes.size(); i++) + { + m_sys->insertItem(i, osTypes[i].c_str()); + } + + gridLayout->addWidget(label, 2, 0, Qt::AlignRight); + gridLayout->addWidget(m_sys, 2, 1, Qt::AlignLeft); + } + + { + QLabel* label = new QLabel("Environment:"); + + m_abi = new QComboBox(); + std::vector environmentTypes = SourceGroupSettingsCxx::getAvailableEnvironmentTypes(); + std::sort(environmentTypes.begin() + 1, environmentTypes.end()); + for (size_t i = 0; i < environmentTypes.size(); i++) + { + m_abi->insertItem(i, environmentTypes[i].c_str()); + } + + gridLayout->addWidget(label, 3, 0, Qt::AlignRight); + gridLayout->addWidget(m_abi, 3, 1, Qt::AlignLeft); + } + + layout->addLayout(gridLayout, row++, QtProjectWizzardWindow::BACK_COL, Qt::AlignLeft | Qt::AlignTop); + + if (!isInForm()) + { + layout->setRowMinimumHeight(row, 15); + layout->setRowStretch(row, 1); + } +} + +void QtProjectWizzardContentCrossCompilationOptions::load() +{ + if (std::shared_ptr cxxSettings = std::dynamic_pointer_cast(m_sourceGroupSettings)) + { + m_useTargetOptions->setChecked(cxxSettings->getTargetOptionsEnabled()); + m_arch->setCurrentText(QString::fromStdString(cxxSettings->getTargetArch())); + m_vendor->setCurrentText(QString::fromStdString(cxxSettings->getTargetVendor())); + m_sys->setCurrentText(QString::fromStdString(cxxSettings->getTargetSys())); + m_abi->setCurrentText(QString::fromStdString(cxxSettings->getTargetAbi())); + } + + updateTargetOptionsEnabled(); +} + +void QtProjectWizzardContentCrossCompilationOptions::save() +{ + if (std::shared_ptr cxxSettings = std::dynamic_pointer_cast(m_sourceGroupSettings)) + { + cxxSettings->setTargetOptionsEnabled(m_useTargetOptions->isChecked()); + cxxSettings->setTargetArch(m_arch->currentText().toStdString()); + cxxSettings->setTargetVendor(m_vendor->currentText().toStdString()); + cxxSettings->setTargetSys(m_sys->currentText().toStdString()); + cxxSettings->setTargetAbi(m_abi->currentText().toStdString()); + } +} + +bool QtProjectWizzardContentCrossCompilationOptions::check() +{ + return true; +} + +void QtProjectWizzardContentCrossCompilationOptions::onUseTargetOptionsChanged() +{ + updateTargetOptionsEnabled(); +} + +void QtProjectWizzardContentCrossCompilationOptions::updateTargetOptionsEnabled() +{ + const bool useTargetOptions = m_useTargetOptions->isChecked(); + m_arch->setEnabled(useTargetOptions); + m_vendor->setEnabled(useTargetOptions); + m_sys->setEnabled(useTargetOptions); + m_abi->setEnabled(useTargetOptions); +} diff --git a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.h b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.h new file mode 100644 index 00000000..d5829841 --- /dev/null +++ b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentCrossCompilationOptions.h @@ -0,0 +1,41 @@ +#ifndef QT_PROJECT_WIZZARD_CONTENT_CROSS_COMPILATION_OPTIONS +#define QT_PROJECT_WIZZARD_CONTENT_CROSS_COMPILATION_OPTIONS + +#include "qt/window/project_wizzard/QtProjectWizzardContent.h" + +class QCheckBox; +class QComboBox; +class QLabel; +class SourceGroupSettings; + +class QtProjectWizzardContentCrossCompilationOptions + : public QtProjectWizzardContent +{ + Q_OBJECT + +public: + QtProjectWizzardContentCrossCompilationOptions( + std::shared_ptr sourceGroupSettings, + QtProjectWizzardWindow* window); + + // QtProjectWizzardContent implementation + virtual void populate(QGridLayout* layout, int& row) override; + + virtual void load() override; + virtual void save() override; + virtual bool check() override; + +private: + void onUseTargetOptionsChanged(); + void updateTargetOptionsEnabled(); + + std::shared_ptr m_sourceGroupSettings; + + QCheckBox* m_useTargetOptions; + QComboBox* m_arch; + QComboBox* m_vendor; + QComboBox* m_sys; + QComboBox* m_abi; +}; + +#endif // QT_PROJECT_WIZZARD_CONTENT_CROSS_COMPILATION_OPTIONS diff --git a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.cpp b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.cpp index 996ea426..84bdca85 100644 --- a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.cpp +++ b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPreferences.cpp @@ -88,7 +88,7 @@ void QtProjectWizzardContentPreferences::populate(QGridLayout* layout, int& row) ); // graph zooming - QString modifierName = QSysInfo::macVersion() == QSysInfo::MV_None ? "Ctrl" : "Cmd"; + QString modifierName =utility::getOsType() == OS_MAC ? "Cmd" : "Ctrl"; m_graphZooming = addCheckBox( "Graph Zoom", "Zoom on mouse wheel", @@ -159,20 +159,23 @@ void QtProjectWizzardContentPreferences::populate(QGridLayout* layout, int& row) // jvm library path m_javaPath = new QtLocationPicker(this); - if (QSysInfo::windowsVersion() != QSysInfo::WV_None) + switch (utility::getOsType()) { + case OS_WINDOWS: m_javaPath->setFileFilter("JVM Library (jvm.dll)"); m_javaPath->setPlaceholderText("/bin/client/jvm.dll"); - } - else if (QSysInfo::macVersion() != QSysInfo::MV_None) - { + break; + case OS_MAC: m_javaPath->setFileFilter("JLI or JVM Library (libjli.dylib libjvm.dylib)"); m_javaPath->setPlaceholderText("/Contents/Home/jre/lib/jli/libjli.dylib"); - } - else - { + break; + case OS_LINUX: m_javaPath->setFileFilter("JVM Library (libjvm.so)"); m_javaPath->setPlaceholderText("/bin//server/libjvm.so"); + break; + default: + LOG_WARNING("No placeholders and filters set for Java path selection"); + break; } addLabelAndWidget("Java Path", m_javaPath, layout, row); diff --git a/src/lib_gui/utility/utilityApp.cpp b/src/lib_gui/utility/utilityApp.cpp index 8720de0f..3818cfb2 100644 --- a/src/lib_gui/utility/utilityApp.cpp +++ b/src/lib_gui/utility/utilityApp.cpp @@ -1,13 +1,12 @@ #include "utility/utilityApp.h" #include +#include #include #include #include "utility/utilityString.h" -#include - namespace utility { std::mutex s_runningProcessesMutex; @@ -78,6 +77,23 @@ void utility::killRunningProcesses() } } +OsType utility::getOsType() +{ + if (QSysInfo::windowsVersion() != QSysInfo::WV_None) + { + return OS_WINDOWS; + } + else if (QSysInfo::macVersion() != QSysInfo::MV_None) + { + return OS_MAC; + } + else + { + return OS_LINUX; + } + return OS_UNKNOWN; +} + int utility::getIdealThreadCount() { return QThread::idealThreadCount(); diff --git a/src/lib_gui/utility/utilityApp.h b/src/lib_gui/utility/utilityApp.h index 032f257e..b561bfda 100644 --- a/src/lib_gui/utility/utilityApp.h +++ b/src/lib_gui/utility/utilityApp.h @@ -5,6 +5,8 @@ #include #include +#include "utility/OsType.h" + namespace utility { std::string executeProcess(const std::string& command, const std::string& workingDirectory = "", int timeout = 30000); @@ -13,6 +15,8 @@ namespace utility void killRunningProcesses(); int getIdealThreadCount(); + + OsType getOsType(); } #endif // UTILITY_APP_H diff --git a/src/lib_gui/utility/utilityPathDetection.cpp b/src/lib_gui/utility/utilityPathDetection.cpp index a5721ea0..a051a195 100644 --- a/src/lib_gui/utility/utilityPathDetection.cpp +++ b/src/lib_gui/utility/utilityPathDetection.cpp @@ -1,6 +1,6 @@ #include "utility/utilityPathDetection.h" -#include +#include "utility/logging/logging.h" #include "utility/path_detector/java_runtime/JavaPathDetectorLinux.h" #include "utility/path_detector/java_runtime/JavaPathDetectorMac.h" @@ -17,20 +17,26 @@ #include "utility/path_detector/cxx_header/CxxHeaderPathDetector.h" #include "utility/path_detector/cxx_header/CxxVsHeaderPathDetector.h" +#include "utility/utilityApp.h" + std::shared_ptr utility::getJavaRuntimePathDetector() { std::shared_ptr combinedDetector = std::make_shared(); - if (QSysInfo::windowsVersion() != QSysInfo::WV_None) + + switch (utility::getOsType()) { + case OS_WINDOWS: combinedDetector->addDetector(std::make_shared("1.8")); - } - else if (QSysInfo::macVersion() != QSysInfo::MV_None) - { + break; + case OS_MAC: combinedDetector->addDetector(std::make_shared("1.8")); - } - else - { + break; + case OS_LINUX: combinedDetector->addDetector(std::make_shared("1.8")); + break; + default: + LOG_WARNING("No suitable Java Runtime path detector found"); + break; } return combinedDetector; @@ -39,17 +45,21 @@ std::shared_ptr utility::getJavaRuntimePathDetector() std::shared_ptr utility::getJreSystemLibraryPathsDetector() { std::shared_ptr combinedDetector = std::make_shared(); - if (QSysInfo::windowsVersion() != QSysInfo::WV_None) + + switch (utility::getOsType()) { + case OS_WINDOWS: combinedDetector->addDetector(std::make_shared("1.8")); - } - else if (QSysInfo::macVersion() != QSysInfo::MV_None) - { + break; + case OS_MAC: combinedDetector->addDetector(std::make_shared("1.8")); - } - else - { + break; + case OS_LINUX: combinedDetector->addDetector(std::make_shared("1.8")); + break; + default: + LOG_WARNING("No suitable JRE system library path detector found"); + break; } return combinedDetector; @@ -58,13 +68,19 @@ std::shared_ptr utility::getJreSystemLibraryPathsDetector( std::shared_ptr utility::getMavenExecutablePathDetector() { std::shared_ptr combinedDetector = std::make_shared(); - if (QSysInfo::windowsVersion() != QSysInfo::WV_None) + + switch (utility::getOsType()) { + case OS_WINDOWS: combinedDetector->addDetector(std::make_shared()); - } - else - { + break; + case OS_MAC: + case OS_LINUX: combinedDetector->addDetector(std::make_shared()); + break; + default: + LOG_WARNING("No suitable Maven path detector found"); + break; } return combinedDetector; diff --git a/src/lib_java/data/parser/java/JavaParser.h b/src/lib_java/data/parser/java/JavaParser.h index 347e4455..8848a2ef 100644 --- a/src/lib_java/data/parser/java/JavaParser.h +++ b/src/lib_java/data/parser/java/JavaParser.h @@ -154,6 +154,8 @@ private: { LOG_ERROR("parser with id " + std::to_string(parserId) + " not found"); } + + return false; } static int s_nextParserId;