From e8727fcae25d96da9e55bb5a98dde813e4e5dfa0 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 24 Jul 2019 15:12:16 +0200 Subject: [PATCH 1/4] Squish: Clean up single (left) mouse clicks on items or objects Do no more use pixels as offset if we can handle this without. Clicking on items by using an (x, y) offset will likely fail if running on a machine with a different DPI setting. Change-Id: I0e5a4985104bd1d68aadf8c5534583fa1b048edb Reviewed-by: Robert Loehning --- tests/system/shared/clang.py | 3 +-- tests/system/shared/debugger.py | 2 +- tests/system/shared/project.py | 6 ++--- tests/system/shared/suites_qtta.py | 2 +- tests/system/shared/utils.py | 26 +++++++------------ tests/system/suite_APTW/tst_APTW03/test.py | 2 +- tests/system/suite_CSUP/tst_CSUP02/test.py | 2 +- tests/system/suite_CSUP/tst_CSUP05/test.py | 2 +- tests/system/suite_HELP/tst_HELP02/test.py | 5 ++-- tests/system/suite_HELP/tst_HELP06/test.py | 6 ++--- tests/system/suite_QMLS/tst_QMLS03/test.py | 4 +-- .../suite_debugger/tst_qml_js_console/test.py | 4 +-- .../suite_editors/tst_edit_externally/test.py | 2 +- .../tst_generic_highlighter/test.py | 6 ++--- .../tst_create_proj_wizard/test.py | 6 ++--- .../tst_default_settings/test.py | 5 ++-- .../tst_installed_languages/test.py | 3 +-- .../suite_general/tst_remove_kits/test.py | 3 +-- .../tst_save_before_build/test.py | 3 +-- .../tst_session_handling/test.py | 6 ++--- .../suite_tools/tst_codepasting/test.py | 3 +-- .../suite_tools/tst_designer_edit/test.py | 2 +- .../tst_designer_goto_slot/test.py | 3 +-- .../system/suite_tools/tst_git_local/test.py | 2 +- 24 files changed, 47 insertions(+), 61 deletions(-) diff --git a/tests/system/shared/clang.py b/tests/system/shared/clang.py index 04cd836e66a..99bb1b6f947 100644 --- a/tests/system/shared/clang.py +++ b/tests/system/shared/clang.py @@ -53,8 +53,7 @@ def startCreatorVerifyingClang(useClang): def __openCodeModelOptions__(): invokeMenuItem("Tools", "Options...") - waitForObjectItem(":Options_QListView", "C++") - clickItem(":Options_QListView", "C++", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "C++")) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Code Model") def getCodeModelString(useClang): diff --git a/tests/system/shared/debugger.py b/tests/system/shared/debugger.py index 77632241f3b..930e74980f3 100644 --- a/tests/system/shared/debugger.py +++ b/tests/system/shared/debugger.py @@ -55,7 +55,7 @@ def takeDebuggerLog(): debuggerLogWindow = waitForObject("{container=':DebugModeWidget.Debugger Log_QDockWidget' " "type='Debugger::Internal::DebuggerPane' unnamed='1' visible='1'}") debuggerLog = str(debuggerLogWindow.plainText) - mouseClick(debuggerLogWindow, 5, 5, 0, Qt.LeftButton) + mouseClick(debuggerLogWindow) invokeContextMenuItem(debuggerLogWindow, "Clear Contents") waitFor("str(debuggerLogWindow.plainText)==''", 5000) invokeMenuItem("Window", "Views", "Global Debugger Log") diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index 8250891b717..2337f4fc4ff 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -88,11 +88,11 @@ def __createProjectOrFileSelectType__(category, template, fromWelcome = False, i invokeMenuItem("File", "New File or Project...") categoriesView = waitForObject(":New.templateCategoryView_QTreeView") if isProject: - clickItem(categoriesView, "Projects." + category, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(categoriesView, "Projects." + category)) else: - clickItem(categoriesView, "Files and Classes." + category, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(categoriesView, "Files and Classes." + category)) templatesView = waitForObject("{name='templatesView' type='QListView'}") - clickItem(templatesView, template, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(templatesView, template)) text = waitForObject("{type='QTextBrowser' name='templateDescription' visible='1'}").plainText clickButton(waitForObject("{text='Choose...' type='QPushButton' unnamed='1' visible='1'}")) return __getSupportedPlatforms__(str(text), template)[0] diff --git a/tests/system/shared/suites_qtta.py b/tests/system/shared/suites_qtta.py index 73eb4ee413e..f70b3cb1036 100755 --- a/tests/system/shared/suites_qtta.py +++ b/tests/system/shared/suites_qtta.py @@ -62,7 +62,7 @@ def checkSyntaxError(issuesView, expectedTextsArray, warnIfMoreIssues = True): # change autocomplete options to manual def changeAutocompleteToManual(toManual=True): invokeMenuItem("Tools", "Options...") - mouseClick(waitForObjectItem(":Options_QListView", "Text Editor"), 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Text Editor")) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Completion") ensureChecked(waitForObject(":Behavior.Autocomplete common prefix_QCheckBox"), not toManual) activateCompletion = "Always" diff --git a/tests/system/shared/utils.py b/tests/system/shared/utils.py index 36b5fbfc4e8..ae6bfc1f5ca 100644 --- a/tests/system/shared/utils.py +++ b/tests/system/shared/utils.py @@ -65,7 +65,7 @@ def ensureChecked(objectName, shouldBeChecked = True, timeout=20000): except: # widgets not derived from QCheckbox don't have checkState() if not waitFor('widget.checked == shouldBeChecked', 1500): - mouseClick(widget, 10, 6, 0, Qt.LeftButton) + mouseClick(widget) test.verify(waitFor("widget.checked == shouldBeChecked", 1000)) test.log("New state for QCheckBox: %s" % state, str(objectName)) @@ -97,9 +97,9 @@ def selectFromCombo(objectSpec, itemName): if itemName == str(object.currentText): return False else: - mouseClick(object, 5, 5, 0, Qt.LeftButton) + mouseClick(object) snooze(1) - mouseClick(waitForObjectItem(object, itemName.replace(".", "\\.")), 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(object, itemName.replace(".", "\\."))) test.verify(waitFor("str(object.currentText)==itemName", 5000), "Switched combo item to '%s'" % itemName) return True @@ -277,8 +277,7 @@ def selectFromFileDialog(fileName, waitForFile=False, ignoreFinalSnooze=False): # param which a list/tuple of the paths to the qch files to be added def addHelpDocumentation(which): invokeMenuItem("Tools", "Options...") - waitForObjectItem(":Options_QListView", "Help") - clickItem(":Options_QListView", "Help", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Help")) waitForObject("{container=':Options.qt_tabwidget_tabbar_QTabBar' type='TabItem' text='Documentation'}") clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Documentation") # get rid of all docs already registered @@ -304,8 +303,7 @@ def addCurrentCreatorDocumentation(): test.fatal("Missing current Qt Creator documentation (expected in %s)" % docPath) return invokeMenuItem("Tools", "Options...") - waitForObjectItem(":Options_QListView", "Help") - clickItem(":Options_QListView", "Help", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Help")) waitForObject("{container=':Options.qt_tabwidget_tabbar_QTabBar' type='TabItem' text='Documentation'}") clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Documentation") clickButton(waitForObject("{type='QPushButton' name='addButton' visible='1' text='Add...'}")) @@ -361,8 +359,7 @@ def getConfiguredKits(): return str(treeView.currentIndex().data().toString()) # end of internal function for iterateQtVersions def __setQtVersionForKit__(kit, kitName, kitsQtVersionName): - treeView = waitForObject(":BuildAndRun_QTreeView") - clickItem(treeView, kit, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":BuildAndRun_QTreeView", kit)) qtVersionStr = str(waitForObject(":Kits_QtVersion_QComboBox").currentText) kitsQtVersionName[kitName] = qtVersionStr # end of internal function for iterate kits @@ -433,8 +430,7 @@ def iterateQtVersions(keepOptionsOpen=False, alreadyOnOptionsDialog=False, additionalResult = [] if not alreadyOnOptionsDialog: invokeMenuItem("Tools", "Options...") - waitForObjectItem(":Options_QListView", "Kits") - clickItem(":Options_QListView", "Kits", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Kits")) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Qt Versions") pattern = re.compile("Qt version (?P.*?) for (?P.*)") treeView = waitForObject(":qtdirList_QTreeView") @@ -443,7 +439,7 @@ def iterateQtVersions(keepOptionsOpen=False, alreadyOnOptionsDialog=False, rootChildText = str(rootIndex.data()).replace(".", "\\.").replace("_", "\\_") for subIndex in dumpIndices(model, rootIndex): subChildText = str(subIndex.data()).replace(".", "\\.").replace("_", "\\_") - clickItem(treeView, ".".join([rootChildText,subChildText]), 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(treeView, ".".join([rootChildText,subChildText]))) currentText = str(waitForObject(":QtSupport__Internal__QtVersionManager.QLabel").text) matches = pattern.match(currentText) if matches: @@ -493,8 +489,7 @@ def iterateKits(keepOptionsOpen=False, alreadyOnOptionsDialog=False, additionalResult = [] if not alreadyOnOptionsDialog: invokeMenuItem("Tools", "Options...") - waitForObjectItem(":Options_QListView", "Build & Run") - clickItem(":Options_QListView", "Kits", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Kits")) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Kits") treeView = waitForObject(":BuildAndRun_QTreeView") model = treeView.model() @@ -539,8 +534,7 @@ class HelpViewer: def setFixedHelpViewer(helpViewer): invokeMenuItem("Tools", "Options...") - waitForObjectItem(":Options_QListView", "Help") - clickItem(":Options_QListView", "Help", 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Help")) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "General") mode = "Always Show " if helpViewer == HelpViewer.HELPMODE: diff --git a/tests/system/suite_APTW/tst_APTW03/test.py b/tests/system/suite_APTW/tst_APTW03/test.py index 521a3f1772e..04048854b86 100644 --- a/tests/system/suite_APTW/tst_APTW03/test.py +++ b/tests/system/suite_APTW/tst_APTW03/test.py @@ -29,7 +29,7 @@ def handleInsertVirtualFunctions(expected, toAdd): def __checkVirtualFunction(treeView, classIndex, isCheckedF, child): item = "%s.%s" % (str(classIndex.text), str(child.text)) test.log("Checking '%s'." % item) - clickItem(treeView, item.replace("_", "\\_"), 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(treeView, item.replace("_", "\\_"))) test.verify(waitFor("isCheckedF(child)", 1000), "Function must be checked after clicking") treeView = waitForObject("{container={title='Functions to insert:' type='QGroupBox' unnamed='1'" diff --git a/tests/system/suite_CSUP/tst_CSUP02/test.py b/tests/system/suite_CSUP/tst_CSUP02/test.py index 44ea2595e45..0c0e8331563 100644 --- a/tests/system/suite_CSUP/tst_CSUP02/test.py +++ b/tests/system/suite_CSUP/tst_CSUP02/test.py @@ -52,7 +52,7 @@ def main(): # Steps 3&4: Insert text "class" to new line in Editor mode and press Ctrl+Space. # Focus "class derived from QObject" in the list and press Tab or Enter to complete the code. editorWidget = findObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget") - mouseClick(editorWidget, 5, 5, 0, Qt.LeftButton) + mouseClick(editorWidget) jumpToFirstLine(editorWidget) type(editorWidget, "") type(editorWidget, "") diff --git a/tests/system/suite_CSUP/tst_CSUP05/test.py b/tests/system/suite_CSUP/tst_CSUP05/test.py index 62be1a02e19..c9f3cb892d1 100644 --- a/tests/system/suite_CSUP/tst_CSUP05/test.py +++ b/tests/system/suite_CSUP/tst_CSUP05/test.py @@ -69,7 +69,7 @@ def main(): replaceEditorContent(waitForObject(":Qt Creator.replaceEdit_Utils::FilterLineEdit"), "find") oldCodeText = str(editorWidget.plainText) clickButton(waitForObject(":Qt Creator.Replace All_QToolButton")) - mouseClick(waitForObject(":Qt Creator.replaceEdit_Utils::FilterLineEdit"), 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObject(":Qt Creator.replaceEdit_Utils::FilterLineEdit")) newCodeText = str(editorWidget.plainText) test.compare(newCodeText, oldCodeText.replace("window", "find").replace("Window", "find"), "Verifying if: Found text is replaced with new word properly.") diff --git a/tests/system/suite_HELP/tst_HELP02/test.py b/tests/system/suite_HELP/tst_HELP02/test.py index a1755679d7f..2eb09773b1b 100755 --- a/tests/system/suite_HELP/tst_HELP02/test.py +++ b/tests/system/suite_HELP/tst_HELP02/test.py @@ -68,8 +68,7 @@ def checkQtCreatorHelpVersion(expectedVersion): def setKeyboardShortcutForAboutQtC(): invokeMenuItem("Tools", "Options...") - waitForObjectItem(":Options_QListView", "Environment") - clickItem(":Options_QListView", "Environment", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Environment")) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Keyboard") filter = waitForObject("{container={title='Keyboard Shortcuts' type='QGroupBox' unnamed='1' " "visible='1'} type='Utils::FancyLineEdit' unnamed='1' visible='1' " @@ -79,7 +78,7 @@ def setKeyboardShortcutForAboutQtC(): modelIndex = waitForObject("{column='0' text='AboutQtCreator' type='QModelIndex' " "container={column='0' text='QtCreator' type='QModelIndex' " "container=%s}}" % objectMap.realName(treewidget)) - mouseClick(modelIndex, 5, 5, 0, Qt.LeftButton) + mouseClick(modelIndex) shortcutGB = "{title='Shortcut' type='QGroupBox' unnamed='1' visible='1'}" record = waitForObject("{container=%s type='Core::Internal::ShortcutButton' unnamed='1' " "visible='1' text~='(Stop Recording|Record)'}" % shortcutGB) diff --git a/tests/system/suite_HELP/tst_HELP06/test.py b/tests/system/suite_HELP/tst_HELP06/test.py index eebcd2168a6..e4cadad9512 100755 --- a/tests/system/suite_HELP/tst_HELP06/test.py +++ b/tests/system/suite_HELP/tst_HELP06/test.py @@ -34,7 +34,7 @@ def renameBookmarkFolder(view, item, newName): def invokeContextMenuItemOnBookmarkFolder(view, item, menuItem): aboveWidget = "{name='line' type='QFrame' visible='1' window=':Add Bookmark_BookmarkDialog'}" - mouseClick(waitForObjectItem(view, item), 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(view, item)) openItemContextMenu(view, item, 5, 5, 0) activateItem(waitForObject("{aboveWidget=%s type='QMenu' unnamed='1' visible='1' " "window=':Add Bookmark_BookmarkDialog'}" % aboveWidget), menuItem) @@ -81,7 +81,7 @@ def main(): clickButton(waitForObject(":Add Bookmark.New Folder_QPushButton")) renameBookmarkFolder(bookmarkView, "Sample.Folder 1.New Folder*", "Folder 2") clickButton(waitForObject(":Add Bookmark.OK_QPushButton")) - mouseClick(manualQModelIndex, 5, 5, 0, Qt.LeftButton) + mouseClick(manualQModelIndex) type(waitForObject(":Qt Creator_QHelpContentWidget"), "") clickButton(waitForObject(":Qt Creator.Add Bookmark_QToolButton")) clickButton(waitForObject(":Add Bookmark.ExpandBookmarksList_QToolButton")) @@ -106,7 +106,7 @@ def main(): checkIfObjectExists(bldRunQModelIndex, verboseOnFail = True) and checkIfObjectExists(manualQModelIndex, verboseOnFail = True), "Verifying if all folders and bookmarks are present") - mouseClick(waitForObject(":Qt Creator_Bookmarks_TreeView"), 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObject(":Qt Creator_Bookmarks_TreeView")) for _ in range(6): type(waitForObject(":Qt Creator_Bookmarks_TreeView"), "") type(waitForObject(":Qt Creator_Bookmarks_TreeView"), "") diff --git a/tests/system/suite_QMLS/tst_QMLS03/test.py b/tests/system/suite_QMLS/tst_QMLS03/test.py index 62251a9aeeb..c82568a6bce 100644 --- a/tests/system/suite_QMLS/tst_QMLS03/test.py +++ b/tests/system/suite_QMLS/tst_QMLS03/test.py @@ -103,7 +103,7 @@ def main(): "Verifying if usages were properly found using context menu.") # clear previous results & prepare for next search clickButton(waitForObject(":*Qt Creator.Clear_QToolButton")) - mouseClick(editorArea, 5, 5, 0, Qt.LeftButton) + mouseClick(editorArea) # 2. check usages using menu # place cursor to component if not placeCursorToLine(editorArea, "anchors { left: parent.left; top: parent.top; right: parent.right; bottom: parent.verticalCenter }"): @@ -122,7 +122,7 @@ def main(): "Verifying if usages were properly found using main menu.") # clear previous results & prepare for next search clickButton(waitForObject(":*Qt Creator.Clear_QToolButton")) - mouseClick(editorArea, 5, 5, 0, Qt.LeftButton) + mouseClick(editorArea) # 3. check usages using keyboard shortcut # place cursor to component if not placeCursorToLine(editorArea, "SequentialAnimation on opacity {"): diff --git a/tests/system/suite_debugger/tst_qml_js_console/test.py b/tests/system/suite_debugger/tst_qml_js_console/test.py index 18987d050c2..329839cb7fe 100644 --- a/tests/system/suite_debugger/tst_qml_js_console/test.py +++ b/tests/system/suite_debugger/tst_qml_js_console/test.py @@ -28,7 +28,7 @@ source("../../shared/qtcreator.py") def typeToDebuggerConsole(expression): editableIndex = getQModelIndexStr("text=''", ":DebugModeWidget_Debugger::Internal::ConsoleView") - mouseClick(editableIndex, 5, 5, 0, Qt.LeftButton) + mouseClick(editableIndex) type(waitForObject(":Debugger::Internal::ConsoleEdit"), expression) type(waitForObject(":Debugger::Internal::ConsoleEdit"), "") @@ -82,7 +82,7 @@ def getQmlJSConsoleOutput(): return [""] def runChecks(elementProps, parent, checks): - mouseClick(getQModelIndexStr(elementProps, parent), 5, 5, 0, Qt.LeftButton) + mouseClick(getQModelIndexStr(elementProps, parent)) for check in checks: useDebuggerConsole(*check) diff --git a/tests/system/suite_editors/tst_edit_externally/test.py b/tests/system/suite_editors/tst_edit_externally/test.py index 9c2ea61d2cf..8bfdd77b2f3 100644 --- a/tests/system/suite_editors/tst_edit_externally/test.py +++ b/tests/system/suite_editors/tst_edit_externally/test.py @@ -34,7 +34,7 @@ def modifyExternally(filePath): def switchOpenDocsTo(filename): selectFromCombo(":Qt Creator_Core::Internal::NavComboBox", "Open Documents") docs = waitForObject(":OpenDocuments_Widget") - clickItem(docs, filename.replace(".", "\\.").replace("_", "\\_"), 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(docs, filename.replace(".", "\\.").replace("_", "\\_"))) return getEditorForFileSuffix(filename) def main(): diff --git a/tests/system/suite_editors/tst_generic_highlighter/test.py b/tests/system/suite_editors/tst_generic_highlighter/test.py index e6f4a7e117d..1a389090fe7 100644 --- a/tests/system/suite_editors/tst_generic_highlighter/test.py +++ b/tests/system/suite_editors/tst_generic_highlighter/test.py @@ -45,7 +45,7 @@ def createFile(folder, filename): __createProjectHandleLastPage__() def clickTableGetPatternLineEdit(table, row): - clickItem(table, row, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(table, row)) return waitForObject("{name='patternsLineEdit' type='QLineEdit' visible='1'}") def getOrModifyFilePatternsFor(mimeType, filter='', toBePresent=None): @@ -54,7 +54,7 @@ def getOrModifyFilePatternsFor(mimeType, filter='', toBePresent=None): result = [] invokeMenuItem("Tools", "Options...") waitForObjectItem(":Options_QListView", "Environment") - clickItem(":Options_QListView", "Environment", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Environment")) waitForObject("{container=':Options.qt_tabwidget_tabbar_QTabBar' type='TabItem' " "text='MIME Types'}") clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "MIME Types") @@ -118,7 +118,7 @@ def addHighlighterDefinition(*languages): test.log("Updating highlighter definitions...") invokeMenuItem("Tools", "Options...") waitForObjectItem(":Options_QListView", "Text Editor") - clickItem(":Options_QListView", "Text Editor", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Text Editor")) waitForObject("{container=':Options.qt_tabwidget_tabbar_QTabBar' type='TabItem' " "text='Generic Highlighter'}") clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Generic Highlighter") diff --git a/tests/system/suite_general/tst_create_proj_wizard/test.py b/tests/system/suite_general/tst_create_proj_wizard/test.py index 7490427692b..534317c3d14 100644 --- a/tests/system/suite_general/tst_create_proj_wizard/test.py +++ b/tests/system/suite_general/tst_create_proj_wizard/test.py @@ -55,7 +55,7 @@ def main(): # skip non-configurable if "Import" in category: continue - clickItem(categoriesView, "Projects." + category, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(categoriesView, "Projects." + category)) templatesView = waitForObject("{name='templatesView' type='QListView' visible='1'}") # needed because categoriesView and templatesView using same model for template in dumpItems(templatesView.model(), templatesView.rootIndex()): @@ -147,12 +147,12 @@ def __createProject__(category, template): invokeMenuItem("File", "New File or Project...") selectFromCombo(waitForObject(":New.comboBox_QComboBox"), "All Templates") categoriesView = waitForObject(":New.templateCategoryView_QTreeView") - clickItem(categoriesView, "Projects." + category, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(categoriesView, "Projects." + category)) templatesView = waitForObject("{name='templatesView' type='QListView' visible='1'}") test.log("Verifying '%s' -> '%s'" % (category.replace("\\.", "."), template.replace("\\.", "."))) origTxt = safeGetTextBrowserText() - clickItem(templatesView, template, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(templatesView, template)) waitFor("origTxt != safeGetTextBrowserText() != ''", 2000) displayedPlatforms = __getSupportedPlatforms__(safeGetTextBrowserText(), template, True)[0] safeClickButton("Choose...") diff --git a/tests/system/suite_general/tst_default_settings/test.py b/tests/system/suite_general/tst_default_settings/test.py index 3270f619e53..b92a1c93aea 100644 --- a/tests/system/suite_general/tst_default_settings/test.py +++ b/tests/system/suite_general/tst_default_settings/test.py @@ -50,8 +50,7 @@ def __createMinimumIni__(emptyParent): iniFile.close() def __checkKits__(): - waitForObjectItem(":Options_QListView", "Kits") - clickItem(":Options_QListView", "Kits", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Kits")) # check compilers expectedCompilers = __getExpectedCompilers__() foundCompilers = [] @@ -95,7 +94,7 @@ def __processSubItems__(treeObjStr, section, parModelIndexStr, doneItems, itObj = "%s occurrence='%d'}" % (itObj[:-1], alreadyDone + 1) currentSelectedTreeItem = waitForObject(itObj, 3000) tree.scrollTo(it) - mouseClick(currentSelectedTreeItem, 5, 5, 0, Qt.LeftButton) + mouseClick(currentSelectedTreeItem) additionalFunc(indexName, *additionalParameters) currentSelectedTreeItem = None if model.rowCount(it) > 0: diff --git a/tests/system/suite_general/tst_installed_languages/test.py b/tests/system/suite_general/tst_installed_languages/test.py index a6e104ceb31..a1ac0177427 100644 --- a/tests/system/suite_general/tst_installed_languages/test.py +++ b/tests/system/suite_general/tst_installed_languages/test.py @@ -31,8 +31,7 @@ def main(): if not startedWithoutPluginError(): return invokeMenuItem("Tools", "Options...") - waitForObjectItem(":Options_QListView", "Environment") - clickItem(":Options_QListView", "Environment", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Environment")) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Interface") languageName = testData.field(lang, "language") if "%1" in languageName: diff --git a/tests/system/suite_general/tst_remove_kits/test.py b/tests/system/suite_general/tst_remove_kits/test.py index d48930ba350..b3376d71601 100644 --- a/tests/system/suite_general/tst_remove_kits/test.py +++ b/tests/system/suite_general/tst_remove_kits/test.py @@ -47,8 +47,7 @@ def __removeKit__(kit, kitName): # The following kits will be the default kit at that time kitNameTemplate += " (default)" item = kitNameTemplate % kitName.replace(".", "\\.") - waitForObjectItem(":BuildAndRun_QTreeView", item) - clickItem(":BuildAndRun_QTreeView", item, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":BuildAndRun_QTreeView", item)) clickButton(waitForObject(":Remove_QPushButton")) def main(): diff --git a/tests/system/suite_general/tst_save_before_build/test.py b/tests/system/suite_general/tst_save_before_build/test.py index 65e95dea8f1..728f849975a 100644 --- a/tests/system/suite_general/tst_save_before_build/test.py +++ b/tests/system/suite_general/tst_save_before_build/test.py @@ -27,8 +27,7 @@ source("../../shared/qtcreator.py") def ensureSaveBeforeBuildChecked(shouldBeChecked): invokeMenuItem("Tools", "Options...") - waitForObjectItem(":Options_QListView", "Build & Run") - clickItem(":Options_QListView", "Build & Run", 14, 15, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":Options_QListView", "Build & Run")) clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "General") if test.compare(waitForObject(":Build and Run.Save all files before build_QCheckBox").checked, shouldBeChecked, "'Save all files before build' should be %s" % str(shouldBeChecked)): diff --git a/tests/system/suite_general/tst_session_handling/test.py b/tests/system/suite_general/tst_session_handling/test.py index a6751de0dd7..3a536975f2e 100644 --- a/tests/system/suite_general/tst_session_handling/test.py +++ b/tests/system/suite_general/tst_session_handling/test.py @@ -84,9 +84,9 @@ def prepareTestExamples(): def switchSession(toSession): test.log("Switching to session '%s'" % toSession) invokeMenuItem("File", "Sessions", "Manage...") - clickItem(waitForObject("{name='sessionView' type='ProjectExplorer::Internal::SessionView' visible='1' " - "window=':Session Manager_ProjectExplorer::Internal::SessionDialog'}"), - toSession, 5, 5, 0, Qt.LeftButton) + sessionView = ("{name='sessionView' type='ProjectExplorer::Internal::SessionView' visible='1' " + "window=':Session Manager_ProjectExplorer::Internal::SessionDialog'}") + mouseClick(waitForObjectItem(sessionView, toSession)) clickButton(waitForObject("{name='btSwitch' text='Switch to' type='QPushButton' visible='1' " "window=':Session Manager_ProjectExplorer::Internal::SessionDialog'}")) diff --git a/tests/system/suite_tools/tst_codepasting/test.py b/tests/system/suite_tools/tst_codepasting/test.py index 35f85ab9488..7329bdac2e4 100644 --- a/tests/system/suite_tools/tst_codepasting/test.py +++ b/tests/system/suite_tools/tst_codepasting/test.py @@ -157,8 +157,7 @@ def fetchSnippet(protocol, description, pasteId, skippedPasting): replaceEditorContent(waitForObject(":PasteSelectDialog.pasteEdit_QLineEdit"), pasteId) if foundSnippet: pasteLine = pasteLine.replace(".", "\\.") - waitForObjectItem(":PasteSelectDialog.listWidget_QListWidget", pasteLine) - clickItem(":PasteSelectDialog.listWidget_QListWidget", pasteLine, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(":PasteSelectDialog.listWidget_QListWidget", pasteLine)) clickButton(waitForObject(":PasteSelectDialog.OK_QPushButton")) return pasteId diff --git a/tests/system/suite_tools/tst_designer_edit/test.py b/tests/system/suite_tools/tst_designer_edit/test.py index bcbadd7409a..8790ff84e14 100644 --- a/tests/system/suite_tools/tst_designer_edit/test.py +++ b/tests/system/suite_tools/tst_designer_edit/test.py @@ -135,7 +135,7 @@ def performEditCombo(): test.compare(dumpItems(itemListWidget.model()), expectedItems, "Verifying last item has moved to top of the list.") # remove the "Combo Item 1" item from the list - clickItem(itemListWidget, "Combo Item 1", 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(itemListWidget, "Combo Item 1")) clickButton("{name='deleteListItemButton' type='QToolButton' visible='1' window=%s}" % edComboWin) waitFor("itemListWidget.model().rowCount() == len(expectedItems) - 1", 2000) diff --git a/tests/system/suite_tools/tst_designer_goto_slot/test.py b/tests/system/suite_tools/tst_designer_goto_slot/test.py index f1e47727db0..f07c0faa8e6 100644 --- a/tests/system/suite_tools/tst_designer_goto_slot/test.py +++ b/tests/system/suite_tools/tst_designer_goto_slot/test.py @@ -52,8 +52,7 @@ def main(): activateItem(waitForObjectItem("{type='QMenu' unnamed='1' visible='1'}", "Go to slot...")) signalWidgetObject = waitForObject(":Select signal.signalList_QTreeView") signalName = con[1] + "." + con[2] - waitForObjectItem(signalWidgetObject, signalName) - clickItem(signalWidgetObject, signalName, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(signalWidgetObject, signalName)) clickButton(waitForObject(":Go to slot.OK_QPushButton")) editor = waitForObject(":Qt Creator_CppEditor::Internal::CPPEditorWidget") type(editor, "") diff --git a/tests/system/suite_tools/tst_git_local/test.py b/tests/system/suite_tools/tst_git_local/test.py index 8cbdfc42c69..0b2331926eb 100644 --- a/tests/system/suite_tools/tst_git_local/test.py +++ b/tests/system/suite_tools/tst_git_local/test.py @@ -41,7 +41,7 @@ def commit(commitMessage, expectedLogMessage, uncheckUntracked=False): model = treeView.model() for indexStr in dumpItems(model): if 'untracked' in indexStr: - clickItem(treeView, indexStr, 5, 5, 0, Qt.LeftButton) + mouseClick(waitForObjectItem(treeView, indexStr)) checkOrFixCommitterInformation('invalidAuthorLabel', 'authorLineEdit', 'Nobody') checkOrFixCommitterInformation('invalidEmailLabel', 'emailLineEdit', 'nobody@nowhere.com') clickButton(waitForObject(":splitter.Commit File(s)_VcsBase::QActionPushButton")) From 402ff933ad17c340dd20eaadfff90111bb06d494 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Thu, 25 Jul 2019 14:34:47 +0200 Subject: [PATCH 2/4] Add examples and QtProject to gitignore * Add /share/qtcreator/examples/ Building qtcreator together with qtquickdesigner plugin will copy some examples into this directory. * Add /share/qtcreator/qmldesigner/QtProject/ Building qtcreator together with qtquickdesigner plugin will create some *.ini files in this directory. Change-Id: I97a7791d3006e70992df7a19e9b171e2ac8a79ec Reviewed-by: Alessandro Portale --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9a6c349f801..ffa34af0529 100644 --- a/.gitignore +++ b/.gitignore @@ -46,9 +46,11 @@ wrapper.sh *.qbs.user* *.qmlproject.user* CMakeLists.txt.user -/share/qtcreator/externaltools +/share/qtcreator/examples/ +/share/qtcreator/externaltools/ /share/qtcreator/fonts/ /share/qtcreator/generic-highlighter/ +/share/qtcreator/qmldesigner/QtProject/ /src/app/Info.plist /src/plugins/**/*.json /src/plugins/coreplugin/ide_version.h From 8ae9cfe39d9fbf114f23bc00e7a66516c2429648 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 26 Jun 2019 17:51:06 +0200 Subject: [PATCH 3/4] CMake build: Add "Devel" package The "Devel" package will contain headers, libraries, documentation needed by the 3rd parties to build Qt Creator plugins. Fixes: QTCREATORBUG-22514 Change-Id: If54929f823982b921b98a63ff6085d53618a3a49 Reviewed-by: Eike Ziller --- CMakeLists.txt | 69 +- cmake/FindGoogleBenchmark.cmake | 2 + cmake/FindGoogletest.cmake | 4 + cmake/QtCreatorAPI.cmake | 710 ++++++++++++++++++ src/CMakeLists.txt | 606 ++------------- src/libs/3rdparty/cplusplus/CMakeLists.txt | 2 +- src/libs/clangsupport/CMakeLists.txt | 1 - src/libs/cplusplus/CMakeLists.txt | 2 +- src/libs/modelinglib/CMakeLists.txt | 1 - src/libs/sqlite/CMakeLists.txt | 2 +- src/libs/tracing/CMakeLists.txt | 1 - src/shared/help/CMakeLists.txt | 3 +- src/tools/qml2puppet/CMakeLists.txt | 4 +- tests/auto/algorithm/CMakeLists.txt | 2 +- tests/auto/debugger/CMakeLists.txt | 4 +- .../circularplugins/CMakeLists.txt | 2 +- .../correctplugins1/CMakeLists.txt | 2 +- .../pluginspec/testplugin/CMakeLists.txt | 4 +- tests/auto/externaltool/CMakeLists.txt | 4 +- tests/auto/json/CMakeLists.txt | 4 +- tests/auto/pointeralgorithm/CMakeLists.txt | 2 +- tests/auto/profilewriter/CMakeLists.txt | 2 +- tests/auto/qml/codemodel/check/CMakeLists.txt | 2 +- .../qml/codemodel/dependencies/CMakeLists.txt | 4 +- .../qml/codemodel/ecmascript7/CMakeLists.txt | 4 +- .../qml/codemodel/importscheck/CMakeLists.txt | 4 +- tests/auto/qml/persistenttrie/CMakeLists.txt | 2 +- .../qml/qmldesigner/coretests/CMakeLists.txt | 10 +- .../qmleditor/qmlcodeformatter/CMakeLists.txt | 2 +- .../auto/qml/qmljssimplereader/CMakeLists.txt | 2 +- .../fileformat/CMakeLists.txt | 4 +- tests/auto/qml/qrcparser/CMakeLists.txt | 2 +- tests/auto/qml/reformatter/CMakeLists.txt | 2 +- tests/auto/toolchaincache/CMakeLists.txt | 2 +- tests/unit/unittest/CMakeLists.txt | 4 +- 35 files changed, 826 insertions(+), 651 deletions(-) create mode 100644 cmake/QtCreatorAPI.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 46ab6b8da70..43d7d9bce6e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,6 +94,7 @@ if (TARGET Qt5::Svg AND ENABLE_SVG_SUPPORT) else() target_compile_definitions(OptionalSvg INTERFACE QT_NO_SVG) endif() +install(TARGETS OptionalSvg EXPORT QtCreator) find_package(LLVM QUIET) find_package(Clang COMPONENTS libclang QUIET) @@ -109,73 +110,7 @@ if (APPLE) find_library(FWWebKit WebKit) endif() -set(_IDE_APP_PATH "bin") - -if (APPLE) - set(_IDE_APP_TARGET "${IDE_DISPLAY_NAME}") - - set(_IDE_OUTPUT_PATH "${_IDE_APP_PATH}/${_IDE_APP_TARGET}.app/Contents") - - set(_IDE_PLUGIN_PATH "${_IDE_OUTPUT_PATH}/PlugIns") - set(_IDE_LIBRARY_BASE_PATH "Frameworks") - set(_IDE_LIBRARY_PATH "${_IDE_OUTPUT_PATH}/Frameworks") - set(_IDE_LIBEXEC_PATH "${_IDE_OUTPUT_PATH}/Resources") - set(_IDE_DATA_PATH "${_IDE_OUTPUT_PATH}/Resources") - set(_IDE_DOC_PATH "${_IDE_OUTPUT_PATH}/Resources/doc") - set(_IDE_BIN_PATH "${_IDE_OUTPUT_PATH}/MacOS") -else () - set(_IDE_APP_TARGET "${IDE_ID}") - - set(_IDE_LIBRARY_BASE_PATH "lib") - set(_IDE_LIBRARY_PATH "lib/qtcreator") - set(_IDE_PLUGIN_PATH "lib/qtcreator/plugins") - if (WIN32) - set(_IDE_LIBEXEC_PATH "bin") - else () - set(_IDE_LIBEXEC_PATH "libexec/qtcreator/bin") - endif () - set(_IDE_DATA_PATH "share/qtcreator") - set(_IDE_DOC_PATH "share/doc/qtcreator") - set(_IDE_BIN_PATH "bin") -endif () - -set(IDE_APP_PATH "${_IDE_APP_PATH}") # The target path of the IDE application (relative to CMAKE_INSTALL_PREFIX). -set(IDE_APP_TARGET "${_IDE_APP_TARGET}") # The IDE application name. -set(IDE_PLUGIN_PATH "${_IDE_PLUGIN_PATH}") # The IDE plugin path (relative to CMAKE_INSTALL_PREFIX). -set(IDE_LIBRARY_BASE_PATH "${_IDE_LIBRARY_BASE_PATH}") # The IDE library base path (relative to CMAKE_INSTALL_PREFIX). -set(IDE_LIBRARY_PATH "${_IDE_LIBRARY_PATH}") # The IDE library path (relative to CMAKE_INSTALL_PREFIX). -set(IDE_LIBEXEC_PATH "${_IDE_LIBEXEC_PATH}") # The IDE libexec path (relative to CMAKE_INSTALL_PREFIX). -set(IDE_DATA_PATH "${_IDE_DATA_PATH}") # The IDE data path (relative to CMAKE_INSTALL_PREFIX). -set(IDE_DOC_PATH "${_IDE_DOC_PATH}") # The IDE documentation path (relative to CMAKE_INSTALL_PREFIX). -set(IDE_BIN_PATH "${_IDE_BIN_PATH}") # The IDE bin path (relative to CMAKE_INSTALL_PREFIX). - -file(RELATIVE_PATH RELATIVE_PLUGIN_PATH "/${IDE_BIN_PATH}" "/${IDE_PLUGIN_PATH}") -file(RELATIVE_PATH RELATIVE_LIBEXEC_PATH "/${IDE_BIN_PATH}" "/${IDE_LIBEXEC_PATH}") -file(RELATIVE_PATH RELATIVE_DATA_PATH "/${IDE_BIN_PATH}" "/${IDE_DATA_PATH}") -file(RELATIVE_PATH RELATIVE_DOC_PATH "/${IDE_BIN_PATH}" "/${IDE_DOC_PATH}") - -list(APPEND DEFAULT_DEFINES - RELATIVE_PLUGIN_PATH="${RELATIVE_PLUGIN_PATH}" - RELATIVE_LIBEXEC_PATH="${RELATIVE_LIBEXEC_PATH}" - RELATIVE_DATA_PATH="${RELATIVE_DATA_PATH}" - RELATIVE_DOC_PATH="${RELATIVE_DOC_PATH}" -) - -file(RELATIVE_PATH _PLUGIN_TO_LIB "/${IDE_PLUGIN_PATH}" "/${IDE_LIBRARY_PATH}") - -if (APPLE) - set(_RPATH_BASE "@executable_path") - set(_LIB_RPATH "@loader_path") - set(_PLUGIN_RPATH "@loader_path;@loader_path/${_PLUGIN_TO_LIB}") -elseif (WIN32) - set(_RPATH_BASE "") - set(_LIB_RPATH "") - set(_PLUGIN_RPATH "") -else() - set(_RPATH_BASE "\$ORIGIN") - set(_LIB_RPATH "\$ORIGIN") - set(_PLUGIN_RPATH "\$ORIGIN;\$ORIGIN/${_PLUGIN_TO_LIB}") -endif () +include(QtCreatorAPI) if (UNIX) add_subdirectory(bin) diff --git a/cmake/FindGoogleBenchmark.cmake b/cmake/FindGoogleBenchmark.cmake index ce2cf3f66d9..5713803535a 100644 --- a/cmake/FindGoogleBenchmark.cmake +++ b/cmake/FindGoogleBenchmark.cmake @@ -22,6 +22,7 @@ find_path(GOOGLE_BENCHMARK_INCLUDE_DIR PATH_SUFFIXES include HINTS "${GOOGLEBENCHMARK_DIR}" ENV GOOGLEBENCHMARK_DIR + "${CMAKE_SOURCE_DIR}/benchmark" "${CMAKE_SOURCE_DIR}/../benchmark" "${CMAKE_SOURCE_DIR}/../../benchmark" ) @@ -31,6 +32,7 @@ find_path(GOOGLE_BENCHMARK_SRC_DIR PATH_SUFFIXES src HINTS "${GOOGLEBENCHMARK_DIR}" ENV GOOGLEBENCHMARK_DIR + "${CMAKE_SOURCE_DIR}/benchmark" "${CMAKE_SOURCE_DIR}/../benchmark" "${CMAKE_SOURCE_DIR}/../../benchmark" ) diff --git a/cmake/FindGoogletest.cmake b/cmake/FindGoogletest.cmake index b73f7680fc0..b5b5137d5e6 100644 --- a/cmake/FindGoogletest.cmake +++ b/cmake/FindGoogletest.cmake @@ -22,6 +22,7 @@ find_path(GOOGLE_TEST_INCLUDE_DIR PATH_SUFFIXES googletest/include HINTS "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR + "${CMAKE_SOURCE_DIR}/googletest" "${CMAKE_SOURCE_DIR}/../googletest" "${CMAKE_SOURCE_DIR}/../../googletest" ) @@ -31,6 +32,7 @@ find_path(GOOGLE_TEST_SRC_ALL PATH_SUFFIXES googletest/src HINTS "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR + "${CMAKE_SOURCE_DIR}/googletest" "${CMAKE_SOURCE_DIR}/../googletest" "${CMAKE_SOURCE_DIR}/../../googletest" ) @@ -41,6 +43,7 @@ find_path(GOOGLE_MOCK_INCLUDE_DIR PATH_SUFFIXES googlemock/include HINTS "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR + "${CMAKE_SOURCE_DIR}/googletest" "${CMAKE_SOURCE_DIR}/../googletest" "${CMAKE_SOURCE_DIR}/../../googletest" ) @@ -50,6 +53,7 @@ find_path(GOOGLE_MOCK_SRC_ALL PATH_SUFFIXES googlemock/src HINTS "${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR + "${CMAKE_SOURCE_DIR}/googletest" "${CMAKE_SOURCE_DIR}/../googletest" "${CMAKE_SOURCE_DIR}/../../googletest" ) diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake new file mode 100644 index 00000000000..3c11c348bf5 --- /dev/null +++ b/cmake/QtCreatorAPI.cmake @@ -0,0 +1,710 @@ +include(FeatureSummary) + +# +# Setup path handling +# + +set(_IDE_APP_PATH "bin") + +if (APPLE) + set(_IDE_APP_TARGET "${IDE_DISPLAY_NAME}") + + set(_IDE_OUTPUT_PATH "${_IDE_APP_PATH}/${_IDE_APP_TARGET}.app/Contents") + + set(_IDE_PLUGIN_PATH "${_IDE_OUTPUT_PATH}/PlugIns") + set(_IDE_LIBRARY_BASE_PATH "Frameworks") + set(_IDE_LIBRARY_PATH "${_IDE_OUTPUT_PATH}/Frameworks") + set(_IDE_LIBEXEC_PATH "${_IDE_OUTPUT_PATH}/Resources") + set(_IDE_DATA_PATH "${_IDE_OUTPUT_PATH}/Resources") + set(_IDE_DOC_PATH "${_IDE_OUTPUT_PATH}/Resources/doc") + set(_IDE_BIN_PATH "${_IDE_OUTPUT_PATH}/MacOS") +else () + set(_IDE_APP_TARGET "${IDE_ID}") + + set(_IDE_LIBRARY_BASE_PATH "lib") + set(_IDE_LIBRARY_PATH "lib/${IDE_ID}") + set(_IDE_PLUGIN_PATH "lib/${IDE_ID}/plugins") + if (WIN32) + set(_IDE_LIBEXEC_PATH "bin") + else () + set(_IDE_LIBEXEC_PATH "libexec/${IDE_ID}/bin") + endif () + set(_IDE_DATA_PATH "share/${IDE_ID}") + set(_IDE_DOC_PATH "share/doc/${IDE_ID}") + set(_IDE_BIN_PATH "bin") +endif () + +set(IDE_APP_PATH "${_IDE_APP_PATH}") # The target path of the IDE application (relative to CMAKE_INSTALL_PREFIX). +set(IDE_APP_TARGET "${_IDE_APP_TARGET}") # The IDE application name. +set(IDE_PLUGIN_PATH "${_IDE_PLUGIN_PATH}") # The IDE plugin path (relative to CMAKE_INSTALL_PREFIX). +set(IDE_LIBRARY_BASE_PATH "${_IDE_LIBRARY_BASE_PATH}") # The IDE library base path (relative to CMAKE_INSTALL_PREFIX). +set(IDE_LIBRARY_PATH "${_IDE_LIBRARY_PATH}") # The IDE library path (relative to CMAKE_INSTALL_PREFIX). +set(IDE_LIBEXEC_PATH "${_IDE_LIBEXEC_PATH}") # The IDE libexec path (relative to CMAKE_INSTALL_PREFIX). +set(IDE_DATA_PATH "${_IDE_DATA_PATH}") # The IDE data path (relative to CMAKE_INSTALL_PREFIX). +set(IDE_DOC_PATH "${_IDE_DOC_PATH}") # The IDE documentation path (relative to CMAKE_INSTALL_PREFIX). +set(IDE_BIN_PATH "${_IDE_BIN_PATH}") # The IDE bin path (relative to CMAKE_INSTALL_PREFIX). + +file(RELATIVE_PATH RELATIVE_PLUGIN_PATH "/${IDE_BIN_PATH}" "/${IDE_PLUGIN_PATH}") +file(RELATIVE_PATH RELATIVE_LIBEXEC_PATH "/${IDE_BIN_PATH}" "/${IDE_LIBEXEC_PATH}") +file(RELATIVE_PATH RELATIVE_DATA_PATH "/${IDE_BIN_PATH}" "/${IDE_DATA_PATH}") +file(RELATIVE_PATH RELATIVE_DOC_PATH "/${IDE_BIN_PATH}" "/${IDE_DOC_PATH}") + +list(APPEND DEFAULT_DEFINES + RELATIVE_PLUGIN_PATH="${RELATIVE_PLUGIN_PATH}" + RELATIVE_LIBEXEC_PATH="${RELATIVE_LIBEXEC_PATH}" + RELATIVE_DATA_PATH="${RELATIVE_DATA_PATH}" + RELATIVE_DOC_PATH="${RELATIVE_DOC_PATH}" +) + +file(RELATIVE_PATH _PLUGIN_TO_LIB "/${IDE_PLUGIN_PATH}" "/${IDE_LIBRARY_PATH}") + +if (APPLE) + set(_RPATH_BASE "@executable_path") + set(_LIB_RPATH "@loader_path") + set(_PLUGIN_RPATH "@loader_path;@loader_path/${_PLUGIN_TO_LIB}") +elseif (WIN32) + set(_RPATH_BASE "") + set(_LIB_RPATH "") + set(_PLUGIN_RPATH "") +else() + set(_RPATH_BASE "\$ORIGIN") + set(_LIB_RPATH "\$ORIGIN") + set(_PLUGIN_RPATH "\$ORIGIN;\$ORIGIN/${_PLUGIN_TO_LIB}") +endif () + +set(__QTC_PLUGINS "" CACHE INTERNAL "*** Internal ***") +set(__QTC_LIBRARIES "" CACHE INTERNAL "*** Internal ***") +set(__QTC_EXECUTABLES "" CACHE INTERNAL "*** Internal ***") +set(__QTC_TESTS "" CACHE INTERNAL "*** Internal ***") + +# +# Internal functions +# + +function(update_cached_list name value) + set(_tmp_list "${${name}}") + list(APPEND _tmp_list "${value}") + set("${name}" "${_tmp_list}" CACHE INTERNAL "*** Internal ***") +endfunction() + +function(compare_sources_with_existing_disk_files target_name sources) + if(NOT WITH_DEBUG_CMAKE) + return() + endif() + + file(GLOB_RECURSE existing_files RELATIVE ${CMAKE_CURRENT_LIST_DIR} "*.cpp" "*.hpp" "*.c" "*.h" "*.ui" "*.qrc") + foreach(file IN LISTS existing_files) + if(NOT ${file} IN_LIST sources) + if (NOT WITH_TESTS AND ${file} MATCHES "test") + continue() + endif() + message(STATUS "${target_name} doesn't include ${file}") + endif() + endforeach() + + foreach(source IN LISTS "${sources}") + if(NOT ${source} IN_LIST existing_files) + if (NOT WITH_TESTS AND ${file} MATCHES "test") + continue() + endif() + message(STATUS "${target_name} contains non existing ${source}") + endif() + endforeach() +endfunction(compare_sources_with_existing_disk_files) + +function(separate_object_libraries libraries REGULAR_LIBS OBJECT_LIBS OBJECT_LIB_OBJECTS) + if (CMAKE_VERSION VERSION_LESS 3.14) + foreach(lib IN LISTS libraries) + if (TARGET ${lib}) + get_target_property(lib_type ${lib} TYPE) + if (lib_type STREQUAL "OBJECT_LIBRARY") + list(APPEND object_libs ${lib}) + list(APPEND object_libs_objects $) + else() + list(APPEND regular_libs ${lib}) + endif() + else() + list(APPEND regular_libs ${lib}) + endif() + set(${REGULAR_LIBS} ${regular_libs} PARENT_SCOPE) + set(${OBJECT_LIBS} ${object_libs} PARENT_SCOPE) + set(${OBJECT_LIB_OBJECTS} ${object_libs_objects} PARENT_SCOPE) + endforeach() + else() + set(${REGULAR_LIBS} ${libraries} PARENT_SCOPE) + unset(${OBJECT_LIBS} PARENT_SCOPE) + unset(${OBJECT_LIB_OBJECTS} PARENT_SCOPE) + endif() +endfunction(separate_object_libraries) + +function(set_explicit_moc target_name file) + set_property(SOURCE "${file}" PROPERTY SKIP_AUTOMOC ON) + qt5_wrap_cpp(file_moc "${file}") + target_sources(${target_name} PRIVATE "${file_moc}") +endfunction() + +function(set_public_headers target sources) + foreach(source IN LISTS sources) + if (source MATCHES "\.h$|\.hpp$") + + if (NOT IS_ABSOLUTE ${source}) + set(source "${CMAKE_CURRENT_SOURCE_DIR}/${source}") + endif() + + get_filename_component(source_dir ${source} DIRECTORY) + file(RELATIVE_PATH include_dir_relative_path ${PROJECT_SOURCE_DIR} ${source_dir}) + + install( + FILES ${source} + DESTINATION "include/${include_dir_relative_path}" + COMPONENT Devel EXCLUDE_FROM_ALL + ) + endif() + endforeach() +endfunction() + +function(set_public_includes target includes) + foreach(inc_dir IN LISTS includes) + if (NOT IS_ABSOLUTE ${inc_dir}) + set(inc_dir "${CMAKE_CURRENT_SOURCE_DIR}/${inc_dir}") + endif() + target_include_directories(${target} PUBLIC $) + endforeach() +endfunction() + +function(fix_test_environment test_name) + if (WIN32) + list(APPEND env_path $ENV{PATH}) + list(APPEND env_path ${CMAKE_BINARY_DIR}/${IDE_PLUGIN_PATH}) + list(APPEND env_path ${CMAKE_BINARY_DIR}/${IDE_BIN_PATH}) + list(APPEND env_path $) + if (TARGET libclang) + list(APPEND env_path $) + endif() + + string(REPLACE "/" "\\" env_path "${env_path}") + string(REPLACE ";" "\\;" env_path "${env_path}") + + set_tests_properties(${test_name} PROPERTIES ENVIRONMENT "PATH=${env_path}") + endif() +endfunction() + +function(add_qtc_depends target_name) + cmake_parse_arguments(_arg "" "" "PRIVATE;PUBLIC" ${ARGN}) + if (${_arg_UNPARSED_ARGUMENTS}) + message(FATAL_ERROR "add_qtc_depends had unparsed arguments") + endif() + + separate_object_libraries("${_arg_PRIVATE}" + depends object_lib_depends object_lib_depends_objects) + separate_object_libraries("${_arg_PUBLIC}" + public_depends object_public_depends object_public_depends_objects) + + target_sources(${target_name} PRIVATE ${object_lib_depends_objects} ${object_public_depends_objects}) + + get_target_property(target_type ${target_name} TYPE) + if (NOT target_type STREQUAL "OBJECT_LIBRARY") + target_link_libraries(${target_name} PRIVATE ${depends} PUBLIC ${public_depends}) + else() + list(APPEND object_lib_depends ${depends}) + list(APPEND object_public_depends ${public_depends}) + endif() + + foreach(obj_lib IN LISTS object_lib_depends) + target_compile_definitions(${target_name} PRIVATE $) + target_include_directories(${target_name} PRIVATE $) + endforeach() + foreach(obj_lib IN LISTS object_public_depends) + target_compile_definitions(${target_name} PUBLIC $) + target_include_directories(${target_name} PUBLIC $) + endforeach() +endfunction() + +function(find_dependent_plugins varName) + set(_RESULT ${ARGN}) + + foreach(i ${ARGN}) + get_property(_dep TARGET "${i}" PROPERTY _arg_DEPENDS) + if (_dep) + find_dependent_plugins(_REC ${_dep}) + list(APPEND _RESULT ${_REC}) + endif() + endforeach() + + if (_RESULT) + list(REMOVE_DUPLICATES _RESULT) + list(SORT _RESULT) + endif() + + set("${varName}" ${_RESULT} PARENT_SCOPE) +endfunction() + +function(qtc_plugin_enabled varName name) + if (NOT (name IN_LIST __QTC_PLUGINS)) + message(FATAL_ERROR "extend_qtc_plugin: Unknown plugin target \"${name}\"") + endif() + if (TARGET ${name}) + set(${varName} ON PARENT_SCOPE) + else() + set(${varName} OFF PARENT_SCOPE) + endif() +endfunction() + +# +# Public API functions +# + +function(add_qtc_library name) + cmake_parse_arguments(_arg "STATIC;OBJECT" "" + "DEFINES;DEPENDS;INCLUDES;PUBLIC_DEFINES;PUBLIC_DEPENDS;PUBLIC_INCLUDES;SOURCES;EXPLICIT_MOC;SKIP_AUTOMOC;PROPERTIES" ${ARGN} + ) + + if (${_arg_UNPARSED_ARGUMENTS}) + message(FATAL_ERROR "add_qtc_library had unparsed arguments") + endif() + + update_cached_list(__QTC_LIBRARIES "${name}") + + compare_sources_with_existing_disk_files(${name} "${_arg_SOURCES}") + + set(library_type SHARED) + if (_arg_STATIC) + set(library_type STATIC) + endif() + if (_arg_OBJECT) + set(library_type OBJECT) + endif() + + # Do not just build libraries... + add_library(${name} ${library_type} EXCLUDE_FROM_ALL ${_arg_SOURCES}) + add_library(${IDE_CASED_ID}::${name} ALIAS ${name}) + set_public_headers(${name} "${_arg_SOURCES}") + + if (${name} MATCHES "^[^0-9]+") + string(TOUPPER "${name}_LIBRARY" EXPORT_SYMBOL) + endif() + + if (WITH_TESTS) + set(TEST_DEFINES WITH_TESTS SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}") + endif() + + file(RELATIVE_PATH include_dir_relative_path ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + + target_include_directories(${name} + PRIVATE ${_arg_INCLUDES} + PUBLIC + "$" + "$" + "$" + "$" + ) + set_public_includes(${name} "${_arg_PUBLIC_INCLUDES}") + + target_compile_definitions(${name} + PRIVATE ${EXPORT_SYMBOL} ${DEFAULT_DEFINES} ${_arg_DEFINES} ${TEST_DEFINES} + PUBLIC ${_arg_PUBLIC_DEFINES} + ) + + add_qtc_depends(${name} + PRIVATE ${_arg_DEPENDS} ${_TEST_DEPENDS} + PUBLIC ${_arg_PUBLIC_DEPENDS} + ) + + foreach(file IN LISTS _arg_EXPLICIT_MOC) + set_explicit_moc(${name} "${file}") + endforeach() + + foreach(file IN LISTS _arg_SKIP_AUTOMOC) + set_property(SOURCE ${file} PROPERTY SKIP_AUTOMOC ON) + endforeach() + + set_target_properties(${name} PROPERTIES + SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}" + VERSION "${IDE_VERSION}" + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + BUILD_RPATH "${_LIB_RPATH}" + INSTALL_RPATH "${_LIB_RPATH}" + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${IDE_BIN_PATH}" + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${IDE_LIBRARY_PATH}" + ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${IDE_LIBRARY_PATH}" + ${_arg_PROPERTIES} + ) + + unset(NAMELINK_OPTION) + if (library_type STREQUAL "SHARED") + set(NAMELINK_OPTION NAMELINK_SKIP) + endif() + + install(TARGETS ${name} + EXPORT ${IDE_CASED_ID} + RUNTIME DESTINATION "${IDE_BIN_PATH}" + LIBRARY + DESTINATION "${IDE_LIBRARY_PATH}" + ${NAMELINK_OPTION} + OBJECTS + DESTINATION "${IDE_LIBRARY_PATH}" + COMPONENT Devel EXCLUDE_FROM_ALL + ARCHIVE + DESTINATION "${IDE_LIBRARY_PATH}" + COMPONENT Devel EXCLUDE_FROM_ALL + ) + + if (NAMELINK_OPTION) + install(TARGETS ${name} + LIBRARY + DESTINATION "${IDE_LIBRARY_PATH}" + NAMELINK_ONLY + COMPONENT Devel EXCLUDE_FROM_ALL + ) + endif() +endfunction(add_qtc_library) + +function(add_qtc_plugin target_name) + cmake_parse_arguments(_arg + "EXPERIMENTAL;SKIP_DEBUG_CMAKE_FILE_CHECK;SKIP_INSTALL" + "VERSION;COMPAT_VERSION;PLUGIN_JSON_IN;PLUGIN_PATH;PLUGIN_NAME;OUTPUT_NAME" + "CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;INCLUDES;PUBLIC_INCLUDES;PLUGIN_DEPENDS;PLUGIN_RECOMMENDS;SOURCES;EXPLICIT_MOC" + ${ARGN} + ) + + if (${_arg_UNPARSED_ARGUMENTS}) + message(FATAL_ERROR "add_qtc_plugin had unparsed arguments") + endif() + + update_cached_list(__QTC_PLUGINS "${target_name}") + + set(name ${target_name}) + if (_arg_PLUGIN_NAME) + set(name ${_arg_PLUGIN_NAME}) + endif() + + if (NOT _arg_CONDITION) + set(_arg_CONDITION ON) + set(_extra_text "") + else() + string(REPLACE ";" " " _contents "${_arg_CONDITION}") + set(_extra_text "with CONDITION ${_contents}") + endif() + + string(TOUPPER "BUILD_PLUGIN_${target_name}" _build_plugin_var) + set(_build_plugin_default "ON") + if (DEFINED ENV{QTC_${_build_plugin_var}}) + set(_build_plugin_default "$ENV{QTC_${_build_plugin_var}}") + endif() + set(${_build_plugin_var} "${_build_plugin_default}" CACHE BOOL "Build plugin ${name}.") + + if ((${_arg_CONDITION}) AND ${_build_plugin_var}) + set(_plugin_enabled ON) + else() + set(_plugin_enabled OFF) + endif() + + add_feature_info("Plugin ${name}" _plugin_enabled "${_extra_text}") + if (NOT _plugin_enabled) + return() + endif() + + ### Generate plugin.json file: + if (NOT _arg_VERSION) + set(_arg_VERSION ${IDE_VERSION}) + endif() + if (NOT _arg_COMPAT_VERSION) + set(_arg_COMPAT_VERSION ${_arg_VERSION}) + endif() + + if (NOT _arg_SKIP_DEBUG_CMAKE_FILE_CHECK) + compare_sources_with_existing_disk_files(${target_name} "${_arg_SOURCES}") + endif() + + # Generate dependency list: + find_dependent_plugins(_DEP_PLUGINS ${_arg_PLUGIN_DEPENDS}) + + set(_arg_DEPENDENCY_STRING "\"Dependencies\" : [\n") + foreach(i IN LISTS _DEP_PLUGINS) + if (i MATCHES "^${IDE_CASED_ID}::") + set(_v ${IDE_VERSION}) + string(REPLACE "${IDE_CASED_ID}::" "" i ${i}) + else() + get_property(_v TARGET "${i}" PROPERTY _arg_VERSION) + endif() + string(APPEND _arg_DEPENDENCY_STRING + " { \"Name\" : \"${i}\", \"Version\" : \"${_v}\" }" + ) + endforeach(i) + string(REPLACE "} {" "},\n {" + _arg_DEPENDENCY_STRING "${_arg_DEPENDENCY_STRING}" + ) + foreach(i IN LISTS ${_arg_RECOMMENDS}) + if (i MATCHES "^${IDE_CASED_ID}::") + set(_v ${IDE_VERSION}) + string(REPLACE "${IDE_CASED_ID}::" "" i ${i}) + else() + get_property(_v TARGET "${i}" PROPERTY _arg_VERSION) + endif() + string(APPEND _arg_DEPENDENCY_STRING + " { \"Name\" : \"${i}\", \"Version\" : \"${_v}\", \"Type\" : \"optional\" }" + ) + endforeach(i) + string(APPEND _arg_DEPENDENCY_STRING "\n ]") + if (_arg_EXPERIMENTAL) + string(APPEND _arg_DEPENDENCY_STRING ",\n \"Experimental\" : true") + endif() + + set(IDE_PLUGIN_DEPENDENCY_STRING ${_arg_DEPENDENCY_STRING}) + + ### Configure plugin.json file: + if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${name}.json.in") + file(READ "${name}.json.in" plugin_json_in) + string(REPLACE "\\\"" "\"" plugin_json_in ${plugin_json_in}) + string(REPLACE "\\'" "'" plugin_json_in ${plugin_json_in}) + string(REPLACE "$$QTCREATOR_VERSION" "\${IDE_VERSION}" plugin_json_in ${plugin_json_in}) + string(REPLACE "$$QTCREATOR_COMPAT_VERSION" "\${IDE_VERSION_COMPAT}" plugin_json_in ${plugin_json_in}) + string(REPLACE "$$QTCREATOR_COPYRIGHT_YEAR" "\${IDE_COPYRIGHT_YEAR}" plugin_json_in ${plugin_json_in}) + string(REPLACE "$$dependencyList" "\${IDE_PLUGIN_DEPENDENCY_STRING}" plugin_json_in ${plugin_json_in}) + if(_arg_PLUGIN_JSON_IN) + #e.g. UPDATEINFO_EXPERIMENTAL_STR=true + string(REGEX REPLACE "=.*$" "" json_key ${_arg_PLUGIN_JSON_IN}) + string(REGEX REPLACE "^.*=" "" json_value ${_arg_PLUGIN_JSON_IN}) + string(REPLACE "$$${json_key}" "${json_value}" plugin_json_in ${plugin_json_in}) + endif() + file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${name}.json.cmakein" ${plugin_json_in}) + + configure_file("${CMAKE_CURRENT_BINARY_DIR}/${name}.json.cmakein" "${name}.json") + endif() + + add_library(${target_name} SHARED ${_arg_SOURCES}) + add_library(${IDE_CASED_ID}::${target_name} ALIAS ${target_name}) + set_public_headers(${target_name} "${_arg_SOURCES}") + + ### Generate EXPORT_SYMBOL + string(TOUPPER "${name}_LIBRARY" EXPORT_SYMBOL) + + if (WITH_TESTS) + set(TEST_DEFINES WITH_TESTS SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}") + endif() + + file(RELATIVE_PATH include_dir_relative_path ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + + target_include_directories(${target_name} + PRIVATE + ${_arg_INCLUDES} + "${CMAKE_CURRENT_BINARY_DIR}" + "${CMAKE_BINARY_DIR}/src" + PUBLIC + "$" + "$" + "$" + "$" + ) + set_public_includes(${target_name} "${_arg_PUBLIC_INCLUDES}") + + target_compile_definitions(${target_name} + PRIVATE ${EXPORT_SYMBOL} ${DEFAULT_DEFINES} ${_arg_DEFINES} ${TEST_DEFINES} + ) + + add_qtc_depends(${target_name} + PRIVATE ${_arg_DEPENDS} ${_DEP_PLUGINS} ${_TEST_DEPENDS} + PUBLIC ${_arg_PUBLIC_DEPENDS} + ) + + set(plugin_dir "${IDE_PLUGIN_PATH}") + if (_arg_PLUGIN_PATH) + set(plugin_dir "${_arg_PLUGIN_PATH}") + endif() + + set_target_properties(${target_name} PROPERTIES + SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}" + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + _arg_DEPENDS "${_arg_PLUGIN_DEPENDS}" + _arg_VERSION "${_arg_VERSION}" + BUILD_RPATH "${_PLUGIN_RPATH}" + INSTALL_RPATH "${_PLUGIN_RPATH}" + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${plugin_dir}" + ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${plugin_dir}" + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${plugin_dir}" + OUTPUT_NAME "${name}" + ${_arg_PROPERTIES} + ) + + foreach(file IN LISTS _arg_EXPLICIT_MOC) + set_explicit_moc(${target_name} "${file}") + endforeach() + + if (NOT _arg_SKIP_INSTALL) + install(TARGETS ${target_name} + EXPORT ${IDE_CASED_ID} + RUNTIME DESTINATION "${plugin_dir}" + LIBRARY DESTINATION "${plugin_dir}" + ARCHIVE + DESTINATION "${plugin_dir}" + COMPONENT Devel EXCLUDE_FROM_ALL + ) + endif() +endfunction() + +function(extend_qtc_target target_name) + cmake_parse_arguments(_arg + "" + "SOURCES_PREFIX" + "CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;INCLUDES;PUBLIC_INCLUDES;SOURCES;EXPLICIT_MOC" + ${ARGN} + ) + + if (${_arg_UNPARSED_ARGUMENTS}) + message(FATAL_ERROR "extend_qtc_target had unparsed arguments") + endif() + + if (NOT _arg_CONDITION) + set(_arg_CONDITION ON) + endif() + if (NOT (${_arg_CONDITION})) + return() + endif() + + add_qtc_depends(${target_name} + PRIVATE ${_arg_DEPENDS} + PUBLIC ${_arg_PUBLIC_DEPENDS} + ) + target_compile_definitions(${target_name} PRIVATE ${_arg_DEFINES}) + target_include_directories(${target_name} PRIVATE ${_arg_INCLUDES}) + + set_public_includes(${target_name} "${_arg_PUBLIC_INCLUDES}") + + if (_arg_SOURCES_PREFIX) + foreach(source IN LISTS _arg_SOURCES) + list(APPEND prefixed_sources "${_arg_SOURCES_PREFIX}/${source}") + endforeach() + + if (NOT IS_ABSOLUTE ${_arg_SOURCES_PREFIX}) + set(_arg_SOURCES_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/${_arg_SOURCES_PREFIX}") + endif() + target_include_directories(${target_name} PUBLIC $) + + set(_arg_SOURCES ${prefixed_sources}) + endif() + target_sources(${target_name} PRIVATE ${_arg_SOURCES}) + set_public_headers(${target_name} "${_arg_SOURCES}") + + foreach(file IN LISTS _arg_EXPLICIT_MOC) + set_explicit_moc(${target_name} "${file}") + endforeach() + +endfunction() + +function(extend_qtc_plugin target_name) + qtc_plugin_enabled(_plugin_enabled ${target_name}) + if (NOT _plugin_enabled) + return() + endif() + + extend_qtc_target(${target_name} ${ARGN}) +endfunction() + +function(add_qtc_executable name) + cmake_parse_arguments(_arg "SKIP_INSTALL" "DESTINATION" "DEFINES;DEPENDS;INCLUDES;SOURCES;PROPERTIES" ${ARGN}) + + if ($_arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "add_qtc_executable had unparsed arguments!") + endif() + + update_cached_list(__QTC_EXECUTABLES "${name}") + + string(TOUPPER "BUILD_EXECUTABLE_${name}" _build_executable_var) + set(_build_executable_default "ON") + if (DEFINED ENV{QTC_${_build_executable_var}}) + set(_build_executable_default "$ENV{QTC_${_build_executable_var}}") + endif() + set(${_build_executable_var} "${_build_executable_default}" CACHE BOOL "Build executable ${name}.") + + if (NOT ${_build_executable_var}) + return() + endif() + + set(_DESTINATION "${IDE_LIBEXEC_PATH}") + if (_arg_DESTINATION) + set(_DESTINATION "${_arg_DESTINATION}") + endif() + + set(_EXECUTABLE_PATH "${_DESTINATION}") + if (APPLE) + # path of executable might be inside app bundle instead of DESTINATION directly + cmake_parse_arguments(_prop "" "MACOSX_BUNDLE;OUTPUT_NAME" "" "${_arg_PROPERTIES}") + if (_prop_MACOSX_BUNDLE) + set(_BUNDLE_NAME "${name}") + if (_prop_OUTPUT_NAME) + set(_BUNDLE_NAME "${_prop_OUTPUT_NAME}") + endif() + set(_EXECUTABLE_PATH "${_DESTINATION}/${_BUNDLE_NAME}.app/Contents/MacOS") + endif() + endif() + + file(RELATIVE_PATH _RELATIVE_LIB_PATH "/${_EXECUTABLE_PATH}" "/${IDE_LIBRARY_PATH}") + + add_executable("${name}" ${_arg_SOURCES}) + target_include_directories("${name}" PRIVATE "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES}) + target_compile_definitions("${name}" PRIVATE ${_arg_DEFINES} ${TEST_DEFINES} ${DEFAULT_DEFINES}) + target_link_libraries("${name}" PRIVATE ${_arg_DEPENDS} ${_TEST_DEPENDS}) + set_target_properties("${name}" PROPERTIES + BUILD_RPATH "${_RPATH_BASE}/${_RELATIVE_LIB_PATH}" + INSTALL_RPATH "${_RPATH_BASE}/${_RELATIVE_LIB_PATH}" + RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${_DESTINATION}" + ${_arg_PROPERTIES} + ) + + if (NOT _arg_SKIP_INSTALL) + install(TARGETS ${name} DESTINATION "${_DESTINATION}") + endif() +endfunction() + +function(extend_qtc_executable name) + if (NOT (name IN_LIST __QTC_EXECUTABLES)) + message(FATAL_ERROR "extend_qtc_executable: Unknown executable target \"${name}\"") + endif() + if (TARGET ${name}) + extend_qtc_target(${name} ${ARGN}) + endif() +endfunction() + +function(add_qtc_test name) + cmake_parse_arguments(_arg "GTEST" "" "DEFINES;DEPENDS;INCLUDES;SOURCES" ${ARGN}) + + if ($_arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "add_qtc_test had unparsed arguments!") + endif() + + update_cached_list(__QTC_TESTS "${name}") + + set(TEST_DEFINES SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}") + file(RELATIVE_PATH _RPATH "/${IDE_BIN_PATH}" "/${IDE_LIBRARY_PATH}") + + add_executable(${name} ${_arg_SOURCES}) + + add_qtc_depends(${name} + PRIVATE ${_arg_DEPENDS} ${_TEST_DEPENDS} + ) + + target_include_directories(${name} PRIVATE "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES}) + target_compile_definitions(${name} PRIVATE ${_arg_DEFINES} ${TEST_DEFINES} ${DEFAULT_DEFINES}) + + set_target_properties(${name} PROPERTIES + BUILD_RPATH "${_RPATH_BASE}/${_RPATH}" + INSTALL_RPATH "${_RPATH_BASE}/${_RPATH}" + ) + + if (NOT _arg_GTEST) + add_test(NAME ${name} COMMAND ${name}) + fix_test_environment(${name}) + endif() +endfunction() + +function(finalize_qtc_gtest test_name) + get_target_property(test_sources ${test_name} SOURCES) + include(GoogleTest) + gtest_add_tests(TARGET ${test_name} SOURCES ${test_sources} TEST_LIST test_list) + + foreach(test IN LISTS test_list) + fix_test_environment(${test}) + endforeach() +endfunction() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cf807a680e2..d308c75c2f7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,547 +6,9 @@ list(APPEND DEFAULT_DEFINES QT_USE_FAST_CONCATENATION ) -set(__QTC_PLUGINS "" CACHE INTERNAL "*** Internal ***" FORCE) -set(__QTC_LIBRARIES "" CACHE INTERNAL "*** Internal ***" FORCE) -set(__QTC_EXECUTABLES "" CACHE INTERNAL "*** Internal ***" FORCE) -set(__QTC_TESTS "" CACHE INTERNAL "*** Internal ***" FORCE) - -function(update_cached_list name value) - set(_tmp_list "${${name}}") - list(APPEND _tmp_list "${value}") - set("${name}" "${_tmp_list}" CACHE INTERNAL "*** Internal ***" FORCE) -endfunction() - -function(compare_sources_with_existing_disk_files target_name sources) - if(NOT WITH_DEBUG_CMAKE) - return() - endif() - - file(GLOB_RECURSE existing_files RELATIVE ${CMAKE_CURRENT_LIST_DIR} "*.cpp" "*.hpp" "*.c" "*.h" "*.ui" "*.qrc") - foreach(file IN LISTS existing_files) - if(NOT ${file} IN_LIST sources) - if (NOT WITH_TESTS AND ${file} MATCHES "test") - continue() - endif() - message(STATUS "${target_name} doesn't include ${file}") - endif() - endforeach() - - foreach(source IN LISTS "${sources}") - if(NOT ${source} IN_LIST existing_files) - if (NOT WITH_TESTS AND ${file} MATCHES "test") - continue() - endif() - message(STATUS "${target_name} contains non existing ${source}") - endif() - endforeach() -endfunction(compare_sources_with_existing_disk_files) - -function(separate_object_libraries libraries REGULAR_LIBS OBJECT_LIBS OBJECT_LIB_OBJECTS) - if (CMAKE_VERSION VERSION_LESS 3.14) - foreach(lib IN LISTS libraries) - if (TARGET ${lib}) - get_target_property(lib_type ${lib} TYPE) - if (lib_type STREQUAL "OBJECT_LIBRARY") - list(APPEND object_libs ${lib}) - list(APPEND object_libs_objects $) - else() - list(APPEND regular_libs ${lib}) - endif() - else() - list(APPEND regular_libs ${lib}) - endif() - set(${REGULAR_LIBS} ${regular_libs} PARENT_SCOPE) - set(${OBJECT_LIBS} ${object_libs} PARENT_SCOPE) - set(${OBJECT_LIB_OBJECTS} ${object_libs_objects} PARENT_SCOPE) - endforeach() - else() - set(${REGULAR_LIBS} ${libraries} PARENT_SCOPE) - unset(${OBJECT_LIBS} PARENT_SCOPE) - unset(${OBJECT_LIB_OBJECTS} PARENT_SCOPE) - endif() -endfunction(separate_object_libraries) - -function(set_explicit_moc target_name file) - set_property(SOURCE "${file}" PROPERTY SKIP_AUTOMOC ON) - qt5_wrap_cpp(file_moc "${file}") - target_sources(${target_name} PRIVATE "${file_moc}") -endfunction() - -function(add_qtc_depends target_name) - cmake_parse_arguments(_arg "" "" "PRIVATE;PUBLIC" ${ARGN}) - if (${_arg_UNPARSED_ARGUMENTS}) - message(FATAL_ERROR "add_qtc_depends had unparsed arguments") - endif() - - separate_object_libraries("${_arg_PRIVATE}" - depends object_lib_depends object_lib_depends_objects) - separate_object_libraries("${_arg_PUBLIC}" - public_depends object_public_depends object_public_depends_objects) - - target_sources(${target_name} PRIVATE ${object_lib_depends_objects} ${object_public_depends_objects}) - - get_target_property(target_type ${target_name} TYPE) - if (NOT target_type STREQUAL "OBJECT_LIBRARY") - target_link_libraries(${target_name} PRIVATE ${depends} PUBLIC ${public_depends}) - else() - list(APPEND object_lib_depends ${depends}) - list(APPEND object_public_depends ${public_depends}) - endif() - - foreach(obj_lib IN LISTS object_lib_depends) - target_compile_definitions(${target_name} PRIVATE $) - target_include_directories(${target_name} PRIVATE $) - endforeach() - foreach(obj_lib IN LISTS object_public_depends) - target_compile_definitions(${target_name} PUBLIC $) - target_include_directories(${target_name} PUBLIC $) - endforeach() - -endfunction() - -function(add_qtc_library name) - cmake_parse_arguments(_arg "STATIC;OBJECT" "" - "DEFINES;DEPENDS;INCLUDES;PUBLIC_DEFINES;PUBLIC_DEPENDS;PUBLIC_INCLUDES;SOURCES;EXPLICIT_MOC;SKIP_AUTOMOC;PROPERTIES" ${ARGN} - ) - - if (${_arg_UNPARSED_ARGUMENTS}) - message(FATAL_ERROR "add_qtc_library had unparsed arguments") - endif() - - update_cached_list(__QTC_LIBRARIES "${name}") - - compare_sources_with_existing_disk_files(${name} "${_arg_SOURCES}") - - set(library_type SHARED) - if (_arg_STATIC) - set(library_type STATIC) - endif() - if (_arg_OBJECT) - set(library_type OBJECT) - endif() - - # Do not just build libraries... - add_library(${name} ${library_type} EXCLUDE_FROM_ALL ${_arg_SOURCES}) - - if (${name} MATCHES "^[^0-9]+") - string(TOUPPER "${name}_LIBRARY" EXPORT_SYMBOL) - endif() - - if (WITH_TESTS) - set(TEST_DEFINES WITH_TESTS SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}") - endif() - - target_include_directories(${name} - PRIVATE ${_arg_INCLUDES} - PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/.." ${_arg_PUBLIC_INCLUDES} - ) - target_compile_definitions(${name} - PRIVATE ${EXPORT_SYMBOL} ${DEFAULT_DEFINES} ${_arg_DEFINES} ${TEST_DEFINES} - PUBLIC ${_arg_PUBLIC_DEFINES} - ) - - add_qtc_depends(${name} - PRIVATE ${_arg_DEPENDS} ${_TEST_DEPENDS} - PUBLIC ${_arg_PUBLIC_DEPENDS} - ) - - foreach(file IN LISTS _arg_EXPLICIT_MOC) - set_explicit_moc(${name} "${file}") - endforeach() - - foreach(file IN LISTS _arg_SKIP_AUTOMOC) - set_property(SOURCE ${file} PROPERTY SKIP_AUTOMOC ON) - endforeach() - - set_target_properties(${name} PROPERTIES - SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}" - VERSION "${PROJECT_VERSION}" - CXX_VISIBILITY_PRESET hidden - VISIBILITY_INLINES_HIDDEN ON - BUILD_RPATH "${_LIB_RPATH}" - INSTALL_RPATH "${_LIB_RPATH}" - RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${IDE_BIN_PATH}" - LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${IDE_LIBRARY_PATH}" - ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${IDE_LIBRARY_PATH}" - ${_arg_PROPERTIES} - ) - - if (NOT (${library_type} STREQUAL "OBJECT" AND CMAKE_VERSION VERSION_LESS 3.14)) - install(TARGETS ${name} - RUNTIME DESTINATION "${IDE_BIN_PATH}" - LIBRARY DESTINATION "${IDE_LIBRARY_PATH}" - ARCHIVE DESTINATION "${IDE_LIBRARY_PATH}" - ) - endif() - -endfunction(add_qtc_library) - -function(find_dependent_plugins varName) - set(_RESULT ${ARGN}) - - foreach(i ${ARGN}) - get_property(_dep TARGET "${i}" PROPERTY _arg_DEPENDS) - if (_dep) - find_dependent_plugins(_REC ${_dep}) - list(APPEND _RESULT ${_REC}) - endif() - endforeach() - - if (_RESULT) - list(REMOVE_DUPLICATES _RESULT) - list(SORT _RESULT) - endif() - - set("${varName}" ${_RESULT} PARENT_SCOPE) -endfunction() - -function(qtc_plugin_enabled varName name) - if (NOT (name IN_LIST __QTC_PLUGINS)) - message(FATAL_ERROR "extend_qtc_plugin: Unknown plugin target \"${name}\"") - endif() - if (TARGET ${name}) - set(${varName} ON PARENT_SCOPE) - else() - set(${varName} OFF PARENT_SCOPE) - endif() -endfunction() - -function(add_qtc_plugin target_name) - cmake_parse_arguments(_arg - "EXPERIMENTAL;SKIP_DEBUG_CMAKE_FILE_CHECK;SKIP_INSTALL" - "VERSION;COMPAT_VERSION;PLUGIN_JSON_IN;PLUGIN_PATH;PLUGIN_NAME;OUTPUT_NAME" - "CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;INCLUDES;PUBLIC_INCLUDES;PLUGIN_DEPENDS;PLUGIN_RECOMMENDS;SOURCES;EXPLICIT_MOC" - ${ARGN} - ) - - if (${_arg_UNPARSED_ARGUMENTS}) - message(FATAL_ERROR "add_qtc_plugin had unparsed arguments") - endif() - - update_cached_list(__QTC_PLUGINS "${target_name}") - - set(name ${target_name}) - if (_arg_PLUGIN_NAME) - set(name ${_arg_PLUGIN_NAME}) - endif() - - if (NOT _arg_CONDITION) - set(_arg_CONDITION ON) - set(_extra_text "") - else() - string(REPLACE ";" " " _contents "${_arg_CONDITION}") - set(_extra_text "with CONDITION ${_contents}") - endif() - - string(TOUPPER "BUILD_PLUGIN_${target_name}" _build_plugin_var) - set(_build_plugin_default "ON") - if (DEFINED ENV{QTC_${_build_plugin_var}}) - set(_build_plugin_default "$ENV{QTC_${_build_plugin_var}}") - endif() - set(${_build_plugin_var} "${_build_plugin_default}" CACHE BOOL "Build plugin ${name}.") - - if ((${_arg_CONDITION}) AND ${_build_plugin_var}) - set(_plugin_enabled ON) - else() - set(_plugin_enabled OFF) - endif() - - add_feature_info("Plugin ${name}" _plugin_enabled "${_extra_text}") - if (NOT _plugin_enabled) - return() - endif() - - ### Generate plugin.json file: - if (NOT _arg_VERSION) - set(_arg_VERSION ${PROJECT_VERSION}) - endif() - if (NOT _arg_COMPAT_VERSION) - set(_arg_COMPAT_VERSION ${_arg_VERSION}) - endif() - - if (NOT _arg_SKIP_DEBUG_CMAKE_FILE_CHECK) - compare_sources_with_existing_disk_files(${target_name} "${_arg_SOURCES}") - endif() - - # Generate dependency list: - find_dependent_plugins(_DEP_PLUGINS ${_arg_PLUGIN_DEPENDS}) - - set(_arg_DEPENDENCY_STRING "\"Dependencies\" : [\n") - foreach(i IN LISTS _DEP_PLUGINS) - get_property(_v TARGET "${i}" PROPERTY _arg_VERSION) - string(APPEND _arg_DEPENDENCY_STRING - " { \"Name\" : \"${i}\", \"Version\" : \"${_v}\" }" - ) - endforeach(i) - string(REPLACE "} {" "},\n {" - _arg_DEPENDENCY_STRING "${_arg_DEPENDENCY_STRING}" - ) - foreach(i IN LISTS ${_arg_RECOMMENDS}) - get_property(_v TARGET "${i}" PROPERTY _arg_VERSION) - string(APPEND _arg_DEPENDENCY_STRING - " { \"Name\" : \"${i}\", \"Version\" : \"${_v}\", \"Type\" : \"optional\" }" - ) - endforeach(i) - string(APPEND _arg_DEPENDENCY_STRING "\n ]") - if (_arg_EXPERIMENTAL) - string(APPEND _arg_DEPENDENCY_STRING ",\n \"Experimental\" : true") - endif() - - set(IDE_PLUGIN_DEPENDENCY_STRING ${_arg_DEPENDENCY_STRING}) - - ### Configure plugin.json file: - if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${name}.json.in") - file(READ "${name}.json.in" plugin_json_in) - string(REPLACE "\\\"" "\"" plugin_json_in ${plugin_json_in}) - string(REPLACE "\\'" "'" plugin_json_in ${plugin_json_in}) - string(REPLACE "$$QTCREATOR_VERSION" "\${IDE_VERSION}" plugin_json_in ${plugin_json_in}) - string(REPLACE "$$QTCREATOR_COMPAT_VERSION" "\${IDE_VERSION_COMPAT}" plugin_json_in ${plugin_json_in}) - string(REPLACE "$$QTCREATOR_COPYRIGHT_YEAR" "\${IDE_COPYRIGHT_YEAR}" plugin_json_in ${plugin_json_in}) - string(REPLACE "$$dependencyList" "\${IDE_PLUGIN_DEPENDENCY_STRING}" plugin_json_in ${plugin_json_in}) - if(_arg_PLUGIN_JSON_IN) - #e.g. UPDATEINFO_EXPERIMENTAL_STR=true - string(REGEX REPLACE "=.*$" "" json_key ${_arg_PLUGIN_JSON_IN}) - string(REGEX REPLACE "^.*=" "" json_value ${_arg_PLUGIN_JSON_IN}) - string(REPLACE "$$${json_key}" "${json_value}" plugin_json_in ${plugin_json_in}) - endif() - file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${name}.json.cmakein" ${plugin_json_in}) - - configure_file("${CMAKE_CURRENT_BINARY_DIR}/${name}.json.cmakein" "${name}.json") - endif() - - add_library(${target_name} SHARED ${_arg_SOURCES}) - - ### Generate EXPORT_SYMBOL - string(TOUPPER "${name}_LIBRARY" EXPORT_SYMBOL) - - if (WITH_TESTS) - set(TEST_DEFINES WITH_TESTS SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}") - endif() - - target_include_directories(${target_name} - PRIVATE ${_arg_INCLUDES} "${CMAKE_CURRENT_SOURCE_DIR}/.." "${CMAKE_CURRENT_BINARY_DIR}" - "${CMAKE_BINARY_DIR}/src" - PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/.." ${_arg_PUBLIC_INCLUDES} - ) - target_compile_definitions(${target_name} - PRIVATE ${EXPORT_SYMBOL} ${DEFAULT_DEFINES} ${_arg_DEFINES} ${TEST_DEFINES} - ) - - add_qtc_depends(${target_name} - PRIVATE ${_arg_DEPENDS} ${_DEP_PLUGINS} ${_TEST_DEPENDS} - PUBLIC ${_arg_PUBLIC_DEPENDS} - ) - - set(plugin_dir "${IDE_PLUGIN_PATH}") - if (_arg_PLUGIN_PATH) - set(plugin_dir "${_arg_PLUGIN_PATH}") - endif() - - set_target_properties(${target_name} PROPERTIES - SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}" - CXX_VISIBILITY_PRESET hidden - VISIBILITY_INLINES_HIDDEN ON - _arg_DEPENDS "${_arg_PLUGIN_DEPENDS}" - _arg_VERSION "${_arg_VERSION}" - BUILD_RPATH "${_PLUGIN_RPATH}" - INSTALL_RPATH "${_PLUGIN_RPATH}" - LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${plugin_dir}" - ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${plugin_dir}" - RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${plugin_dir}" - OUTPUT_NAME "${name}" - ${_arg_PROPERTIES} - ) - - foreach(file IN LISTS _arg_EXPLICIT_MOC) - set_explicit_moc(${target_name} "${file}") - endforeach() - - if (NOT _arg_SKIP_INSTALL) - install(TARGETS ${target_name} - LIBRARY DESTINATION "${plugin_dir}" - ARCHIVE DESTINATION "${plugin_dir}" - RUNTIME DESTINATION "${plugin_dir}" - ) - endif() -endfunction() - -function(extend_qtc_target target_name) - cmake_parse_arguments(_arg - "" - "SOURCES_PREFIX" - "CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;INCLUDES;PUBLIC_INCLUDES;SOURCES;EXPLICIT_MOC" - ${ARGN} - ) - - if (${_arg_UNPARSED_ARGUMENTS}) - message(FATAL_ERROR "extend_qtc_target had unparsed arguments") - endif() - - if (NOT _arg_CONDITION) - set(_arg_CONDITION ON) - endif() - if (NOT (${_arg_CONDITION})) - return() - endif() - - add_qtc_depends(${target_name} - PRIVATE ${_arg_DEPENDS} - PUBLIC ${_arg_PUBLIC_DEPENDS} - ) - target_compile_definitions(${target_name} PRIVATE ${_arg_DEFINES}) - target_include_directories(${target_name} PRIVATE ${_arg_INCLUDES} PUBLIC ${_arg_PUBLIC_INCLUDES}) - - if (_arg_SOURCES_PREFIX) - foreach(source IN LISTS _arg_SOURCES) - list(APPEND prefixed_sources "${_arg_SOURCES_PREFIX}/${source}") - endforeach() - target_include_directories(${target_name} PUBLIC "${_arg_SOURCES_PREFIX}") - set(_arg_SOURCES ${prefixed_sources}) - endif() - target_sources(${target_name} PRIVATE ${_arg_SOURCES}) - - foreach(file IN LISTS _arg_EXPLICIT_MOC) - set_explicit_moc(${target_name} "${file}") - endforeach() - -endfunction() - -function(extend_qtc_plugin target_name) - qtc_plugin_enabled(_plugin_enabled ${target_name}) - if (NOT _plugin_enabled) - return() - endif() - - extend_qtc_target(${target_name} ${ARGN}) -endfunction() - -function(add_qtc_executable name) - cmake_parse_arguments(_arg "SKIP_INSTALL" "DESTINATION" "DEFINES;DEPENDS;INCLUDES;SOURCES;PROPERTIES" ${ARGN}) - - if ($_arg_UNPARSED_ARGUMENTS) - message(FATAL_ERROR "add_qtc_executable had unparsed arguments!") - endif() - - update_cached_list(__QTC_EXECUTABLES "${name}") - - string(TOUPPER "BUILD_EXECUTABLE_${name}" _build_executable_var) - set(_build_executable_default "ON") - if (DEFINED ENV{QTC_${_build_executable_var}}) - set(_build_executable_default "$ENV{QTC_${_build_executable_var}}") - endif() - set(${_build_executable_var} "${_build_executable_default}" CACHE BOOL "Build executable ${name}.") - - if (NOT ${_build_executable_var}) - return() - endif() - - set(_DESTINATION "${IDE_LIBEXEC_PATH}") - if (_arg_DESTINATION) - set(_DESTINATION "${_arg_DESTINATION}") - endif() - - set(_EXECUTABLE_PATH "${_DESTINATION}") - if (APPLE) - # path of executable might be inside app bundle instead of DESTINATION directly - cmake_parse_arguments(_prop "" "MACOSX_BUNDLE;OUTPUT_NAME" "" "${_arg_PROPERTIES}") - if (_prop_MACOSX_BUNDLE) - set(_BUNDLE_NAME "${name}") - if (_prop_OUTPUT_NAME) - set(_BUNDLE_NAME "${_prop_OUTPUT_NAME}") - endif() - set(_EXECUTABLE_PATH "${_DESTINATION}/${_BUNDLE_NAME}.app/Contents/MacOS") - endif() - endif() - - file(RELATIVE_PATH _RELATIVE_LIB_PATH "/${_EXECUTABLE_PATH}" "/${IDE_LIBRARY_PATH}") - - add_executable("${name}" ${_arg_SOURCES}) - target_include_directories("${name}" PRIVATE "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES}) - target_compile_definitions("${name}" PRIVATE ${_arg_DEFINES} ${TEST_DEFINES} ${DEFAULT_DEFINES}) - target_link_libraries("${name}" PRIVATE ${_arg_DEPENDS} ${_TEST_DEPENDS}) - set_target_properties("${name}" PROPERTIES - BUILD_RPATH "${_RPATH_BASE}/${_RELATIVE_LIB_PATH}" - INSTALL_RPATH "${_RPATH_BASE}/${_RELATIVE_LIB_PATH}" - RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/${_DESTINATION}" - ${_arg_PROPERTIES} - ) - - if (NOT _arg_SKIP_INSTALL) - install(TARGETS ${name} DESTINATION "${_DESTINATION}") - endif() -endfunction() - -function(extend_qtc_executable name) - if (NOT (name IN_LIST __QTC_EXECUTABLES)) - message(FATAL_ERROR "extend_qtc_executable: Unknown executable target \"${name}\"") - endif() - if (TARGET ${name}) - extend_qtc_target(${name} ${ARGN}) - endif() -endfunction() - -function(fix_test_environment test_name) - if (WIN32) - list(APPEND env_path $ENV{PATH}) - list(APPEND env_path ${CMAKE_BINARY_DIR}/${IDE_PLUGIN_PATH}) - list(APPEND env_path ${CMAKE_BINARY_DIR}/${IDE_BIN_PATH}) - list(APPEND env_path $) - if (TARGET libclang) - list(APPEND env_path $) - endif() - - string(REPLACE "/" "\\" env_path "${env_path}") - string(REPLACE ";" "\\;" env_path "${env_path}") - - set_tests_properties(${test_name} PROPERTIES ENVIRONMENT "PATH=${env_path}") - endif() -endfunction() - -function(add_qtc_test name) - cmake_parse_arguments(_arg "GTEST" "" "DEFINES;DEPENDS;INCLUDES;SOURCES" ${ARGN}) - - if ($_arg_UNPARSED_ARGUMENTS) - message(FATAL_ERROR "add_qtc_test had unparsed arguments!") - endif() - - update_cached_list(__QTC_TESTS "${name}") - - set(TEST_DEFINES SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}") - file(RELATIVE_PATH _RPATH "/${IDE_BIN_PATH}" "/${IDE_LIBRARY_PATH}") - - add_executable(${name} ${_arg_SOURCES}) - - add_qtc_depends(${name} - PRIVATE ${_arg_DEPENDS} ${_TEST_DEPENDS} - ) - - target_include_directories(${name} PRIVATE "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES}) - target_compile_definitions(${name} PRIVATE ${_arg_DEFINES} ${TEST_DEFINES} ${DEFAULT_DEFINES}) - - set_target_properties(${name} PROPERTIES - BUILD_RPATH "${_RPATH_BASE}/${_RPATH}" - INSTALL_RPATH "${_RPATH_BASE}/${_RPATH}" - ) - - if (NOT _arg_GTEST) - add_test(NAME ${name} COMMAND ${name}) - fix_test_environment(${name}) - endif() -endfunction() - -function(finalize_qtc_gtest test_name) - get_target_property(test_sources ${test_name} SOURCES) - include(GoogleTest) - gtest_add_tests(TARGET ${test_name} SOURCES ${test_sources} TEST_LIST test_list) - - foreach(test IN LISTS test_list) - fix_test_environment(${test}) - endforeach() -endfunction() - add_library(app_version INTERFACE) -target_include_directories(app_version INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) +target_include_directories(app_version INTERFACE $) +install(TARGETS app_version EXPORT QtCreator) add_subdirectory(libs) add_subdirectory(share) @@ -554,3 +16,67 @@ add_subdirectory(shared) add_subdirectory(app) add_subdirectory(plugins) add_subdirectory(tools) + +install( + FILES + ${PROJECT_SOURCE_DIR}/HACKING + ${PROJECT_SOURCE_DIR}/LICENSE.GPL3-EXCEPT + ${PROJECT_SOURCE_DIR}/README.md + DESTINATION ./ + COMPONENT Devel EXCLUDE_FROM_ALL +) + +install( + DIRECTORY + ${PROJECT_SOURCE_DIR}/doc + ${PROJECT_SOURCE_DIR}/scripts + DESTINATION ./ + COMPONENT Devel EXCLUDE_FROM_ALL +) + +install(EXPORT QtCreator + DESTINATION "lib/cmake/QtCreator" + COMPONENT Devel EXCLUDE_FROM_ALL + NAMESPACE QtCreator:: + FILE QtCreatorTargets.cmake +) + +file(WRITE ${CMAKE_BINARY_DIR}/cmake/QtCreatorConfig.cmake " +include(CMakeFindDependencyMacro) +find_dependency(Qt5 + COMPONENTS Concurrent Core Network PrintSupport Qml Quick QuickWidgets Sql REQUIRED +) + +if (NOT IDE_VERSION) + include(\${CMAKE_CURRENT_LIST_DIR}/QtCreatorIDEBranding.cmake) +endif() + +if (NOT DEFINED add_qtc_plugin) + include(\${CMAKE_CURRENT_LIST_DIR}/QtCreatorAPI.cmake) +endif() + +if (NOT TARGET QtCreator::Core) + include(\${CMAKE_CURRENT_LIST_DIR}/QtCreatorTargets.cmake) +endif() +") + +# Local build export +export(EXPORT QtCreator + NAMESPACE QtCreator:: + FILE ${CMAKE_BINARY_DIR}/cmake/QtCreatorTargets.cmake) + +file(COPY + ${PROJECT_SOURCE_DIR}/cmake/QtCreatorIDEBranding.cmake + ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPI.cmake + DESTINATION ${CMAKE_BINARY_DIR}/cmake +) + +# Devel package install +install( + FILES + ${PROJECT_SOURCE_DIR}/cmake/QtCreatorIDEBranding.cmake + ${PROJECT_SOURCE_DIR}/cmake/QtCreatorAPI.cmake + ${CMAKE_BINARY_DIR}/cmake/QtCreatorConfig.cmake + DESTINATION lib/cmake/QtCreator + COMPONENT Devel EXCLUDE_FROM_ALL +) diff --git a/src/libs/3rdparty/cplusplus/CMakeLists.txt b/src/libs/3rdparty/cplusplus/CMakeLists.txt index a33e96a1972..11ba09cab62 100644 --- a/src/libs/3rdparty/cplusplus/CMakeLists.txt +++ b/src/libs/3rdparty/cplusplus/CMakeLists.txt @@ -1,7 +1,7 @@ add_qtc_library(3rd_cplusplus OBJECT PUBLIC_DEPENDS Qt5::Core Utils DEFINES CPLUSPLUS_BUILD_LIB - INCLUDES "${CMAKE_SOURCE_DIR}/src/libs" + INCLUDES "${PROJECT_SOURCE_DIR}/src/libs" SOURCES AST.cpp AST.h ASTClone.cpp diff --git a/src/libs/clangsupport/CMakeLists.txt b/src/libs/clangsupport/CMakeLists.txt index b3c20f30620..5357bd34c4c 100644 --- a/src/libs/clangsupport/CMakeLists.txt +++ b/src/libs/clangsupport/CMakeLists.txt @@ -1,6 +1,5 @@ add_qtc_library(ClangSupport PUBLIC_DEPENDS Utils Sqlite Qt5::Core Qt5::Network - PUBLIC_INCLUDES "${CMAKE_CURRENT_LIST_DIR}" PUBLIC_DEFINES CLANG_VERSION="${CLANG_VERSION}" CLANG_RESOURCE_DIR="${CLANG_RESOURCE_DIR}" diff --git a/src/libs/cplusplus/CMakeLists.txt b/src/libs/cplusplus/CMakeLists.txt index 593d809394a..afeec6c7e74 100644 --- a/src/libs/cplusplus/CMakeLists.txt +++ b/src/libs/cplusplus/CMakeLists.txt @@ -6,7 +6,7 @@ add_qtc_library(CPlusPlus DEPENDS Utils DEFINES CPLUSPLUS_BUILD_LIB PUBLIC_DEPENDS 3rd_cplusplus Qt5::Concurrent Qt5::Gui - PUBLIC_INCLUDES "${CMAKE_SOURCE_DIR}/src/libs/3rdparty" + PUBLIC_INCLUDES src/libs/3rdparty SOURCES ASTParent.cpp ASTParent.h ASTPath.cpp ASTPath.h diff --git a/src/libs/modelinglib/CMakeLists.txt b/src/libs/modelinglib/CMakeLists.txt index 7b09c932e4a..55c6e3a951d 100644 --- a/src/libs/modelinglib/CMakeLists.txt +++ b/src/libs/modelinglib/CMakeLists.txt @@ -3,7 +3,6 @@ add_qtc_library(Modeling DEPENDS Qt5::Widgets Utils PUBLIC_DEPENDS OptionalSvg INCLUDES qtserialization/inc - PUBLIC_INCLUDES "${CMAKE_CURRENT_LIST_DIR}" SOURCES qmt/config/configcontroller.cpp qmt/config/configcontroller.h qmt/config/sourcepos.cpp qmt/config/sourcepos.h diff --git a/src/libs/sqlite/CMakeLists.txt b/src/libs/sqlite/CMakeLists.txt index 22ba4bac340..48eda5cf922 100644 --- a/src/libs/sqlite/CMakeLists.txt +++ b/src/libs/sqlite/CMakeLists.txt @@ -4,7 +4,7 @@ add_qtc_library(Sqlite SQLITE_ENABLE_UNLOCK_NOTIFY SQLITE_ENABLE_COLUMN_METADATA BUILD_SQLITE_LIBRARY DEPENDS Qt5::Core - PUBLIC_INCLUDES "${CMAKE_CURRENT_LIST_DIR}" "${CMAKE_CURRENT_LIST_DIR}/../3rdparty/sqlite" + PUBLIC_INCLUDES ../3rdparty/sqlite SOURCES ../3rdparty/sqlite/sqlite3.c createtablesqlstatementbuilder.cpp createtablesqlstatementbuilder.h diff --git a/src/libs/tracing/CMakeLists.txt b/src/libs/tracing/CMakeLists.txt index 153756323e6..41a42bbac51 100644 --- a/src/libs/tracing/CMakeLists.txt +++ b/src/libs/tracing/CMakeLists.txt @@ -6,7 +6,6 @@ endif() add_qtc_library(Tracing DEPENDS Utils Qt5::Qml Qt5::Quick - PUBLIC_INCLUDES "${CMAKE_CURRENT_SOURCE_DIR}" SOURCES ${TEST_SOURCES} flamegraph.cpp flamegraph.h flamegraphattached.h diff --git a/src/shared/help/CMakeLists.txt b/src/shared/help/CMakeLists.txt index 1058d6d3add..6953123beef 100644 --- a/src/shared/help/CMakeLists.txt +++ b/src/shared/help/CMakeLists.txt @@ -3,7 +3,7 @@ if (NOT TARGET Qt5::Help) return() endif() -set(PLUGIN_SOURCE_DIR "${CMAKE_SOURCE_DIR}/src/plugins") +set(PLUGIN_SOURCE_DIR "${PROJECT_SOURCE_DIR}/src/plugins") add_qtc_library(shared_help STATIC DEPENDS Utils PUBLIC Qt5::Help Qt5::PrintSupport Qt5::Widgets @@ -12,7 +12,6 @@ add_qtc_library(shared_help STATIC "${PLUGIN_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/shared_help_autogen/include" "${CMAKE_CURRENT_BINARY_DIR}/" - "${CMAKE_CURRENT_SOURCE_DIR}" SOURCES bookmarkdialog.ui bookmarkmanager.cpp bookmarkmanager.h diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 6ee231bb20e..a5b24d59de1 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -1,4 +1,4 @@ -set(SRCDIR "${CMAKE_SOURCE_DIR}/share/qtcreator/qml/qmlpuppet") +set(SRCDIR "${PROJECT_SOURCE_DIR}/share/qtcreator/qml/qmlpuppet") set(DESTDIR "${IDE_LIBEXEC_PATH}") if (APPLE) @@ -17,7 +17,7 @@ add_qtc_executable(qml2puppet extend_qtc_executable(qml2puppet SOURCES_PREFIX "${SRCDIR}/commands" - INCLUDES "${CMAKE_SOURCE_DIR}/src/libs" + INCLUDES "${PROJECT_SOURCE_DIR}/src/libs" SOURCES changeauxiliarycommand.cpp changeauxiliarycommand.h changebindingscommand.cpp changebindingscommand.h diff --git a/tests/auto/algorithm/CMakeLists.txt b/tests/auto/algorithm/CMakeLists.txt index f856b348363..212c5ad32ac 100644 --- a/tests/auto/algorithm/CMakeLists.txt +++ b/tests/auto/algorithm/CMakeLists.txt @@ -1,4 +1,4 @@ add_qtc_test(tst_algorithm - INCLUDES "${CMAKE_SOURCE_DIR}/src/libs" + INCLUDES "${PROJECT_SOURCE_DIR}/src/libs" SOURCES tst_algorithm.cpp ) diff --git a/tests/auto/debugger/CMakeLists.txt b/tests/auto/debugger/CMakeLists.txt index b4e7da69dcc..c0b315d859c 100644 --- a/tests/auto/debugger/CMakeLists.txt +++ b/tests/auto/debugger/CMakeLists.txt @@ -1,4 +1,4 @@ -set(DEBUGGERDIR "${CMAKE_SOURCE_DIR}/src/plugins/debugger") +set(DEBUGGERDIR "${PROJECT_SOURCE_DIR}/src/plugins/debugger") add_qtc_test(tst_debugger_disassembler INCLUDES "${DEBUGGERDIR}" @@ -10,7 +10,7 @@ add_qtc_test(tst_debugger_disassembler if (WITH_DEBUGGER_DUMPERS) add_qtc_test(tst_debugger_dumpers DEPENDS Qt5::Network Utils - DEFINES DUMPERDIR="${CMAKE_SOURCE_DIR}/share/qtcreator/debugger" + DEFINES DUMPERDIR="${PROJECT_SOURCE_DIR}/share/qtcreator/debugger" INCLUDES "${DEBUGGERDIR}" SOURCES diff --git a/tests/auto/extensionsystem/pluginmanager/circularplugins/CMakeLists.txt b/tests/auto/extensionsystem/pluginmanager/circularplugins/CMakeLists.txt index bbf4a58ef9f..29b93fe1797 100644 --- a/tests/auto/extensionsystem/pluginmanager/circularplugins/CMakeLists.txt +++ b/tests/auto/extensionsystem/pluginmanager/circularplugins/CMakeLists.txt @@ -1,4 +1,4 @@ -set(TEST_PLUGIN_PATH "${CMAKE_CURRENT_BINARY_DIR}") +file(RELATIVE_PATH TEST_PLUGIN_PATH ${QtCreator_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(plugin1) add_subdirectory(plugin2) add_subdirectory(plugin3) diff --git a/tests/auto/extensionsystem/pluginmanager/correctplugins1/CMakeLists.txt b/tests/auto/extensionsystem/pluginmanager/correctplugins1/CMakeLists.txt index bbf4a58ef9f..29b93fe1797 100644 --- a/tests/auto/extensionsystem/pluginmanager/correctplugins1/CMakeLists.txt +++ b/tests/auto/extensionsystem/pluginmanager/correctplugins1/CMakeLists.txt @@ -1,4 +1,4 @@ -set(TEST_PLUGIN_PATH "${CMAKE_CURRENT_BINARY_DIR}") +file(RELATIVE_PATH TEST_PLUGIN_PATH ${QtCreator_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(plugin1) add_subdirectory(plugin2) add_subdirectory(plugin3) diff --git a/tests/auto/extensionsystem/pluginspec/testplugin/CMakeLists.txt b/tests/auto/extensionsystem/pluginspec/testplugin/CMakeLists.txt index df9fe192440..8bf159368b3 100644 --- a/tests/auto/extensionsystem/pluginspec/testplugin/CMakeLists.txt +++ b/tests/auto/extensionsystem/pluginspec/testplugin/CMakeLists.txt @@ -7,12 +7,14 @@ else() set(plugin_output_name "testd4") endif() +file(RELATIVE_PATH TEST_PLUGIN_PATH ${QtCreator_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}) + add_qtc_plugin(testplugin DEPENDS ExtensionSystem DEFINES MYPLUGIN_LIBRARY SOURCES testplugin.cpp testplugin.h - PLUGIN_PATH "${CMAKE_CURRENT_BINARY_DIR}" + PLUGIN_PATH "${TEST_PLUGIN_PATH}" PROPERTIES OUTPUT_NAME ${plugin_output_name} SKIP_INSTALL diff --git a/tests/auto/externaltool/CMakeLists.txt b/tests/auto/externaltool/CMakeLists.txt index 64a6004150c..944c3dc671c 100644 --- a/tests/auto/externaltool/CMakeLists.txt +++ b/tests/auto/externaltool/CMakeLists.txt @@ -2,6 +2,6 @@ add_qtc_test(tst_externaltooltest DEPENDS Core app_version SOURCES tst_externaltooltest.cpp - "${CMAKE_SOURCE_DIR}/src/plugins/coreplugin/externaltool.cpp" - "${CMAKE_SOURCE_DIR}/src/plugins/coreplugin/externaltool.h" + "${PROJECT_SOURCE_DIR}/src/plugins/coreplugin/externaltool.cpp" + "${PROJECT_SOURCE_DIR}/src/plugins/coreplugin/externaltool.h" ) diff --git a/tests/auto/json/CMakeLists.txt b/tests/auto/json/CMakeLists.txt index e03addf91d2..111a5ae4d94 100644 --- a/tests/auto/json/CMakeLists.txt +++ b/tests/auto/json/CMakeLists.txt @@ -1,7 +1,7 @@ add_qtc_test(tst_json DEPENDS Utils - INCLUDES "${CMAKE_SOURCE_DIR}/src/shared/json" + INCLUDES "${PROJECT_SOURCE_DIR}/src/shared/json" SOURCES tst_json.cpp - "${CMAKE_SOURCE_DIR}/src/shared/json/json.cpp" + "${PROJECT_SOURCE_DIR}/src/shared/json/json.cpp" ) diff --git a/tests/auto/pointeralgorithm/CMakeLists.txt b/tests/auto/pointeralgorithm/CMakeLists.txt index 52a8bbc4992..bd1f61dd393 100644 --- a/tests/auto/pointeralgorithm/CMakeLists.txt +++ b/tests/auto/pointeralgorithm/CMakeLists.txt @@ -1,4 +1,4 @@ add_qtc_test(tst_pointeralgorithm - INCLUDES "${CMAKE_SOURCE_DIR}/src/libs" + INCLUDES "${PROJECT_SOURCE_DIR}/src/libs" SOURCES tst_pointeralgorithm.cpp ) diff --git a/tests/auto/profilewriter/CMakeLists.txt b/tests/auto/profilewriter/CMakeLists.txt index c929843c830..766fd2607b1 100644 --- a/tests/auto/profilewriter/CMakeLists.txt +++ b/tests/auto/profilewriter/CMakeLists.txt @@ -1,5 +1,5 @@ add_qtc_test(tst_profilewriter DEPENDS Utils ProParser - INCLUDES "${CMAKE_SOURCE_DIR}/src/shared/proparser" + INCLUDES "${PROJECT_SOURCE_DIR}/src/shared/proparser" SOURCES tst_profilewriter.cpp ) diff --git a/tests/auto/qml/codemodel/check/CMakeLists.txt b/tests/auto/qml/codemodel/check/CMakeLists.txt index fdcd1334bda..c5d45604d20 100644 --- a/tests/auto/qml/codemodel/check/CMakeLists.txt +++ b/tests/auto/qml/codemodel/check/CMakeLists.txt @@ -2,7 +2,7 @@ add_qtc_test(tst_qml_check DEPENDS qmljs DEFINES QT_CREATOR - QTCREATORDIR="${CMAKE_SOURCE_DIR}" + QTCREATORDIR="${PROJECT_SOURCE_DIR}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" SOURCES tst_check.cpp ) diff --git a/tests/auto/qml/codemodel/dependencies/CMakeLists.txt b/tests/auto/qml/codemodel/dependencies/CMakeLists.txt index 544e771873a..c602d7b60a5 100644 --- a/tests/auto/qml/codemodel/dependencies/CMakeLists.txt +++ b/tests/auto/qml/codemodel/dependencies/CMakeLists.txt @@ -1,9 +1,9 @@ add_qtc_test(tst_qml_dependencies DEPENDS qmljs QmlJSTools ExtensionSystem Utils - INCLUDES "${CMAKE_SOURCE_DIR}/src/plugins" + INCLUDES "${PROJECT_SOURCE_DIR}/src/plugins" DEFINES QT_CREATOR - QTCREATORDIR="${CMAKE_SOURCE_DIR}" + QTCREATORDIR="${PROJECT_SOURCE_DIR}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" SOURCES tst_dependencies.cpp ) diff --git a/tests/auto/qml/codemodel/ecmascript7/CMakeLists.txt b/tests/auto/qml/codemodel/ecmascript7/CMakeLists.txt index 62a0ba588de..c6ec1323073 100644 --- a/tests/auto/qml/codemodel/ecmascript7/CMakeLists.txt +++ b/tests/auto/qml/codemodel/ecmascript7/CMakeLists.txt @@ -1,9 +1,9 @@ add_qtc_test(tst_qml_ecmascript7 DEPENDS qmljs QmlJSTools ExtensionSystem Utils - INCLUDES "${CMAKE_SOURCE_DIR}/src/plugins" + INCLUDES "${PROJECT_SOURCE_DIR}/src/plugins" DEFINES QT_CREATOR - QTCREATORDIR="${CMAKE_SOURCE_DIR}" + QTCREATORDIR="${PROJECT_SOURCE_DIR}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" SOURCES tst_ecmascript7.cpp ) diff --git a/tests/auto/qml/codemodel/importscheck/CMakeLists.txt b/tests/auto/qml/codemodel/importscheck/CMakeLists.txt index 5f994a58ee1..6da32f57035 100644 --- a/tests/auto/qml/codemodel/importscheck/CMakeLists.txt +++ b/tests/auto/qml/codemodel/importscheck/CMakeLists.txt @@ -1,9 +1,9 @@ add_qtc_test(tst_qml_importscheck DEPENDS qmljs QmlJSTools Utils CPlusPlus - INCLUDES "${CMAKE_SOURCE_DIR}/src/plugins" + INCLUDES "${PROJECT_SOURCE_DIR}/src/plugins" DEFINES QT_CREATOR - QTCREATORDIR="${CMAKE_SOURCE_DIR}" + QTCREATORDIR="${PROJECT_SOURCE_DIR}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" SOURCES tst_importscheck.cpp ) diff --git a/tests/auto/qml/persistenttrie/CMakeLists.txt b/tests/auto/qml/persistenttrie/CMakeLists.txt index 2ab22d09195..3053ea8487b 100644 --- a/tests/auto/qml/persistenttrie/CMakeLists.txt +++ b/tests/auto/qml/persistenttrie/CMakeLists.txt @@ -2,7 +2,7 @@ add_qtc_test(tst_qml_testtrie DEPENDS qmljs DEFINES QT_CREATOR - QTCREATORDIR="${CMAKE_SOURCE_DIR}" + QTCREATORDIR="${PROJECT_SOURCE_DIR}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" SOURCES tst_testtrie.cpp ) diff --git a/tests/auto/qml/qmldesigner/coretests/CMakeLists.txt b/tests/auto/qml/qmldesigner/coretests/CMakeLists.txt index 3e83f280afd..87842321db6 100644 --- a/tests/auto/qml/qmldesigner/coretests/CMakeLists.txt +++ b/tests/auto/qml/qmldesigner/coretests/CMakeLists.txt @@ -4,13 +4,13 @@ return() add_qtc_test(tst_qml_testcore DEPENDS qmljs Utils QmlEditorWidgets CPlusPlus Core QmlJSEditor INCLUDES - "${CMAKE_SOURCE_DIR}/src/plugins/qmldesigner/designercore/include" - "${CMAKE_SOURCE_DIR}/src/plugins/qmldesigner/designercore" - "${CMAKE_SOURCE_DIR}/share/qtcreator/qml/qmlpuppet/interfaces" - "${CMAKE_SOURCE_DIR}/share/qtcreator/qml/qmlpuppet/types" + "${PROJECT_SOURCE_DIR}/src/plugins/qmldesigner/designercore/include" + "${PROJECT_SOURCE_DIR}/src/plugins/qmldesigner/designercore" + "${PROJECT_SOURCE_DIR}/share/qtcreator/qml/qmlpuppet/interfaces" + "${PROJECT_SOURCE_DIR}/share/qtcreator/qml/qmlpuppet/types" DEFINES QT_CREATOR - QTCREATORDIR="${CMAKE_SOURCE_DIR}" + QTCREATORDIR="${PROJECT_SOURCE_DIR}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" SOURCES ../data/testfiles.qrc diff --git a/tests/auto/qml/qmleditor/qmlcodeformatter/CMakeLists.txt b/tests/auto/qml/qmleditor/qmlcodeformatter/CMakeLists.txt index d8daee0578f..75506b8b276 100644 --- a/tests/auto/qml/qmleditor/qmlcodeformatter/CMakeLists.txt +++ b/tests/auto/qml/qmleditor/qmlcodeformatter/CMakeLists.txt @@ -2,7 +2,7 @@ add_qtc_test(tst_qml_qmlcodeformatter DEPENDS qmljs QmlJSTools TextEditor DEFINES QT_CREATOR - QTCREATORDIR="${CMAKE_SOURCE_DIR}" + QTCREATORDIR="${PROJECT_SOURCE_DIR}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" SOURCES tst_qmlcodeformatter.cpp ) diff --git a/tests/auto/qml/qmljssimplereader/CMakeLists.txt b/tests/auto/qml/qmljssimplereader/CMakeLists.txt index 4742047d7b2..e4f7ce90515 100644 --- a/tests/auto/qml/qmljssimplereader/CMakeLists.txt +++ b/tests/auto/qml/qmljssimplereader/CMakeLists.txt @@ -2,7 +2,7 @@ add_qtc_test(tst_qml_qmljssimplereader DEPENDS qmljs DEFINES QT_CREATOR - QTCREATORDIR="${CMAKE_SOURCE_DIR}" + QTCREATORDIR="${PROJECT_SOURCE_DIR}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" SOURCES tst_qmljssimplereader.cpp ) diff --git a/tests/auto/qml/qmlprojectmanager/fileformat/CMakeLists.txt b/tests/auto/qml/qmlprojectmanager/fileformat/CMakeLists.txt index 5d7f7c79bf8..71de6011898 100644 --- a/tests/auto/qml/qmlprojectmanager/fileformat/CMakeLists.txt +++ b/tests/auto/qml/qmlprojectmanager/fileformat/CMakeLists.txt @@ -1,13 +1,13 @@ get_target_property(QmlProjectManagerSources QmlProjectManager SOURCES) foreach(source IN LISTS QmlProjectManagerSources) if (source MATCHES "fileformat") - list(APPEND fileformat_sources "${CMAKE_SOURCE_DIR}/src/plugins/qmlprojectmanager/${source}") + list(APPEND fileformat_sources "${PROJECT_SOURCE_DIR}/src/plugins/qmlprojectmanager/${source}") endif() endforeach() add_qtc_test(tst_qml_fileformat DEPENDS qmljs Utils - INCLUDES "${CMAKE_SOURCE_DIR}/src/plugins/qmlprojectmanager/fileformat" + INCLUDES "${PROJECT_SOURCE_DIR}/src/plugins/qmlprojectmanager/fileformat" DEFINES QT_CREATOR SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" diff --git a/tests/auto/qml/qrcparser/CMakeLists.txt b/tests/auto/qml/qrcparser/CMakeLists.txt index bcecb807e4c..3bb82971d5e 100644 --- a/tests/auto/qml/qrcparser/CMakeLists.txt +++ b/tests/auto/qml/qrcparser/CMakeLists.txt @@ -2,7 +2,7 @@ add_qtc_test(tst_qml_qrcparser DEPENDS qmljs Utils DEFINES QT_CREATOR - QTCREATORDIR="${CMAKE_SOURCE_DIR}" + QTCREATORDIR="${PROJECT_SOURCE_DIR}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" SOURCES tst_qrcparser.cpp ) diff --git a/tests/auto/qml/reformatter/CMakeLists.txt b/tests/auto/qml/reformatter/CMakeLists.txt index a9119ccd934..de63ba3e0c4 100644 --- a/tests/auto/qml/reformatter/CMakeLists.txt +++ b/tests/auto/qml/reformatter/CMakeLists.txt @@ -2,7 +2,7 @@ add_qtc_test(tst_qml_reformatter DEPENDS qmljs DEFINES QT_CREATOR - QTCREATORDIR="${CMAKE_SOURCE_DIR}" + QTCREATORDIR="${PROJECT_SOURCE_DIR}" TESTSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}" SOURCES tst_reformatter.cpp ) diff --git a/tests/auto/toolchaincache/CMakeLists.txt b/tests/auto/toolchaincache/CMakeLists.txt index 5a2115f09b5..3a0637c9fdd 100644 --- a/tests/auto/toolchaincache/CMakeLists.txt +++ b/tests/auto/toolchaincache/CMakeLists.txt @@ -1,5 +1,5 @@ add_qtc_test(tst_toolchaincache DEPENDS ProjectExplorer Qt5::Gui - INCLUDES "${CMAKE_SOURCE_DIR}/src/libs" + INCLUDES "${PROJECT_SOURCE_DIR}/src/libs" SOURCES tst_toolchaincache.cpp ) diff --git a/tests/unit/unittest/CMakeLists.txt b/tests/unit/unittest/CMakeLists.txt index d0895c534f2..2dbb0411cf2 100644 --- a/tests/unit/unittest/CMakeLists.txt +++ b/tests/unit/unittest/CMakeLists.txt @@ -22,7 +22,7 @@ add_qtc_test(unittest GTEST QT_USE_FAST_OPERATOR_PLUS QT_USE_FAST_CONCATENATION UNIT_TESTS DONT_CHECK_MESSAGE_COUNTER - QTC_RESOURCE_DIR="${CMAKE_SOURCE_DIR}/share/qtcreator" + QTC_RESOURCE_DIR="${PROJECT_SOURCE_DIR}/share/qtcreator" TESTDATA_DIR="${CMAKE_CURRENT_BINARY_DIR}/data" ECHOSERVER="$/echo" CPPTOOLS_JSON="${CMAKE_CURRENT_BINARY_DIR}/CppTools.json" @@ -171,7 +171,7 @@ add_custom_command(TARGET unittest POST_BUILD ) # create fake CppTools.json for the mime type definitions -file(READ "${CMAKE_SOURCE_DIR}/src/plugins/cpptools/CppTools.json.in" plugin_json_in) +file(READ "${PROJECT_SOURCE_DIR}/src/plugins/cpptools/CppTools.json.in" plugin_json_in) string(REPLACE "\\\"" "\"" plugin_json_in ${plugin_json_in}) string(REPLACE "\\'" "'" plugin_json_in ${plugin_json_in}) string(REPLACE "$$QTCREATOR_VERSION" "${IDE_VERSION}" plugin_json_in ${plugin_json_in}) From 2e556c96b6c867232ee844495f38d1ee267e43fd Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 24 Jul 2019 16:23:50 +0300 Subject: [PATCH 4/4] QmlProfiler: avoid using Q_FOREACH over QVarLengthArray The squeeze() function is called by clients for QVLA's, which means it's copying 1-2KiB of data (depending on sizeof(value_type)) just to iterate over a small part of it. Use a C++11 ranged for loop. Change-Id: I2c33ae0c5a3d9d941cd9e385fc6bbb4fb0fa3c2c Reviewed-by: hjk --- src/plugins/qmlprofiler/qmlevent.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmlprofiler/qmlevent.h b/src/plugins/qmlprofiler/qmlevent.h index dc1b85116dd..344ef1a7cef 100644 --- a/src/plugins/qmlprofiler/qmlevent.h +++ b/src/plugins/qmlprofiler/qmlevent.h @@ -251,7 +251,7 @@ private: squeeze(const Container &numbers) { using Small = typename QIntegerForSize::Signed; - foreach (Number item, numbers) { + for (Number item : numbers) { if (!squeezable(item)) return false; }