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