use of com.google.idea.blaze.base.bazel.BuildSystem.BuildInvoker in project intellij by bazelbuild.
the class MobileInstallBuildStep method build.
@Override
public void build(BlazeContext context, BlazeAndroidDeviceSelector.DeviceSession deviceSession) {
BlazeProjectData projectData = BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
if (projectData == null) {
IssueOutput.error("Missing project data. Please sync and try again.").submit(context);
return;
}
DeviceFutures deviceFutures = deviceSession.deviceFutures;
if (deviceFutures == null) {
IssueOutput.error("Error fetching devices!").submit(context);
return;
}
context.output(new StatusOutput("Waiting for target device..."));
IDevice device = resolveDevice(context, deviceFutures);
if (device == null) {
return;
}
BuildInvoker invoker = Blaze.getBuildSystemProvider(project).getBuildSystem().getBuildInvoker(project, context);
BlazeCommand.Builder command = BlazeCommand.builder(invoker, BlazeCommandName.MOBILE_INSTALL);
if (passAdbArgWithSerialToMi.getValue()) {
// Redundant, but we need this to get around bug in bazel.
// https://github.com/bazelbuild/bazel/issues/4922
command.addBlazeFlags(BlazeFlags.ADB_ARG + "-s ", BlazeFlags.ADB_ARG + device.getSerialNumber());
}
if (!StudioDeployerExperiment.isEnabled()) {
MobileInstallAdbLocationProvider.getAdbLocationForMobileInstall(project).ifPresent((location) -> command.addBlazeFlags(BlazeFlags.ADB, location));
}
WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project);
final String deployInfoSuffix = getDeployInfoSuffix(Blaze.getBuildSystemName(project));
try (BuildResultHelper buildResultHelper = invoker.createBuildResultHelper();
AdbTunnelConfigurator tunnelConfig = getTunnelConfigurator(context)) {
tunnelConfig.setupConnection(context);
if (!StudioDeployerExperiment.isEnabled()) {
String deviceFlag = device.getSerialNumber();
if (tunnelConfig.isActive()) {
deviceFlag += ":tcp:" + tunnelConfig.getAdbServerPort();
} else {
InetSocketAddress adbAddr = AndroidDebugBridge.getSocketAddress();
if (adbAddr == null) {
IssueOutput.warn("Can't get ADB server port, please ensure ADB server is running. Will fallback" + " to the default adb server.").submit(context);
} else {
deviceFlag += ":tcp:" + adbAddr.getPort();
}
}
command.addBlazeFlags(BlazeFlags.DEVICE, deviceFlag);
}
command.addTargets(label).addBlazeFlags(blazeFlags).addBlazeFlags(buildResultHelper.getBuildFlags()).addExeFlags(exeFlags).addExeFlags("--nolaunch_app");
if (StudioDeployerExperiment.isEnabled()) {
command.addExeFlags("--nodeploy");
}
SaveUtil.saveAllFiles();
context.output(new StatusOutput("Invoking mobile-install..."));
ExternalTask task = ExternalTask.builder(workspaceRoot).addBlazeCommand(command.build()).context(context).stdout(LineProcessingOutputStream.of(new PrintOutputLineProcessor(context))).stderr(LineProcessingOutputStream.of(BlazeConsoleLineProcessorProvider.getAllStderrLineProcessors(context))).build();
Stopwatch s = Stopwatch.createStarted();
int exitCode = task.run();
logBuildTime(launchId, StudioDeployerExperiment.isEnabled(), s.elapsed(), exitCode);
if (exitCode != 0) {
IssueOutput.error("Blaze build failed. See Blaze Console for details.").submit(context);
return;
}
ListenableFuture<Void> unusedFuture = FileCaches.refresh(project, context, BlazeBuildOutputs.noOutputs(BuildResult.fromExitCode(exitCode)));
context.output(new StatusOutput("Reading deployment information..."));
String executionRoot = ExecRootUtil.getExecutionRoot(buildResultHelper, project, blazeFlags, context);
if (executionRoot == null) {
IssueOutput.error("Could not locate execroot!").submit(context);
return;
}
AndroidDeployInfo deployInfoProto = deployInfoHelper.readDeployInfoProtoForTarget(label, buildResultHelper, fileName -> fileName.endsWith(deployInfoSuffix));
deployInfo = deployInfoHelper.extractDeployInfoAndInvalidateManifests(project, new File(executionRoot), deployInfoProto);
String msg;
if (StudioDeployerExperiment.isEnabled()) {
msg = "mobile-install build completed, deploying split apks...";
} else {
msg = "Done.";
}
context.output(new StatusOutput(msg));
} catch (GetArtifactsException e) {
IssueOutput.error("Could not read BEP output: " + e.getMessage()).submit(context);
} catch (GetDeployInfoException e) {
IssueOutput.error("Could not read apk deploy info from build: " + e.getMessage()).submit(context);
}
}
use of com.google.idea.blaze.base.bazel.BuildSystem.BuildInvoker in project intellij by bazelbuild.
the class BlazeInstrumentationTestApkBuildStep method build.
@Override
public void build(BlazeContext context, BlazeAndroidDeviceSelector.DeviceSession deviceSession) {
BlazeProjectData projectData = BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
if (projectData == null) {
IssueOutput.error("Invalid project data. Please sync the project.").submit(context);
return;
}
InstrumentorToTarget testComponents = getInstrumentorToTargetPair(context, projectData);
if (testComponents == null) {
return;
}
BuildInvoker invoker = Blaze.getBuildSystemProvider(project).getBuildSystem().getBuildInvoker(project, context);
BlazeCommand.Builder command = BlazeCommand.builder(invoker, BlazeCommandName.BUILD);
WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project);
// are on the local filesystem).
try (BuildResultHelper buildResultHelper = invoker.createBuildResultHelper()) {
if (testComponents.isSelfInstrumentingTest()) {
command.addTargets(testComponents.instrumentor);
} else {
command.addTargets(testComponents.target, testComponents.instrumentor);
}
command.addBlazeFlags("--output_groups=+android_deploy_info").addBlazeFlags(buildFlags).addBlazeFlags(buildResultHelper.getBuildFlags());
SaveUtil.saveAllFiles();
int retVal = ExternalTask.builder(workspaceRoot).addBlazeCommand(command.build()).context(context).stderr(LineProcessingOutputStream.of(BlazeConsoleLineProcessorProvider.getAllStderrLineProcessors(context))).build().run();
ListenableFuture<Void> unusedFuture = FileCaches.refresh(project, context, BlazeBuildOutputs.noOutputs(BuildResult.fromExitCode(retVal)));
if (retVal != 0) {
IssueOutput.error("Blaze build failed. See Blaze Console for details.").submit(context);
return;
}
try {
context.output(new StatusOutput("Reading deployment information..."));
String executionRoot = ExecRootUtil.getExecutionRoot(buildResultHelper, project, buildFlags, context);
if (executionRoot == null) {
IssueOutput.error("Could not locate execroot!").submit(context);
return;
}
AndroidDeployInfo instrumentorDeployInfoProto = deployInfoHelper.readDeployInfoProtoForTarget(testComponents.instrumentor, buildResultHelper, fileName -> fileName.endsWith(DEPLOY_INFO_FILE_SUFFIX));
if (testComponents.isSelfInstrumentingTest()) {
deployInfo = deployInfoHelper.extractDeployInfoAndInvalidateManifests(project, new File(executionRoot), instrumentorDeployInfoProto);
} else {
AndroidDeployInfo targetDeployInfoProto = deployInfoHelper.readDeployInfoProtoForTarget(testComponents.target, buildResultHelper, fileName -> fileName.endsWith(DEPLOY_INFO_FILE_SUFFIX));
deployInfo = deployInfoHelper.extractInstrumentationTestDeployInfoAndInvalidateManifests(project, new File(executionRoot), instrumentorDeployInfoProto, targetDeployInfoProto);
}
} catch (GetArtifactsException e) {
IssueOutput.error("Could not read BEP output: " + e.getMessage()).submit(context);
} catch (GetDeployInfoException e) {
IssueOutput.error("Could not read apk deploy info from build: " + e.getMessage()).submit(context);
}
}
}
use of com.google.idea.blaze.base.bazel.BuildSystem.BuildInvoker in project intellij by bazelbuild.
the class FullApkBuildStep method build.
@Override
public void build(BlazeContext context, BlazeAndroidDeviceSelector.DeviceSession deviceSession) {
BlazeProjectData projectData = BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
if (projectData == null) {
IssueOutput.error("Missing project data. Please sync and try again.").submit(context);
return;
}
BuildInvoker invoker = Blaze.getBuildSystemProvider(project).getBuildSystem().getBuildInvoker(project, context);
BlazeCommand.Builder command = BlazeCommand.builder(invoker, BlazeCommandName.BUILD);
WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project);
try (BuildResultHelper buildResultHelper = invoker.createBuildResultHelper()) {
command.addTargets(label).addBlazeFlags("--output_groups=+android_deploy_info").addBlazeFlags(buildFlags).addBlazeFlags(buildResultHelper.getBuildFlags());
SaveUtil.saveAllFiles();
int retVal = ExternalTask.builder(workspaceRoot).addBlazeCommand(command.build()).context(context).stderr(LineProcessingOutputStream.of(BlazeConsoleLineProcessorProvider.getAllStderrLineProcessors(context))).build().run();
ListenableFuture<Void> unusedFuture = FileCaches.refresh(project, context, BlazeBuildOutputs.noOutputs(BuildResult.fromExitCode(retVal)));
if (retVal != 0) {
IssueOutput.error("Blaze build failed. See Blaze Console for details.").submit(context);
return;
}
context.output(new StatusOutput("Reading deployment information..."));
String executionRoot = ExecRootUtil.getExecutionRoot(buildResultHelper, project, buildFlags, context);
if (executionRoot == null) {
IssueOutput.error("Could not locate execroot!").submit(context);
return;
}
AndroidDeployInfo deployInfoProto = deployInfoHelper.readDeployInfoProtoForTarget(label, buildResultHelper, fileName -> fileName.endsWith(DEPLOY_INFO_SUFFIX));
deployInfo = deployInfoHelper.extractDeployInfoAndInvalidateManifests(project, new File(executionRoot), deployInfoProto);
} catch (GetArtifactsException e) {
IssueOutput.error("Could not read BEP output: " + e.getMessage()).submit(context);
} catch (GetDeployInfoException e) {
IssueOutput.error("Could not read apk deploy info from build: " + e.getMessage()).submit(context);
}
if (FETCH_REMOTE_APKS.getValue() && deployInfo != null && apksRequireDownload(deployInfo)) {
context.output(new StatusOutput("Fetching remotely built APKs... "));
ImmutableList<File> localApks = deployInfo.getApksToDeploy().stream().map(apk -> FullApkBuildStep.downloadApkIfRemote(apk, context)).collect(ImmutableList.toImmutableList());
deployInfo = new BlazeAndroidDeployInfo(deployInfo.getMergedManifest(), deployInfo.getTestTargetMergedManifest(), localApks);
context.output(new StatusOutput("Done fetching APKs."));
}
}
use of com.google.idea.blaze.base.bazel.BuildSystem.BuildInvoker in project intellij by bazelbuild.
the class BlazeQuerySourceToTargetProvider method getBlazeCommand.
private static BlazeCommand getBlazeCommand(Project project, ContextType type, String query, List<String> additionalBlazeFlags, BlazeContext context) {
// never use a custom output base for queries during sync
String outputBaseFlag = type == ContextType.Sync ? null : BlazeQueryOutputBaseProvider.getInstance(project).getOutputBaseFlag();
BuildInvoker buildInvoker = Blaze.getBuildSystemProvider(project).getBuildSystem().getBuildInvoker(project, context);
return BlazeCommand.builder(buildInvoker, BlazeCommandName.QUERY).addBlazeFlags(additionalBlazeFlags).addBlazeFlags("--keep_going").addBlazeFlags(query).addBlazeStartupFlags(outputBaseFlag == null ? ImmutableList.of() : ImmutableList.of(outputBaseFlag)).build();
}
use of com.google.idea.blaze.base.bazel.BuildSystem.BuildInvoker in project intellij by bazelbuild.
the class BlazeBuildService method buildTargetExpressions.
private static void buildTargetExpressions(Project project, ProjectViewSet projectView, BlazeProjectData projectData, ScopedFunction<List<TargetExpression>> targetsFunction, NotificationScope notificationScope, String taskName, BuildSystem buildSystem) {
if (ApplicationManager.getApplication().isUnitTestMode()) {
// this never being called *and* relied on PROJECT_LAST_BUILD_TIMESTAMP_KEY being set
return;
}
FocusBehavior problemsViewFocus = BlazeUserSettings.getInstance().getShowProblemsViewOnRun();
// go/futurereturn-lsc
@SuppressWarnings("unused") Future<?> possiblyIgnoredError = ProgressiveTaskWithProgressIndicator.builder(project, "Building targets").submitTaskWithResult(new ScopedTask<Void>() {
@Override
public Void execute(BlazeContext context) {
Task task = new Task(project, taskName, Task.Type.MAKE);
context.push(new ToolWindowScope.Builder(project, task).setIssueParsers(BlazeIssueParser.defaultIssueParsers(project, WorkspaceRoot.fromProject(project), BlazeInvocationContext.ContextType.Sync)).build()).push(new ExperimentScope()).push(new BlazeConsoleScope.Builder(project).addConsoleFilters(new IssueOutputFilter(project, WorkspaceRoot.fromProject(project), BlazeInvocationContext.ContextType.Sync, true)).build()).push(new ProblemsViewScope(project, problemsViewFocus)).push(new IdeaLogScope()).push(new TimingScope("Make", EventType.BlazeInvocation)).push(notificationScope);
List<TargetExpression> targets = targetsFunction.execute(context);
if (targets == null) {
return null;
}
WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project);
SaveUtil.saveAllFiles();
BlazeBuildListener.EP_NAME.extensions().forEach(e -> e.buildStarting(project));
BuildInvoker buildInvoker = buildSystem.getBuildInvoker(project, context);
ShardedTargetsResult shardedTargets = BlazeBuildTargetSharder.expandAndShardTargets(project, context, workspaceRoot, projectView, projectData.getWorkspacePathResolver(), targets, buildInvoker, SyncStrategy.SERIAL);
if (shardedTargets.buildResult.status == BuildResult.Status.FATAL_ERROR) {
return null;
}
BlazeBuildOutputs buildOutputs = BlazeIdeInterface.getInstance().build(project, context, workspaceRoot, projectData.getBlazeVersionData(), buildInvoker, projectView, shardedTargets.shardedTargets, projectData.getWorkspaceLanguageSettings(), ImmutableSet.of(OutputGroup.COMPILE), BlazeInvocationContext.OTHER_CONTEXT);
refreshFileCachesAndNotifyListeners(context, buildOutputs, project);
if (buildOutputs.buildResult.status != BuildResult.Status.SUCCESS) {
context.setHasError();
}
return null;
}
});
}
Aggregations