bool AndroidPackageInstallationStep::init() { ProjectExplorer::BuildConfiguration *bc = buildConfiguration(); QString dirPath = bc->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)).toString(); if (Utils::HostOsInfo::isWindowsHost()) if (bc->environment().searchInPath(QLatin1String("sh.exe")).isEmpty()) dirPath = QDir::toNativeSeparators(dirPath); ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(target()->kit()); ProjectExplorer::ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setWorkingDirectory(bc->buildDirectory().toString()); pp->setCommand(tc->makeCommand(bc->environment())); Utils::Environment env = bc->environment(); // Force output to english for the parsers. Do this here and not in the toolchain's // addToEnvironment() to not screw up the users run environment. env.set(QLatin1String("LC_ALL"), QLatin1String("C")); pp->setEnvironment(env); pp->setArguments(QString::fromLatin1("INSTALL_ROOT=\"%1\" install").arg(dirPath)); pp->resolveAll(); setOutputParser(new ProjectExplorer::GnuMakeParser()); ProjectExplorer::IOutputParser *parser = target()->kit()->createOutputParser(); if (parser) appendOutputParser(parser); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); m_androidDirToClean = dirPath; return AbstractProcessStep::init(); }
void GenericMakeStepConfigWidget::updateDetails() { GenericBuildConfiguration *bc = m_makeStep->genericBuildConfiguration(); ProjectExplorer::ProcessParameters param; param.setMacroExpander(bc->macroExpander()); param.setWorkingDirectory(bc->buildDirectory()); param.setEnvironment(bc->environment()); param.setCommand(m_makeStep->makeCommand()); param.setArguments(m_makeStep->allArguments()); m_summaryText = param.summary(displayName()); emit updateSummary(); }
bool GenericMakeStep::init() { GenericBuildConfiguration *bc = genericBuildConfiguration(); setEnabled(true); ProjectExplorer::ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setWorkingDirectory(bc->buildDirectory()); pp->setEnvironment(bc->environment()); pp->setCommand(makeCommand()); pp->setArguments(allArguments()); setOutputParser(new ProjectExplorer::GnuMakeParser()); if (bc->genericTarget()->genericProject()->toolChain()) appendOutputParser(bc->genericTarget()->genericProject()->toolChain()->outputParser()); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); return AbstractProcessStep::init(); }
bool GenericMakeStep::init() { GenericBuildConfiguration *bc = genericBuildConfiguration(); ProjectExplorer::ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setWorkingDirectory(bc->buildDirectory()); pp->setEnvironment(bc->environment()); pp->setCommand(makeCommand()); pp->setArguments(allArguments()); // If we are cleaning, then make can fail with an error code, but that doesn't mean // we should stop the clean queue // That is mostly so that rebuild works on an already clean project setIgnoreReturnValue(m_clean); setOutputParser(new ProjectExplorer::GnuMakeParser()); if (bc->genericTarget()->genericProject()->toolChain()) appendOutputParser(bc->genericTarget()->genericProject()->toolChain()->outputParser()); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); return AbstractProcessStep::init(); }
bool MakeStep::init() { Qt4BuildConfiguration *bc = qt4BuildConfiguration(); m_tasks.clear(); if (!bc->toolChain()) { m_tasks.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, tr("Qt Creator needs a tool chain set up to build. Please configure a tool chain in Project mode."), QString(), -1, QLatin1String(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); } ProjectExplorer::ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); Utils::Environment environment = bc->environment(); pp->setEnvironment(environment); QString workingDirectory; if (bc->subNodeBuild()) workingDirectory = bc->subNodeBuild()->buildDir(); else workingDirectory = bc->buildDirectory(); pp->setWorkingDirectory(workingDirectory); QString makeCmd = bc->makeCommand(); if (!m_makeCmd.isEmpty()) makeCmd = m_makeCmd; pp->setCommand(makeCmd); // If we are cleaning, then make can fail with a error code, but that doesn't mean // we should stop the clean queue // That is mostly so that rebuild works on a already clean project setIgnoreReturnValue(m_clean); QString args; ProjectExplorer::ToolChain *toolchain = bc->toolChain(); if (bc->subNodeBuild()) { QString makefile = bc->subNodeBuild()->makefile(); if(!makefile.isEmpty()) { Utils::QtcProcess::addArg(&args, QLatin1String("-f")); Utils::QtcProcess::addArg(&args, makefile); m_makeFileToCheck = QDir(workingDirectory).filePath(makefile); } else { m_makeFileToCheck = QDir(workingDirectory).filePath("Makefile"); } } else { if (!bc->makefile().isEmpty()) { Utils::QtcProcess::addArg(&args, QLatin1String("-f")); Utils::QtcProcess::addArg(&args, bc->makefile()); m_makeFileToCheck = QDir(workingDirectory).filePath(bc->makefile()); } else { m_makeFileToCheck = QDir(workingDirectory).filePath("Makefile"); } } Utils::QtcProcess::addArgs(&args, m_userArgs); if (!isClean()) { if (!bc->defaultMakeTarget().isEmpty()) Utils::QtcProcess::addArg(&args, bc->defaultMakeTarget()); } // -w option enables "Enter"/"Leaving directory" messages, which we need for detecting the // absolute file path // FIXME doing this without the user having a way to override this is rather bad // so we only do it for unix and if the user didn't override the make command // but for now this is the least invasive change if (toolchain && toolchain->targetAbi().binaryFormat() != ProjectExplorer::Abi::PEFormat && m_makeCmd.isEmpty()) Utils::QtcProcess::addArg(&args, QLatin1String("-w")); setEnabled(true); pp->setArguments(args); ProjectExplorer::IOutputParser *parser = 0; if (bc->qtVersion()) parser = bc->qtVersion()->createOutputParser(); if (parser) parser->appendOutputParser(new QtSupport::QtParser); else parser = new QtSupport::QtParser; if (toolchain) parser->appendOutputParser(toolchain->outputParser()); parser->setWorkingDirectory(workingDirectory); setOutputParser(parser); return AbstractProcessStep::init(); }
bool AndroidDeployQtStep::init() { if (AndroidManager::checkForQt51Files(project()->projectDirectory())) emit addOutput(tr("Found old folder \"android\" in source directory. Qt 5.2 does not use that folder by default."), ErrorOutput); m_targetArch = AndroidManager::targetArch(target()); if (m_targetArch.isEmpty()) { emit addOutput(tr("No Android arch set by the .pro file."), ErrorOutput); return false; } m_deviceAPILevel = AndroidManager::minimumSDK(target()); AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(project(), m_deviceAPILevel, m_targetArch); if (info.serialNumber.isEmpty()) // aborted return false; if (info.type == AndroidDeviceInfo::Emulator) { m_avdName = info.serialNumber; m_serialNumber.clear(); m_deviceAPILevel = info.sdk; } else { m_avdName.clear(); m_serialNumber = info.serialNumber; } AndroidManager::setDeviceSerialNumber(target(), m_serialNumber); ProjectExplorer::BuildConfiguration *bc = target()->activeBuildConfiguration(); QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit()); if (!version) return false; m_uninstallPreviousPackageRun = m_uninstallPreviousPackage || m_uninstallPreviousPackageTemp; m_uninstallPreviousPackageTemp = false; if (m_uninstallPreviousPackageRun) { m_packageName = AndroidManager::packageName(target()); if (m_packageName.isEmpty()){ emit addOutput(tr("Cannot find the package name."), ErrorOutput); return false; } } ProjectExplorer::ProcessParameters *pp = processParameters(); m_useAndroiddeployqt = version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0); if (m_useAndroiddeployqt) { AndroidBuildApkStep *androidBuildApkStep = AndroidGlobal::buildStep<AndroidBuildApkStep>(target()->activeBuildConfiguration()); if (!androidBuildApkStep) { emit addOutput(tr("Cannot find the android build step."), ErrorOutput); return false; } Utils::FileName tmp = AndroidManager::androidQtSupport(target())->androiddeployqtPath(target()); if (tmp.isEmpty()) { emit addOutput(tr("Cannot find the androiddeployqt tool."), ErrorOutput); return false; } pp->setCommand(tmp.toString()); const QString output(bc->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)).toString()); pp->setWorkingDirectory(output); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--verbose")); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--output")); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, output); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--no-build")); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--input")); tmp = AndroidManager::androidQtSupport(target())->androiddeployJsonPath(target()); if (tmp.isEmpty()) { emit addOutput(tr("Cannot find the androiddeploy Json file."), ErrorOutput); return false; } Utils::QtcProcess::addArg(&m_androiddeployqtArgs, tmp.toString()); if (m_uninstallPreviousPackageRun) Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--install")); else Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--reinstall")); Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("--deployment")); switch (androidBuildApkStep->deployAction()) { case AndroidBuildApkStep::MinistroDeployment: Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("ministro")); break; case AndroidBuildApkStep::DebugDeployment: Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("debug")); break; case AndroidBuildApkStep::BundleLibrariesDeployment: Utils::QtcProcess::addArg(&m_androiddeployqtArgs, QLatin1String("bundled")); break; } } else { pp->setCommand(AndroidConfigurations::currentConfig().adbToolPath().toString()); m_apkPath = AndroidManager::androidQtSupport(target())->apkPath(target(), AndroidManager::signPackage(target()) ? AndroidQtSupport::ReleaseBuildSigned : AndroidQtSupport::DebugBuild).toString(); pp->setWorkingDirectory(bc->buildDirectory().toString()); } pp->setMacroExpander(bc->macroExpander()); Utils::Environment env = bc->environment(); pp->setEnvironment(env); m_buildDirectory = bc->buildDirectory().toString(); bool result = AbstractProcessStep::init(); if (!result) return false; if (AndroidConfigurations::currentConfig().findAvd(m_deviceAPILevel, m_targetArch).isEmpty()) AndroidConfigurations::currentConfig().startAVDAsync(m_avdName); return true; }
bool MakeStep::init() { Qt4BuildConfiguration *bc = qt4BuildConfiguration(); if (!bc) bc = qobject_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration()); m_tasks.clear(); if (!bc) { m_tasks.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, tr("Qt Creator needs a build configuration set up to build. Configure a tool chain in Project mode."), Utils::FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); return false; } ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile()); if (!tc) { m_tasks.append(ProjectExplorer::Task(ProjectExplorer::Task::Error, tr("Qt Creator needs a tool chain set up to build. Configure a tool chain the profile options."), Utils::FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); return false; } ProjectExplorer::ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); QString workingDirectory; if (bc->subNodeBuild()) workingDirectory = bc->subNodeBuild()->buildDir(); else workingDirectory = bc->buildDirectory(); pp->setWorkingDirectory(workingDirectory); QString makeCmd = tc->makeCommand(); if (!m_makeCmd.isEmpty()) makeCmd = m_makeCmd; pp->setCommand(makeCmd); // If we are cleaning, then make can fail with a error code, but that doesn't mean // we should stop the clean queue // That is mostly so that rebuild works on a already clean project setIgnoreReturnValue(m_clean); QString args; Qt4ProjectManager::Qt4ProFileNode *subNode = bc->subNodeBuild(); if (subNode) { QString makefile = subNode->makefile(); if (makefile.isEmpty()) makefile = QLatin1String("Makefile"); if (subNode->isDebugAndRelease()) { if (bc->buildType() == Qt4BuildConfiguration::Debug) makefile += QLatin1String(".Debug"); else makefile += QLatin1String(".Release"); } if (makefile != QLatin1String("Makefile")) { Utils::QtcProcess::addArg(&args, QLatin1String("-f")); Utils::QtcProcess::addArg(&args, makefile); } m_makeFileToCheck = QDir(workingDirectory).filePath(makefile); } else { if (!bc->makefile().isEmpty()) { Utils::QtcProcess::addArg(&args, QLatin1String("-f")); Utils::QtcProcess::addArg(&args, bc->makefile()); m_makeFileToCheck = QDir(workingDirectory).filePath(bc->makefile()); } else { m_makeFileToCheck = QDir(workingDirectory).filePath(QLatin1String("Makefile")); } } Utils::QtcProcess::addArgs(&args, m_userArgs); if (!isClean()) { if (!bc->defaultMakeTarget().isEmpty()) Utils::QtcProcess::addArg(&args, bc->defaultMakeTarget()); } if (bc->fileNodeBuild() && subNode) { QString objectsDir = subNode->objectsDirectory(); if (objectsDir.isEmpty()) { objectsDir = subNode->buildDir(bc); if (subNode->isDebugAndRelease()) { if (bc->buildType() == Qt4BuildConfiguration::Debug) objectsDir += QLatin1String("/debug"); else objectsDir += QLatin1String("/release"); } } QString relObjectsDir = QDir(pp->workingDirectory()).relativeFilePath(objectsDir); if (!relObjectsDir.isEmpty()) relObjectsDir += QLatin1Char('/'); QString objectFile = relObjectsDir + QFileInfo(bc->fileNodeBuild()->path()).baseName() + subNode->objectExtension(); Utils::QtcProcess::addArg(&args, objectFile); } Utils::Environment env = bc->environment(); // Force output to english for the parsers. Do this here and not in the toolchain's // addToEnvironment() to not screw up the users run environment. env.set(QLatin1String("LC_ALL"), QLatin1String("C")); // -w option enables "Enter"/"Leaving directory" messages, which we need for detecting the // absolute file path // doing this without the user having a way to override this is rather bad // so we only do it for unix and if the user didn't override the make command // but for now this is the least invasive change // We also prepend "L" to the MAKEFLAGS, so that nmake / jom are less verbose if (tc && m_makeCmd.isEmpty()) { if (tc->targetAbi().binaryFormat() != ProjectExplorer::Abi::PEFormat ) Utils::QtcProcess::addArg(&args, QLatin1String("-w")); if (tc->targetAbi().os() == ProjectExplorer::Abi::WindowsOS && tc->targetAbi().osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) { const QString makeFlags = QLatin1String("MAKEFLAGS"); env.set(makeFlags, QLatin1Char('L') + env.value(makeFlags)); } } pp->setEnvironment(env); pp->setArguments(args); ProjectExplorer::IOutputParser *parser = 0; QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile()); if (version) parser = version->createOutputParser(); if (parser) parser->appendOutputParser(new QtSupport::QtParser); else parser = new QtSupport::QtParser; if (tc) parser->appendOutputParser(tc->outputParser()); parser->setWorkingDirectory(workingDirectory); setOutputParser(parser); m_scriptTarget = (static_cast<Qt4Project *>(bc->target()->project())->rootQt4ProjectNode()->projectType() == ScriptTemplate); return AbstractProcessStep::init(); }
bool AndroidDeployQtStep::init() { if (AndroidManager::checkForQt51Files(project()->projectDirectory())) emit addOutput(tr("Found old folder \"android\" in source directory. Qt 5.2 does not use that folder by default."), ErrorOutput); m_targetArch = AndroidManager::targetArch(target()); if (m_targetArch.isEmpty()) { emit addOutput(tr("No Android arch set by the .pro file."), ErrorOutput); return false; } m_deviceAPILevel = AndroidManager::minimumSDK(target()); AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(project(), m_deviceAPILevel, m_targetArch); if (info.serialNumber.isEmpty()) // aborted return false; if (info.type == AndroidDeviceInfo::Emulator) { m_avdName = info.serialNumber; m_serialNumber.clear(); m_deviceAPILevel = info.sdk; } else { m_avdName.clear(); m_serialNumber = info.serialNumber; } AndroidManager::setDeviceSerialNumber(target(), m_serialNumber); ProjectExplorer::BuildConfiguration *bc = target()->activeBuildConfiguration(); QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit()); if (!version) return false; m_uninstallPreviousPackageRun = m_uninstallPreviousPackage || m_uninstallPreviousPackageTemp; m_uninstallPreviousPackageTemp = false; if (m_uninstallPreviousPackageRun) { m_packageName = AndroidManager::packageName(target()); if (m_packageName.isEmpty()){ emit addOutput(tr("Cannot find the package name."), ErrorOutput); return false; } } ProjectExplorer::ProcessParameters *pp = processParameters(); pp->setCommand(AndroidConfigurations::currentConfig().adbToolPath().toString()); pp->setMacroExpander(bc->macroExpander()); pp->setWorkingDirectory(bc->buildDirectory().toString()); Utils::Environment env = bc->environment(); pp->setEnvironment(env); m_apkPath = AndroidManager::androidQtSupport(target())->apkPath(target(), AndroidManager::signPackage(target()) ? AndroidQtSupport::ReleaseBuildSigned : AndroidQtSupport::DebugBuild).toString(); m_buildDirectory = bc->buildDirectory().toString(); bool result = AbstractProcessStep::init(); if (!result) return false; if (AndroidConfigurations::currentConfig().findAvd(m_deviceAPILevel, m_targetArch).isEmpty()) AndroidConfigurations::currentConfig().startAVDAsync(m_avdName); return true; }
bool AndroidDeployQtStep::init() { if (AndroidManager::checkForQt51Files(project()->projectDirectory())) emit addOutput(tr("Found old android folder in source directory. Qt 5.2 does not use that folder by default."), ErrorOutput); m_targetArch = AndroidManager::targetArch(target()); m_deviceAPILevel = AndroidManager::minimumSDK(target()); AndroidDeviceInfo info = AndroidConfigurations::instance().showDeviceDialog(project(), m_deviceAPILevel, m_targetArch); if (info.serialNumber.isEmpty()) // aborted return false; if (info.type == AndroidDeviceInfo::Emulator) { m_avdName = info.serialNumber; m_serialNumber.clear(); m_deviceAPILevel = info.sdk; } else { m_avdName.clear(); m_serialNumber = info.serialNumber; } Qt4ProjectManager::Qt4BuildConfiguration *bc = static_cast<Qt4ProjectManager::Qt4BuildConfiguration *>(target()->activeBuildConfiguration()); if (m_signPackage) { // check keystore and certificate passwords while (!AndroidManager::checkKeystorePassword(m_keystorePath.toString(), m_keystorePasswd)) { if (!keystorePassword()) return false; // user canceled } while (!AndroidManager::checkCertificatePassword(m_keystorePath.toString(), m_keystorePasswd, m_certificateAlias, m_certificatePasswd)) { if (!certificatePassword()) return false; // user canceled } if ((bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild)) emit addOutput(tr("Warning: Signing a debug package."), BuildStep::ErrorMessageOutput); } QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit()); if (!version) return false; ProjectExplorer::Project *project = target()->project(); JavaParser *parser = new JavaParser; parser->setProjectFileList(project->files(ProjectExplorer::Project::AllFiles)); setOutputParser(parser); QString command = version->qmakeProperty("QT_HOST_BINS"); if (!command.endsWith(QLatin1Char('/'))) command += QLatin1Char('/'); command += QLatin1String("androiddeployqt"); if (Utils::HostOsInfo::isWindowsHost()) command += QLatin1String(".exe"); QString deploymentMethod; if (m_deployAction == MinistroDeployment) deploymentMethod = QLatin1String("ministro"); else if (m_deployAction == DebugDeployment) deploymentMethod = QLatin1String("debug"); else if (m_deployAction == BundleLibrariesDeployment) deploymentMethod = QLatin1String("bundled"); QString outputDir = bc->buildDirectory().appendPath(QLatin1String("android")).toString(); QStringList arguments; arguments << QLatin1String("--input") << m_inputFile << QLatin1String("--output") << outputDir << QLatin1String("--deployment") << deploymentMethod << QLatin1String("--install") << QLatin1String("--ant") << AndroidConfigurations::instance().antToolPath().toString() << QLatin1String("--android-platform") << m_buildTargetSdk << QLatin1String("--jdk") << AndroidConfigurations::instance().openJDKPath().toString(); if (m_verbose) arguments << QLatin1String("--verbose"); if (m_avdName.isEmpty()) arguments << QLatin1String("--device") << info.serialNumber; if (m_signPackage) { arguments << QLatin1String("--sign") << m_keystorePath.toString() << m_certificateAlias << QLatin1String("--storepass") << m_keystorePasswd; if (!m_certificatePasswd.isEmpty()) arguments << QLatin1String("--keypass") << m_certificatePasswd; } ProjectExplorer::ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setWorkingDirectory(bc->buildDirectory().toString()); Utils::Environment env = bc->environment(); // Force output to english for the parsers. Do this here and not in the toolchain's // addToEnvironment() to not screw up the users run environment. env.set(QLatin1String("LC_ALL"), QLatin1String("C")); pp->setEnvironment(env); pp->setCommand(command); pp->setArguments(Utils::QtcProcess::joinArgs(arguments)); pp->resolveAll(); m_openPackageLocationForRun = m_openPackageLocation; m_apkPath = AndroidManager::apkPath(target(), m_signPackage ? AndroidManager::ReleaseBuildSigned : AndroidManager::DebugBuild).toString(); m_buildDirectory = bc->buildDirectory().toString(); bool result = AbstractProcessStep::init(); if (!result) return false; AndroidConfigurations::instance().startAVDAsync(m_avdName); return true; }
bool AndroidDeployQtStep::init() { if (AndroidManager::checkForQt51Files(project()->projectDirectory())) emit addOutput(tr("Found old folder \"android\" in source directory. Qt 5.2 does not use that folder by default."), ErrorOutput); m_targetArch = AndroidManager::targetArch(target()); if (m_targetArch.isEmpty()) { emit addOutput(tr("No Android arch set by the .pro file."), ErrorOutput); return false; } m_deviceAPILevel = AndroidManager::minimumSDK(target()); AndroidDeviceInfo info = AndroidConfigurations::showDeviceDialog(project(), m_deviceAPILevel, m_targetArch); if (info.serialNumber.isEmpty()) // aborted return false; if (info.type == AndroidDeviceInfo::Emulator) { m_avdName = info.serialNumber; m_serialNumber.clear(); m_deviceAPILevel = info.sdk; } else { m_avdName.clear(); m_serialNumber = info.serialNumber; } QmakeProjectManager::QmakeBuildConfiguration *bc = static_cast<QmakeProjectManager::QmakeBuildConfiguration *>(target()->activeBuildConfiguration()); if (m_signPackage) { // check keystore and certificate passwords while (!AndroidManager::checkKeystorePassword(m_keystorePath.toString(), m_keystorePasswd)) { if (!keystorePassword()) return false; // user canceled } while (!AndroidManager::checkCertificatePassword(m_keystorePath.toString(), m_keystorePasswd, m_certificateAlias, m_certificatePasswd)) { if (!certificatePassword()) return false; // user canceled } if ((bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild)) emit addOutput(tr("Warning: Signing a debug package."), BuildStep::ErrorMessageOutput); } QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit()); if (!version) return false; QmakeProjectManager::QmakeProject *pro = static_cast<QmakeProjectManager::QmakeProject *>(project()); JavaParser *parser = new JavaParser; parser->setProjectFileList(pro->files(ProjectExplorer::Project::AllFiles)); setOutputParser(parser); QString command = version->qmakeProperty("QT_HOST_BINS"); if (!command.endsWith(QLatin1Char('/'))) command += QLatin1Char('/'); command += QLatin1String("androiddeployqt"); if (Utils::HostOsInfo::isWindowsHost()) command += QLatin1String(".exe"); QString deploymentMethod; if (m_deployAction == MinistroDeployment) deploymentMethod = QLatin1String("ministro"); else if (m_deployAction == DebugDeployment) deploymentMethod = QLatin1String("debug"); else if (m_deployAction == BundleLibrariesDeployment) deploymentMethod = QLatin1String("bundled"); QString outputDir = bc->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)).toString(); const QmakeProjectManager::QmakeProFileNode *node = pro->rootQmakeProjectNode()->findProFileFor(m_proFilePathForInputFile); if (!node) { // should never happen emit addOutput(tr("Internal Error: Could not find .pro file."), BuildStep::ErrorMessageOutput); return false; } QString inputFile = node->singleVariableValue(QmakeProjectManager::AndroidDeploySettingsFile); if (inputFile.isEmpty()) { // should never happen emit addOutput(tr("Internal Error: Unknown Android deployment JSON file location."), BuildStep::ErrorMessageOutput); return false; } QStringList arguments; arguments << QLatin1String("--input") << inputFile << QLatin1String("--output") << outputDir << QLatin1String("--deployment") << deploymentMethod << QLatin1String("--install") << QLatin1String("--ant") << AndroidConfigurations::currentConfig().antToolPath().toString() << QLatin1String("--android-platform") << m_buildTargetSdk << QLatin1String("--jdk") << AndroidConfigurations::currentConfig().openJDKLocation().toString(); parser->setSourceDirectory(Utils::FileName::fromString(node->singleVariableValue(QmakeProjectManager::AndroidPackageSourceDir))); parser->setBuildDirectory(Utils::FileName::fromString(outputDir)); if (m_verbose) arguments << QLatin1String("--verbose"); if (m_avdName.isEmpty()) arguments << QLatin1String("--device") << info.serialNumber; if (m_signPackage) { arguments << QLatin1String("--sign") << m_keystorePath.toString() << m_certificateAlias << QLatin1String("--storepass") << m_keystorePasswd; if (!m_certificatePasswd.isEmpty()) arguments << QLatin1String("--keypass") << m_certificatePasswd; } ProjectExplorer::ProcessParameters *pp = processParameters(); pp->setMacroExpander(bc->macroExpander()); pp->setWorkingDirectory(bc->buildDirectory().toString()); Utils::Environment env = bc->environment(); pp->setEnvironment(env); pp->setCommand(command); pp->setArguments(Utils::QtcProcess::joinArgs(arguments)); pp->resolveAll(); m_openPackageLocationForRun = m_openPackageLocation; m_apkPath = AndroidManager::apkPath(target(), m_signPackage ? AndroidManager::ReleaseBuildSigned : AndroidManager::DebugBuild).toString(); m_buildDirectory = bc->buildDirectory().toString(); bool result = AbstractProcessStep::init(); if (!result) return false; if (AndroidConfigurations::currentConfig().findAvd(m_deviceAPILevel, m_targetArch).isEmpty()) AndroidConfigurations::currentConfig().startAVDAsync(m_avdName); return true; }