[QBS] Setting up the run environment in QtCreator

Thomas Epting thomas.epting.stryker at gmail.com
Tue Jun 3 08:54:51 CEST 2014


Hi all,

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().

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:

class QBS_EXPORT RunEnvironment
{ ...
    const QProcessEnvironment runEnvironment() const;
    const QProcessEnvironment buildEnvironment() const;

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 ;-)

Next, I tried to implement the missing functionality like this.

void QbsRunConfiguration::addToBaseEnvironment(Utils::Environment &env)
const
{
    QbsProject *project = static_cast<QbsProject *>(target()->project());
    if (project) {
        const qbs::ProductData product =
findProduct(project->qbsProjectData(), m_qbsProduct);
        if (product.isValid()) {
            qbs::RunEnvironment qbsRunEnv =
project->qbsProject().getRunEnvironment(product,
env.toProcessEnvironment(), QbsManager::settings());
            QProcessEnvironment procEnv = qbsRunEnv.runEnvironment();
            if (!procEnv.isEmpty()) {
                env = Utils::Environment();
                foreach (const QString &key, procEnv.keys())
                    env.set(key, procEnv.value(key));
                return;
            }
        }
    }

    QtSupport::BaseQtVersion *qtVersion =
QtSupport::QtKitInformation::qtVersion(target()->kit());
    if (qtVersion)

env.prependOrSetLibrarySearchPath(qtVersion->qmakeProperty("QT_INSTALL_LIBS"));
}

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?

Thanks,
Thomas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/qbs/attachments/20140603/f2813d62/attachment.html>


More information about the Qbs mailing list