[Qt-creator] Update QtCreator kits thru plugin

Eike Ziller Eike.Ziller at qt.io
Tue Jan 2 09:50:00 CET 2018



> On 2. Jan 2018, at 03:40, Vidhya Arun <svidhyapria at gmail.com> wrote:
> 
> Yes Antonio , I did create in initialize methods only. I have created the kit, registered the toolchain and set the device type Id and left out the rest of steps to initially check if kit is loaded with some dummy data.
> I find the code getting executed but also I find below soft assert statements during execution. Not sure if these cause failure on listing the kits after execution
> 
> Starting /opt/qtcreator-4.4.1/bin/qtcreator...
> QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
> libGL error: pci id for fd 6: 80ee:beef, driver (null)
> libGL error: core dri or dri2 extension not found
> libGL error: failed to load driver: vboxvideo
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "isLanguageSupported(tc->language())" in file /work/build/qt-creator/src/plugins/projectexplorer/toolchainmanager.cpp, line 408
> SOFT ASSERT: "isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitmanager.cpp, line 440
> SOFT ASSERT: "DeviceManager::instance()->isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 727
> SOFT ASSERT: "QtVersionManager::isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtkitinformation.cpp, line 76
> SOFT ASSERT: "isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtversionmanager.cpp, line 529
> SOFT ASSERT: "isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtversionmanager.cpp, line 529
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtversionmanager.cpp, line 529
> SOFT ASSERT: "isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtversionmanager.cpp, line 529
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "DeviceManager::instance()->isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 727
> SOFT ASSERT: "QtVersionManager::isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtkitinformation.cpp, line 76
> SOFT ASSERT: "isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtversionmanager.cpp, line 529
> SOFT ASSERT: "isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtversionmanager.cpp, line 529
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtversionmanager.cpp, line 529
> SOFT ASSERT: "isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtversionmanager.cpp, line 529
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "DeviceManager::instance()->isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 727
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "isLoaded()" in file /work/build/qt-creator/src/plugins/qtsupport/qtversionmanager.cpp, line 529
> No build configuration factory found for target id 'MyKit'.
> SOFT ASSERT: "ToolChainManager::isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 385
> SOFT ASSERT: "DeviceManager::instance()->isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 727
> SOFT ASSERT: "DeviceManager::instance()->isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 727
> SOFT ASSERT: "DeviceManager::instance()->isLoaded()" in file /work/build/qt-creator/src/plugins/projectexplorer/kitinformation.cpp, line 727
> No tool chain set up in kit "target" for "C".
> No tool chain set up in kit "target" for "C”.

These asserts mean that you are trying to do things with tool chains and kits too early. The kits are only restored in the ProjectExplorer plugin’s delayedInitialize() (http://doc-snapshots.qt.io/qtcreator-extending/plugin-lifecycle.html), so if you can not work with kits/toolchains in your initialize().
A sensible way for you to delay the actions that you take is probably to connect to ProjectExplorer::KitManager::kitsLoaded() and do it there.

Br, Eike

> Regards
> Vidhya
> 
> 
> 
> On Tue, 2 Jan 2018 at 1:49 AM, Antonio Di Monaco <tony at becrux.com> wrote:
> Hi Arun,
> 
> my kits are created when the project is loaded. My code starts in Project::fromMap method.
> 
> In case you'd like to create your kits at plugin startup, then you need a different method, i.e. YourPluginClass::extensionsInitialized or YourPluginClass::initialize (I assume the first one is better).
> 
> Of course, you cannot create any target, just kits, toolchains and tools.
> 
> Thanks,
> A. 
> 
> 
> From: "Vidhya Arun" svidhyapria at gmail.com
> To: "Antonio Di Monaco" tony at becrux.com
> Cc: qt-creator at qt-project.org
> Date: Mon, 1 Jan 2018 22:51:15 +0530
> Subject: Re: [Qt-creator] Update QtCreator kits thru plugin
> 
> Hi Antonio
> 
> Tried your steps and built the plugin. Is the kit expected to be listed automatically under Tools/Options/Build &Run/Kits once the plugin is built and loaded successfully in Qt creator ?
> Unfortunately I dont see my kit listed there when i execute the plugin ?
> 
> Meanwhile are all the steps mandatory to be followed. Initially I just wanted to check if the kit gets created with the registered kit name and toolchain, sysroot details added in plugin.
> Thats not happening yet. Any hints on what could have gone wrong here ?
> 
> -Vidhya
> 
> 
> On Thu, Dec 28, 2017 at 10:21 PM, Antonio Di Monaco <tony at becrux.com> wrote:
> Hi Arun,
> 
> unfortunately I cannot share the code, but I can provide you some basic steps in order to do that. Please note that what I'm posting is just the result of my understanding of the Qt Creator code, so I could be not correct 100%. I was not able to find any kind of documentation, so YMMV.
> 
> Basically, you need to create a toolchain first. You can subclass from ProjectExplorer::GccToolchain, in order to create a GCC/Clang toolchain, or ProjectExplorer::Internal::AbstractMsvcToolchain, for MSVC compiler (yeah, that should not be allowed, but there are no MSVC base classes that are exported through the PROJECTEXPLORER_EXPORT macro. Anyway, it works, you just need some code from MsvcToolchain class).
> 
> Once you have it, create a Kit in your Project class. You can do it in the fromMap method, for example (called when your project is loaded):
> 
> ProjectExplorer::Kit *kit = new ProjectExplorer::Kit(YOUR_ID);
> kit->setUnexpandedDisplayName(YOUR_DISPLAY_NAME);
> kit->setAutoDetected(false);
> 
> You can add your personal values too, using:
> 
> kit->setValueSilently(KEY, VALUE);
> 
> that you can access later calling kit->value(KEY). 
> 
> Then, you can add all the required information:
> 
> - sysroot:
> 
> ProjectExplorer::SysRootKitInformation::setSysRoot(kit, PATH_OF_THE_SYSROOT);
> 
>  
> - toolchain:
> 
> ProjectExplorer::ToolChain *tc = new Your_ToolChain_Class(...);
> ProjectExplorer::ToolChainManager::registerToolChain(tc);
> ProjectExplorer::ToolChainKitInformation::setToolChain(kit, tc);
> 
> you can add one for C, and one for C++, according to the LanguageId that you specify in Your_ToolChain_Class.
> 
>  
> - If you have a CMake configuration for your kit, you can add it too:
> 
> /* vvvvv do this group once vvvvv */ 
> CMakeProjectManager::CMakeTool *cmakeTool = new CMakeProjectManager::CMakeTool(CMakeProjectManager::CMakeTool::ManualDetection, THE_ID_OF_YOUR_CMAKE_COMMAND);
> cmakeTool->setAutorun(false);
> cmakeTool->setCMakeExecutable("....");
> cmakeTool->setDisplayName("....");
> 
> CMakeProjectManager::CMakeToolManager::registerCMakeTool(cmakeTool);
> /* ^^^^^ do this group once ^^^^^^ */   
>  
> CMakeProjectManager::CMakeKitInformation::setCMakeTool(kit, THE_ID_OF_YOUR_CMAKE_COMMAND);
> CMakeProjectManager::CMakeGeneratorKitInformation::setGenerator(kit, "...");
> CMakeProjectManager::CMakeGeneratorKitInformation::setExtraGenerator(kit, "....");
> CMakeProjectManager::CMakeConfigurationKitInformation::setConfiguration(kit, CMakeProjectManager::CMakeConfig(...));
> 
>  
> - Qt can be set up in a similar way. Unfortunately, I don't know how, cause I'm not using Qt libraries for my kit, so I clear out the information in the kit:
> 
>  QmakeProjectManager::QmakeKitInformation::setMkspec(kit, Utils::FileName());
>  QtSupport::QtKitInformation::setQtVersionId(kit, 0);
> 
> Maybe you can have a look at those function calls, and specify different parameters.
> 
>  
> - Debugger:
> 
> Debugger::DebuggerItem debugger;
> 
> debugger.setCommand("...");
> debugger.setEngineType(Debugger::GdbEngineType or Debugger::CdbEngineType);
> 
> debugger.setUnexpandedDisplayName("...");
> debugger.setAutoDetected(true);
> debugger.setAbi(tc->targetAbi());
> debugger.setWorkingDirectory("...");
> debugger.reinitializeFromFile();
> 
> Debugger::DebuggerKitInformation::setDebugger(kit, Debugger::DebuggerItemManager::registerDebugger(debugger));
> 
>  
> - Device type (Desktop in my case):
> 
> ProjectExplorer::DeviceTypeKitInformation::setDeviceTypeId(kit, ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE);
> 
> 
> When you're done, you register the kit:
> 
> ProjectExplorer::KitManager::registerKit(kit);
> 
> 
> In order to consume it, you need a target:
> 
> ProjectExplorer::Target *tgt = createTarget(kit);
> tgt->setDefaultDisplayName("...");
> tgt->setDisplayName("...");
> addTarget(tgt);
> 
> That's it.
> 
>  
>  
> Toolchains can be unregistered using:
>  
> ProjectExplorer::ToolChainKitInformation::clearToolChain(kit, tc->language());
> ProjectExplorer::ToolChainManager::deregisterToolChain(tc);
> 
> So the debugger:
> 
> const Debugger::DebuggerItem *dbgItem = Debugger::DebuggerKitInformation::debugger(kit);
> 
> if (dbgItem)
>   Debugger::DebuggerItemManager::deregisterDebugger(dbgItem->id());
> 
> the kit:
> 
> ProjectExplorer::KitManager::deregisterKit(kit);
> 
> and your CMake tool:
> 
> CMakeProjectManager::CMakeToolManager::deregisterCMakeTool(THE_ID_OF_YOUR_CMAKE_COMMAND);
> 
>  
> 
> Those are the basics. If you need more help, please ask for a specific topic, cause it's very wide to be fully explained.
> 
> Hope that this will help you.
> 
> BR,
> Antonio 
>  
>  
> From: "Vidhya Arun" svidhyapria at gmail.com
> To: "Antonio Di Monaco" tony at becrux.com
> Cc: qt-creator at qt-project.org
> Date: Wed, 27 Dec 2017 16:45:01 +0000
> Subject: [Qt-creator] Update QtCreator kits thru plugin
> 
> Hi
> 
> I am trying to create my plugin to create the kit to update sysroot, target connection details,etc.
> 
> But I couldn't locate how to update sysroot and other details of Qt creator thru plugin.  Any suggestions would be appreciated.
> 
> 
> 
> _______________________________________________
> Qt-creator mailing list
> Qt-creator at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/qt-creator



More information about the Qt-creator mailing list