<div dir="ltr"><div><div><div><div><div><div>Hi all,<br><br></div>We just noticed that the setupRunEnviroment scripts are not executed when starting a product from within QtCreator. The reason seems to be that the Creator needs to attach to the process and cannot use the RunEnvironment::runTarget() method for that task. Even getting the final environment from Qbs is not implemented right now, as can be seen from the TODO comment in QbsRunConfiguration::addToBaseEnvironment().<br>
<br></div>Since having the setupRunEnvironment feature is important for us, I decided to try implementing it. However I noticed that currently there is no way to get the final environment via the Qbs API. Maybe I overlooked something here? Anyway, I added these two methods to the RunEnvironment class:<br>
<br>class QBS_EXPORT RunEnvironment<br>{ ...<br>    const QProcessEnvironment runEnvironment() const;<br>    const QProcessEnvironment buildEnvironment() const;<br><br></div><div>The implementations call setupXxxEnvironment of the resolvedProduct and return the created environment. Note that the second method is not strictly needed, but I thought it would be nice to have it also. If there is a better way to get the environments, please correct me ;-)<br>
</div><br></div>Next, I tried to implement the missing functionality like this.<br><br>void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env) const<br>{<br>    QbsProject *project = static_cast<QbsProject *>(target()->project());<br>
    if (project) {<br>        const qbs::ProductData product = findProduct(project->qbsProjectData(), m_qbsProduct);<br>        if (product.isValid()) {<br>            qbs::RunEnvironment qbsRunEnv = project->qbsProject().getRunEnvironment(product, env.toProcessEnvironment(), QbsManager::settings());<br>
            QProcessEnvironment procEnv = qbsRunEnv.runEnvironment();<br>            if (!procEnv.isEmpty()) {<br>                env = Utils::Environment();<br>                foreach (const QString &key, procEnv.keys())<br>
                    env.set(key, procEnv.value(key));<br>                return;<br>            }<br>        }<br>    }<br><br>    QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(target()->kit());<br>
    if (qtVersion)<br>        env.prependOrSetLibrarySearchPath(qtVersion->qmakeProperty("QT_INSTALL_LIBS"));<br>}<br><br></div>This works fine for us :-) However I'm not sure whether I missed something important. Also the need for enhancing the Qbs API looks a bit suspect to me. Maybe there is a much better way to do it? Please could one of the experts comment on this?<br>
<br></div>Thanks,<br>Thomas<br><br></div>