blob: e7d77888344cbee40ae250c40d49fedfa7b8ef78 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
'''Bundles the Blimp target and its runtime dependencies into a tarball.
The created bundle can be passed as input to docker build. E.g.
docker build - < ../../out-linux/Debug/blimp_engine_deps.tar.gz
'''
import argparse
import os
import subprocess
import sys
def ReadDependencies(manifest, relative_path):
"""Returns a list of dependencies based on the specified manifest file.
The returned dependencies will be made relative to |relative_path| and
normalized.
:raises IOError: if the manifest could not be read.
"""
dependency_list = []
with open(manifest) as f:
for line in f.readlines():
# Strip comments.
dependency = line.partition('#')[0].strip()
# Ignore empty strings.
if dependency:
dependency = os.path.normpath(os.path.join(relative_path, dependency))
dependency_list.append(dependency)
return dependency_list
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--build-dir',
help=('build output directory (e.g. out/Debug)'),
required=True,
metavar='DIR')
parser.add_argument('--filelist',
help=('optional space separated list of files (e.g. '
'Dockerfile and startup script) to add to the '
'bundle'),
required=False,
metavar='FILE',
nargs='*')
parser.add_argument('--manifest',
help=('file listing the set of files to include in '
'the bundle'),
required=True)
parser.add_argument('--output',
help=('name and path of bundle to create'),
required=True,
metavar='FILE')
parser.add_argument('--tar-contents-rooted-in',
help=('optional path prefix to use inside the resulting '
'tar file'),
required=False,
metavar='DIR')
args = parser.parse_args()
dependencies_path = args.build_dir
if args.tar_contents_rooted_in:
dependencies_path = args.tar_contents_rooted_in
relative_path = os.path.relpath(args.build_dir, dependencies_path)
dependency_list = ReadDependencies(args.manifest, relative_path)
try:
env = os.environ.copy()
# Use fastest possible mode when gzipping.
env["GZIP"] = "-1"
subprocess_args = [
"tar",
"-zcf", args.output,
# Ensure tarball content group permissions are appropriately set for
# use as part of a "docker build". That is group readable with
# executable files also being group executable.
"--mode=g+rX",
"-C", dependencies_path] + dependency_list
for f in args.filelist:
dirname, basename = os.path.split(f)
subprocess_args.extend(["-C", dirname, basename])
subprocess.check_output(
subprocess_args,
# Redirect stderr to stdout, so that its output is captured.
stderr=subprocess.STDOUT,
env=env)
except subprocess.CalledProcessError as e:
print >> sys.stderr, "Failed to create tarball:"
print >> sys.stderr, e.output
sys.exit(1)
if __name__ == "__main__":
main()