qmakeandroidsupport.cpp 6.15 KB
Newer Older
1 2
/**************************************************************************
**
Eike Ziller's avatar
Eike Ziller committed
3 4
** Copyright (C) 2015 BogDan Vatra <bog_dan_ro@yahoo.com>
** Contact: http://www.qt.io/licensing
5 6 7 8 9 10 11
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
Eike Ziller's avatar
Eike Ziller committed
12 13
** a written agreement between you and The Qt Company.  For licensing terms and
** conditions see http://www.qt.io/terms-conditions.  For further information
Eike Ziller's avatar
Eike Ziller committed
14
** use the contact form at http://www.qt.io/contact-us.
15 16 17
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
Eike Ziller's avatar
Eike Ziller committed
18 19 20 21 22 23
** General Public License version 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file.  Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24
**
Eike Ziller's avatar
Eike Ziller committed
25 26
** In addition, as a special exception, The Qt Company gives you certain additional
** rights.  These rights are described in The Qt Company LGPL Exception
27 28 29 30 31
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/

#include "androidpackageinstallationstep.h"
32
#include "qmakeandroidbuildapkstep.h"
33
#include "qmakeandroidsupport.h"
34 35
#include "androidqmakebuildconfigurationfactory.h"
#include "qmakeandroidrunconfiguration.h"
36 37

#include <android/androidconstants.h>
38
#include <android/androidglobal.h>
39 40
#include <projectexplorer/target.h>
#include <qtsupport/qtkitinformation.h>
41
#include <qmakeprojectmanager/qmakeproject.h>
42

43 44 45
using namespace QmakeProjectManager;

namespace QmakeAndroidSupport {
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
namespace Internal {

bool QmakeAndroidSupport::canHandle(const ProjectExplorer::Target *target) const
{
    return qobject_cast<QmakeProject*>(target->project());
}

QStringList QmakeAndroidSupport::soLibSearchPath(const ProjectExplorer::Target *target) const
{
    QStringList res;
    QmakeProject *project = qobject_cast<QmakeProject*>(target->project());
    Q_ASSERT(project);
    if (!project)
        return res;

    foreach (QmakeProFileNode *node, project->allProFiles()) {
62 63 64 65 66 67 68 69
        TargetInformation info = node->targetInformation();
        res << info.buildDir;
        QString destDir = info.destDir;
        if (!destDir.isEmpty()) {
            if (QFileInfo(destDir).isRelative())
                destDir = QDir::cleanPath(info.buildDir + QLatin1Char('/') + destDir);
            res << destDir;
        }
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
    }

    return res;
}

QStringList QmakeAndroidSupport::projectTargetApplications(const ProjectExplorer::Target *target) const
{
    QStringList apps;
    QmakeProject *qmakeProject = qobject_cast<QmakeProject *>(target->project());
    if (!qmakeProject)
        return apps;
    foreach (QmakeProFileNode *proFile, qmakeProject->applicationProFiles()) {
        if (proFile->projectType() == ApplicationTemplate) {
            if (proFile->targetInformation().target.startsWith(QLatin1String("lib"))
                    && proFile->targetInformation().target.endsWith(QLatin1String(".so")))
                apps << proFile->targetInformation().target.mid(3, proFile->targetInformation().target.lastIndexOf(QLatin1Char('.')) - 3);
            else
                apps << proFile->targetInformation().target;
        }
    }
    apps.sort();
    return apps;
}

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
Utils::FileName QmakeAndroidSupport::androiddeployqtPath(ProjectExplorer::Target *target) const
{
    QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target->kit());
    if (!version)
        return Utils::FileName();

    QString command = version->qmakeProperty("QT_HOST_BINS");
    if (!command.endsWith(QLatin1Char('/')))
        command += QLatin1Char('/');
    command += Utils::HostOsInfo::withExecutableSuffix(QLatin1String("androiddeployqt"));
    return Utils::FileName::fromString(command);
}

Utils::FileName QmakeAndroidSupport::androiddeployJsonPath(ProjectExplorer::Target *target) const
{
109
    const auto *pro = static_cast<QmakeProject *>(target->project());
110 111 112 113 114 115
    QmakeAndroidBuildApkStep *buildApkStep
        = Android::AndroidGlobal::buildStep<QmakeAndroidBuildApkStep>(target->activeBuildConfiguration());

    if (!buildApkStep) // should never happen
        return Utils::FileName();

116
    const QmakeProFileNode *node =
117
            pro->rootProjectNode()->findProFileFor(buildApkStep->proFilePathForInputFile());
118 119 120
    if (!node) // should never happen
        return Utils::FileName();

121
    QString inputFile = node->singleVariableValue(AndroidDeploySettingsFile);
122 123 124 125 126 127
    if (inputFile.isEmpty()) // should never happen
        return Utils::FileName();

    return Utils::FileName::fromString(inputFile);
}

128
void QmakeAndroidSupport::manifestSaved(const ProjectExplorer::Target *target)
129
{
130
    ProjectExplorer::BuildConfiguration *bc = target->activeBuildConfiguration();
131 132
    if (auto qbc = qobject_cast<AndroidQmakeBuildConfiguration *>(bc))
        qbc->manifestSaved();
133 134 135 136 137 138
}

Utils::FileName QmakeAndroidSupport::manifestSourcePath(const ProjectExplorer::Target *target)
{
    ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration();
    if (auto qrc = qobject_cast<QmakeAndroidRunConfiguration *>(rc)) {
hjk's avatar
hjk committed
139
        Utils::FileName proFilePath = qrc->proFilePath();
140
        const auto project = static_cast<QmakeProjectManager::QmakeProject *>(target->project());
141
        const QmakeProFileNode *node = project->rootProjectNode()->findProFileFor(proFilePath);
142 143 144 145 146 147 148 149 150 151
        if (node) {
            QString packageSource = node->singleVariableValue(AndroidPackageSourceDir);
            if (!packageSource.isEmpty()) {
                Utils::FileName manifest = Utils::FileName::fromUserInput(packageSource + QLatin1String("/AndroidManifest.xml"));
                if (manifest.exists())
                    return manifest;
            }
        }
    }
    return Utils::FileName();
152 153 154
}

} // namespace Internal
155
} // namespace QmakeAndroidSupport