File indexing completed on 2024-04-28 04:37:47

0001 /*
0002     SPDX-FileCopyrightText: 2017 Aleix Pol Gonzalez <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #include "androidruntime.h"
0008 #include "androidpreferencessettings.h"
0009 #include "debug_android.h"
0010 
0011 #include <KProcess>
0012 #include <QProcess>
0013 #include <QUrl>
0014 
0015 using namespace KDevelop;
0016 
0017 AndroidPreferencesSettings* AndroidRuntime::s_settings = nullptr;
0018 
0019 AndroidRuntime::AndroidRuntime()
0020     : KDevelop::IRuntime()
0021 {
0022 }
0023 
0024 AndroidRuntime::~AndroidRuntime()
0025 {
0026 }
0027 
0028 void AndroidRuntime::setEnabled(bool /*enable*/)
0029 {
0030 }
0031 
0032 static void setEnvironmentVariables(QProcess* process)
0033 {
0034     auto env = process->processEnvironment();
0035     env.insert(QStringLiteral("ANDROID_NDK"),      QUrl(AndroidRuntime::s_settings->ndk()).toLocalFile());
0036     env.insert(QStringLiteral("ANDROID_SDK_ROOT"), QUrl(AndroidRuntime::s_settings->sdk()).toLocalFile());
0037     process->setProcessEnvironment(env);
0038 }
0039 
0040 //integrates with ECM
0041 static QStringList args()
0042 {
0043     return {
0044         QLatin1String("-DCMAKE_TOOLCHAIN_FILE=") + QUrl(AndroidRuntime::s_settings->cmakeToolchain()).toLocalFile(),
0045         QLatin1String("-DANDROID_ABI=") + AndroidRuntime::s_settings->abi(),
0046         QLatin1String("-DANDROID_NDK=") + QUrl(AndroidRuntime::s_settings->ndk()).toLocalFile(),
0047         QLatin1String("-DANDROID_TOOLCHAIN=") + AndroidRuntime::s_settings->toolchain(),
0048         QLatin1String("-DANDROID_API_LEVEL=") + AndroidRuntime::s_settings->api(),
0049         QLatin1String("-DANDROID_ARCHITECTURE=") + AndroidRuntime::s_settings->arch(),
0050         QLatin1String("-DANDROID_SDK_BUILD_TOOLS_REVISION=") + AndroidRuntime::s_settings->buildtools()
0051     };
0052 }
0053 
0054 void AndroidRuntime::startProcess(QProcess* process) const
0055 {
0056     if (process->program().endsWith(QLatin1String("cmake"))) {
0057         process->setArguments(process->arguments() << args());
0058         setEnvironmentVariables(process);
0059     }
0060 
0061     qCDebug(ANDROID) << "starting qprocess" << process->program() << process->arguments();
0062     process->start();
0063 }
0064 
0065 void AndroidRuntime::startProcess(KProcess* process) const
0066 {
0067     if (process->program().first().endsWith(QLatin1String("cmake"))) {
0068         process->setProgram(process->program() << args());
0069         setEnvironmentVariables(process);
0070     }
0071 
0072     qCDebug(ANDROID) << "starting kprocess" << process->program().join(QLatin1Char(' '));
0073     process->start();
0074 }
0075 
0076 QByteArray AndroidRuntime::getenv(const QByteArray &varname) const
0077 {
0078     return qgetenv(varname.constData());
0079 }
0080 
0081 QString AndroidRuntime::findExecutable(const QString& executableName) const
0082 {
0083     QStringList rtPaths;
0084 
0085     auto envPaths = getenv(QByteArrayLiteral("PATH")).split(':');
0086     std::transform(envPaths.begin(), envPaths.end(), std::back_inserter(rtPaths),
0087                     [this](QByteArray p) {
0088                         return pathInHost(Path(QString::fromLocal8Bit(p))).toLocalFile();
0089                     });
0090 
0091     return QStandardPaths::findExecutable(executableName, rtPaths);
0092 }
0093 
0094 #include "moc_androidruntime.cpp"