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.
6 """Build script to generate a new sdk_tools bundle.
8 This script packages the files necessary to generate the SDK updater -- the
9 tool users run to download new bundles, update existing bundles, etc.
13 import buildbot_common
19 SCRIPT_DIR
= os
.path
.dirname(os
.path
.abspath(__file__
))
20 SDK_SRC_DIR
= os
.path
.dirname(SCRIPT_DIR
)
21 SDK_DIR
= os
.path
.dirname(SDK_SRC_DIR
)
22 SRC_DIR
= os
.path
.dirname(SDK_DIR
)
23 NACL_DIR
= os
.path
.join(SRC_DIR
, 'native_client')
24 CYGTAR
= os
.path
.join(NACL_DIR
, 'build', 'cygtar.py')
26 sys
.path
.append(os
.path
.join(SDK_SRC_DIR
, 'tools'))
33 ('build_tools/naclsdk', 'nacl_sdk/naclsdk'),
34 ('build_tools/naclsdk.bat', 'nacl_sdk/naclsdk.bat'),
37 ('build_tools/json/naclsdk_manifest0.json',
38 'nacl_sdk/sdk_cache/naclsdk_manifest2.json'),
41 ('build_tools/sdk_tools/cacerts.txt', 'nacl_sdk/sdk_tools/cacerts.txt'),
42 ('build_tools/sdk_tools/*.py', 'nacl_sdk/sdk_tools/'),
43 ('build_tools/sdk_tools/command/*.py', 'nacl_sdk/sdk_tools/command/'),
44 ('build_tools/sdk_tools/third_party/*.py', 'nacl_sdk/sdk_tools/third_party/'),
45 ('build_tools/sdk_tools/third_party/fancy_urllib/*.py',
46 'nacl_sdk/sdk_tools/third_party/fancy_urllib/'),
47 ('build_tools/sdk_tools/third_party/fancy_urllib/README.chromium',
48 'nacl_sdk/sdk_tools/third_party/fancy_urllib/README.chromium'),
49 ('build_tools/manifest_util.py', 'nacl_sdk/sdk_tools/manifest_util.py'),
50 ('LICENSE', 'nacl_sdk/sdk_tools/LICENSE'),
51 (CYGTAR
, 'nacl_sdk/sdk_tools/cygtar.py'),
55 def MakeUpdaterFilesAbsolute(out_dir
):
56 """Return the result of changing all relative paths in UPDATER_FILES to
60 out_dir: The output directory.
62 A list of 2-tuples. The first element in each tuple is the source path and
63 the second is the destination path.
65 assert os
.path
.isabs(out_dir
)
68 for in_file
, out_file
in UPDATER_FILES
:
69 if not os
.path
.isabs(in_file
):
70 in_file
= os
.path
.join(SDK_SRC_DIR
, in_file
)
71 out_file
= os
.path
.join(out_dir
, out_file
)
72 result
.append((in_file
, out_file
))
77 """Expand wildcards for 2-tuples of sources/destinations.
79 This function also will convert destinations from directories into filenames.
81 ('foo/*.py', 'bar/') => [('foo/a.py', 'bar/a.py'), ('foo/b.py', 'bar/b.py')]
84 files: A list of 2-tuples of (source, dest) paths.
86 A new list of 2-tuples, after the sources have been wildcard-expanded, and
87 the destinations have been changed from directories to filenames.
90 for in_file_glob
, out_file
in files
:
91 if out_file
.endswith('/'):
92 for in_file
in glob
.glob(in_file_glob
):
93 result
.append((in_file
,
94 os
.path
.join(out_file
, os
.path
.basename(in_file
))))
96 result
.append((in_file_glob
, out_file
))
100 def CopyFiles(files
):
101 """Given a list of 2-tuples (source, dest), copy each source file to a dest
105 files: A list of 2-tuples."""
106 for in_file
, out_file
in files
:
107 buildbot_common
.MakeDir(os
.path
.dirname(out_file
))
108 buildbot_common
.CopyFile(in_file
, out_file
)
111 def UpdateRevisionNumber(out_dir
, revision_number
):
112 """Update the sdk_tools bundle to have the given revision number.
114 This function finds all occurrences of the string "{REVISION}" in
115 sdk_update_main.py and replaces them with |revision_number|. The only
116 observable effect of this change should be that running:
120 will contain the new |revision_number|.
123 out_dir: The output directory containing the scripts to update.
124 revision_number: The revision number as an integer, or None to use the
125 current Chrome revision (as retrieved through svn/git).
127 if revision_number
is None:
128 revision_number
= build_version
.ChromeRevision()
130 SDK_UPDATE_MAIN
= os
.path
.join(out_dir
,
131 'nacl_sdk/sdk_tools/sdk_update_main.py')
133 contents
= open(SDK_UPDATE_MAIN
, 'r').read().replace(
134 '{REVISION}', str(revision_number
))
135 open(SDK_UPDATE_MAIN
, 'w').write(contents
)
138 def BuildUpdater(out_dir
, revision_number
=None):
139 """Build naclsdk.zip and sdk_tools.tgz in |out_dir|.
142 out_dir: The output directory.
143 revision_number: The revision number of this updater, as an integer. Or
144 None, to use the current Chrome revision."""
145 out_dir
= os
.path
.abspath(out_dir
)
147 # Build SDK directory
148 buildbot_common
.RemoveDir(os
.path
.join(out_dir
, 'nacl_sdk'))
150 updater_files
= MakeUpdaterFilesAbsolute(out_dir
)
151 updater_files
= GlobFiles(updater_files
)
153 CopyFiles(updater_files
)
154 UpdateRevisionNumber(out_dir
, revision_number
)
156 out_files
= [os
.path
.relpath(out_file
, out_dir
)
157 for _
, out_file
in updater_files
]
160 buildbot_common
.RemoveFile(os
.path
.join(out_dir
, 'nacl_sdk.zip'))
161 buildbot_common
.Run([sys
.executable
, oshelpers
.__file
__, 'zip',
162 'nacl_sdk.zip'] + out_files
,
165 # Tar of all files under nacl_sdk/sdk_tools
166 sdktoolsdir
= os
.path
.join('nacl_sdk', 'sdk_tools')
167 tarname
= os
.path
.join(out_dir
, 'sdk_tools.tgz')
168 files_to_tar
= [os
.path
.relpath(out_file
, sdktoolsdir
)
169 for out_file
in out_files
if out_file
.startswith(sdktoolsdir
)]
170 buildbot_common
.RemoveFile(tarname
)
171 buildbot_common
.Run([sys
.executable
, CYGTAR
, '-C',
172 os
.path
.join(out_dir
, sdktoolsdir
), '-czf', tarname
] + files_to_tar
)
173 sys
.stdout
.write('\n')
177 parser
= argparse
.ArgumentParser(description
=__doc__
)
178 parser
.add_argument('-o', '--out', help='output directory',
179 dest
='out_dir', default
=os
.path
.join(SRC_DIR
, 'out'))
180 parser
.add_argument('-r', '--revision', dest
='revision', default
=None,
181 help='revision number of this updater')
182 parser
.add_argument('-v', '--verbose', help='verbose output')
183 options
= parser
.parse_args(args
)
185 buildbot_common
.verbose
= options
.verbose
188 options
.revision
= int(options
.revision
)
189 BuildUpdater(options
.out_dir
, options
.revision
)
192 if __name__
== '__main__':
193 sys
.exit(main(sys
.argv
[1:]))