• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2019 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file
4
5import 'package:xml/xml.dart' as xml;
6
7import '../base/file_system.dart';
8
9/// Writes a property sheet (.props) file to expose all of the key/value
10/// pairs in [variables] as enivornment variables.
11void writePropertySheet(File propertySheetFile, Map<String, String> variables) {
12  final xml.XmlBuilder builder = xml.XmlBuilder();
13  builder.processing('xml', 'version="1.0" encoding="utf-8"');
14  builder.element('Project', nest: () {
15    builder.attribute('ToolsVersion', '4.0');
16    builder.attribute(
17        'xmlns', 'http://schemas.microsoft.com/developer/msbuild/2003');
18    builder.element('ImportGroup', nest: () {
19      builder.attribute('Label', 'PropertySheets');
20    });
21    _addUserMacros(builder, variables);
22    builder.element('PropertyGroup');
23    builder.element('ItemDefinitionGroup');
24    _addItemGroup(builder, variables);
25  });
26
27  propertySheetFile.createSync(recursive: true);
28  propertySheetFile.writeAsStringSync(
29      builder.build().toXmlString(pretty: true, indent: '  '));
30}
31
32/// Adds the UserMacros PropertyGroup that defines [variables] to [builder].
33void _addUserMacros(xml.XmlBuilder builder, Map<String, String> variables) {
34  builder.element('PropertyGroup', nest: () {
35    builder.attribute('Label', 'UserMacros');
36    for (final MapEntry<String, String> variable in variables.entries) {
37      builder.element(variable.key, nest: () {
38        builder.text(variable.value);
39      });
40    }
41  });
42}
43
44/// Adds the ItemGroup to expose the given [variables] as environment variables
45/// to [builder].
46void _addItemGroup(xml.XmlBuilder builder, Map<String, String> variables) {
47  builder.element('ItemGroup', nest: () {
48    for (final String name in variables.keys) {
49      builder.element('BuildMacro', nest: () {
50        builder.attribute('Include', name);
51        builder.element('Value', nest: () {
52          builder.text('\$($name)');
53        });
54        builder.element('EnvironmentVariable', nest: () {
55          builder.text('true');
56        });
57      });
58    }
59  });
60}
61