blob: 08b5a829b4c1b92b5b064e060ed274ef0dfc2eb8 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'gn_parser.dart';
import 'collector.dart';
class ArgsGnCollector implements Collector {
final RegExp ARGS_IMPORT_EXTRACTOR = RegExp('([^/]*)/([^/]*)\.gni');
Map gnTitles = {
'boards': 'Board',
'products': 'Product',
'universe_package_labels': [
'Universe packages',
'--with argument of `fx set`'
],
'base_package_labels': [
'Base packages',
'--with-base argument of `fx set`'
],
};
@override
FutureOr<List<Item>> collect(bool includeSlow,
{List<Category> restrictCategories}) {
var args_file = Platform.environment['FUCHSIA_BUILD_DIR'] + '/args.gn';
Future<List<Item>> gnParserRunner =
Process.run('fx', ['gn', 'format', '--dump-tree=json', args_file])
.then((ProcessResult pr) {
List<Item> result = new List();
if (pr.exitCode != 0) {
throw ('Unexpected error running fx gn: exit code ${pr.exitCode}\n---- stderr output:\n${pr.stderr}\n------');
} else {
var argsTree = jsonDecode(pr.stderr)['child'];
// TO DEBUG:
// stderr.writeln(jsonEncode(argsTree));
BasicGnParser parser = new BasicGnParser(argsTree);
_addImportItems(parser, result);
_addDirectItems(parser, result);
_addCalculatedItems(parser, result);
return result;
}
});
return gnParserRunner;
}
void _addDirectItems(BasicGnParser parser, List<Item> appendTo) {
for (String key in parser.assignedVariables.keys) {
dynamic value = parser.assignedVariables[key];
var title = gnTitles[key];
if (title != null && (value is! List || value.isNotEmpty)) {
var notes = null;
if (title is List<String>) {
title = gnTitles[key][0];
notes = gnTitles[key][1];
}
appendTo.add(new Item(
CategoryType.buildInfo, key, title, value.toString(), notes));
}
}
}
void _addImportItems(BasicGnParser parser, List<Item> appendTo) {
for (String importClause in parser.imports) {
Match m = ARGS_IMPORT_EXTRACTOR.firstMatch(importClause);
if (m != null) {
var key = m.group(1);
var title = gnTitles[key] ?? key;
appendTo.add(new Item(
CategoryType.buildInfo, key, title, m.group(2), importClause));
}
}
}
void _addCalculatedItems(BasicGnParser parser, List<Item> appendTo) {
// goma
bool isGomaEnabled = parser.assignedVariables['use_goma'] == 'true';
String gomaDir = parser.assignedVariables['goma_dir'];
appendTo.add(new Item(CategoryType.buildInfo, 'goma', 'Goma',
isGomaEnabled ? 'enabled' : 'disabled', gomaDir));
// release
bool isRelease = parser.assignedVariables['is_debug'] == 'false';
appendTo.add(new Item(CategoryType.buildInfo, 'release', 'Is release?',
isRelease ? 'true' : 'false', '--release argument of `fx set`'));
}
}