anchor.diff:  /// Not safe to interrupt as it may leave the `out/` directory in a corrupted
   /// state. GN is pretty quick though, so it's OK to not support interruption.
   class GnPipelineStep extends ProcessStep {
  -  GnPipelineStep(this.buildCanvasKit);
  +  GnPipelineStep({this.target = 'engine'})
  +      : assert(target == 'engine' || target == 'sdk');
   
     @override
     String get description => 'gn';
  
positive.code:   @override
    bool get isSafeToInterrupt => true;
  
    /// Whether or not to build CanvasKit.
    final bool buildCanvasKit;
  
    @override
    Future<ProcessManager> createProcess() {
      print('Running autoninja...');
      Future<ProcessManager> ninjaProcess = startProcess(
        'autoninja',
        <String>[
          '-C',
          environment.hostDebugUnoptDir.path,
        ],
      );
      if (buildCanvasKit) {
        ninjaProcess = ninjaProcess.then((_) {
          return startProcess(
            'autoninja',
            <String>[
              '-C',
              environment.canvasKitOutDir.path,
            ],
          );
        });
      }
      return ninjaProcess;
    }
  }
  
negative.code:   @override
    FutureOr<bool> run() async {
      final FilePath libPath = FilePath.fromWebUi('lib');
      final List<PipelineStep> steps = <PipelineStep>[
        GnPipelineStep(target: 'engine'),
        NinjaPipelineStep(target: environment.hostDebugUnoptDir),
      ];
      if (buildCanvasKit) {
        steps.addAll(<PipelineStep>[
          GnPipelineStep(target: 'canvaskit'),
          NinjaPipelineStep(target: environment.canvasKitOutDir),
        ]);
      }
      final Pipeline buildPipeline = Pipeline(steps: steps);
      await buildPipeline.run();
  
      if (isWatchMode) {
  