Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(482)

Side by Side Diff: visual_studio/NativeClientVSAddIn/InstallerResources/create_ppapi_platform.py

Issue 10797040: PPAPI Patching System and Unit Tests (Closed) Base URL: https://nativeclient-sdk.googlecode.com/svn/trunk/src
Patch Set: Finalized PPAPI settings Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5
6 """ This script creates the PPAPI project settings template.
7
8 For copyright reasons, we should not directly distribute the PPAPI template
9 because it is nearly a clone of the Win32 template which is Copyrighted.
10 Instead, this script copies the existing Win32 template from the user's system
11 and intelligently modifies the copy to be the PPAPI template.
12 """
13
14 import pdb
binji 2012/07/24 22:13:08 remove debugging code
tysand 2012/07/24 23:19:49 Done.
15 import os
16 import shutil
17 import string
18 import xml_patch
19 import xml.etree.ElementTree
20
21 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
22
23 PLATFORM_FILES = [
24 ('Microsoft.Cpp.Win32.default.props',
25 'Microsoft.Cpp.[platform].default.props.patch',
26 'Microsoft.Cpp.PPAPI.default.props'),
27 ('Microsoft.Cpp.Win32.props',
28 'Microsoft.Cpp.[platform].props.patch',
29 'Microsoft.Cpp.PPAPI.props'),
30 ('Microsoft.Cpp.Win32.targets',
31 'Microsoft.Cpp.[platform].targets.patch',
32 'Microsoft.Cpp.PPAPI.targets'),
33 ('PlatformToolsets\\v100\\Microsoft.Cpp.Win32.v100.props',
34 'PlatformToolsets\\v100\\Microsoft.Cpp.[platform].v100.props.patch',
35 'PlatformToolsets\\v100\\Microsoft.Cpp.PPAPI.v100.props'),
36 ('PlatformToolsets\\v100\\Microsoft.Cpp.Win32.v100.targets',
37 'PlatformToolsets\\v100\\Microsoft.Cpp.[platform].v100.targets.patch',
38 'PlatformToolsets\\v100\\Microsoft.Cpp.PPAPI.v100.targets')]
39
40 UI_FILES = [
41 ('general.xml',
42 'Props\\ppapi_general.xml.patch',
43 'Props\\ppapi_general.xml'),
44 ('general_ps.xml',
45 'Props\\ppapi_general_ps.xml.patch',
46 'Props\\ppapi_general_ps.xml')]
47
48 COPY_FILES = [
49 'ImportAfter\\PPAPI.override.props']
50
51
52 def PrependCopyright(source_file_name, dest_file_name):
53 """Adds the copyright notice from source file to the dest file.
54
55 Since the patch_xml function does not read comments, the copyright is skipped
56 during the initial copy. This function adds it back and also attaches a
57 notice that the file was based on source_file_name and slightly modified.
58
59 Args:
60 source_file_name: The original Win32 file.
61 dest_file_name: The existing PPAPI file.
62
63 Returns:
64 None.
65 """
66 with open(source_file_name, 'r') as source_file:
67 in_copyright = False
68 copyright_notice = ''
69 for line in source_file:
70 if '<!--' in line:
71 in_copyright = True
72 if in_copyright:
73 copyright_notice += line
74 if '-->' in line:
75 in_copyright = False
76 break
77
78 with open(dest_file_name, 'r') as original:
79 xml_data = original.read()
80
81 chrome_notice = ('<!-- This file has been copied and modified from %s during '
82 'the installation process. -->\n\n' % (source_file_name))
83
84 with open(dest_file_name, 'w') as changed:
85 changed.writelines(copyright_notice + chrome_notice + xml_data)
86
87
88 def CreateTemplateFile(source, patch, dest):
89 """Creates a single PPAPI template file.
90
91 Args:
92 source: The path source file to create from.
93 patch: The path to the patch file to apply.
94 dest: The path to the file to create.
95 Returns:
96 None.
97 """
98 source_xml = xml.etree.ElementTree.parse(source)
99 patch_xml = xml.etree.ElementTree.parse(patch)
100 modified_xml = xml_patch.PatchXML(source_xml, patch_xml)
101
102 if not os.path.exists(os.path.dirname(dest)):
103 os.makedirs(os.path.dirname(dest))
104
105 FixAttributesNamespace(modified_xml)
106 default_namespace = GetDefaultNamespace(modified_xml)
107 modified_xml.write(dest, default_namespace=default_namespace)
108 PrependCopyright(source, dest)
109
110
111 def GetDefaultNamespace(tree):
112 # Returns the uri (namespace identifier) of the root element.
113 tag = tree.getroot().tag
114 if tag[:1] == "{":
binji 2012/07/24 22:13:08 nice trick, tag[:1] is the same as tag[0] but it w
tysand 2012/07/24 23:19:49 Changed this to tag.startswith("{") following your
115 uri, rest = tag[1:].rsplit("}", 1)
116 return uri
117 else:
118 return None
119
120
121 def FixAttributesNamespace(tree):
122 # ElementTree's implementation seems to be broken in that attributes
123 # do not inherit the default namespace of their node or parent nodes.
124 # This causes issues with ElementTree.write() when using a default namespace.
125 # Since the attributes do not have a namespace, the code that collects a
126 # mapping between local names and qualified names (with a namespace) breaks.
127 # The work-around is to give all attributes the default namespace.
128 default_namespace = GetDefaultNamespace(tree)
129 for elem in tree.getroot().getiterator():
130 new_attrib = dict()
131 for key, value in elem.attrib.items():
132 # If the attribute does not have a namespace yet then give it one.
133 if key[:1] != "{":
134 new_key = "{%s}%s" % (default_namespace, key)
135 new_attrib[new_key] = value
136 else:
137 new_attrib[key] = value
138 elem.attrib = new_attrib
139
140
141 def main():
142 install_dir = os.path.expandvars(
143 '%ProgramFiles(x86)%\\MSBuild\\Microsoft.Cpp\\v4.0\\Platforms')
144
145 # Note 1033 is code for the english language.
146 ui_xml_dir = os.path.expandvars(
147 '%ProgramFiles(x86)%\\MSBuild\\Microsoft.Cpp\\v4.0\\1033')
148
149 win32_dir = os.path.join(install_dir, 'Win32')
150 ppapi_dir = os.path.join(install_dir, 'PPAPI')
151 patch_dir = os.path.join(SCRIPT_DIR, 'PPAPI_Patch')
152
153 if not os.path.exists(win32_dir):
154 raise Exception('Win32 platform is not installed on this machine!')
155
156 for template_creation in PLATFORM_FILES:
157 CreateTemplateFile(
158 os.path.join(win32_dir, template_creation[0]),
159 os.path.join(patch_dir, template_creation[1]),
160 os.path.join(ppapi_dir, template_creation[2]))
161
162 for template_creation in UI_FILES:
163 CreateTemplateFile(
164 os.path.join(ui_xml_dir, template_creation[0]),
165 os.path.join(patch_dir, template_creation[1]),
166 os.path.join(ppapi_dir, template_creation[2]))
167
168 for file_name in COPY_FILES:
169 copy_from = os.path.join(patch_dir, file_name)
170 copy_to = os.path.join(ppapi_dir, file_name)
171 if not os.path.exists(os.path.dirname(copy_to)):
172 os.makedirs(os.path.dirname(copy_to))
173 shutil.copyfile(copy_from, copy_to)
174
175 shutil.copyfile(
176 os.path.join(win32_dir, 'Microsoft.Build.CPPTasks.Win32.dll'),
177 os.path.join(ppapi_dir, 'Microsoft.Build.CPPTasks.PPAPI.dll'))
178
179
180 if __name__ == '__main__':
181 main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698