mirror of
https://github.com/dart-lang/sdk
synced 2024-09-20 23:51:23 +00:00
cc0f297703
- Gzip the Observatory assets tar file before encoding into the C++ source file. Shrinks observatory_assets.cc from ~21MB to ~4MB. Fixes #25276 R=rmacnak@google.com Review URL: https://codereview.chromium.org/1534523002 .
161 lines
5.1 KiB
Python
161 lines
5.1 KiB
Python
# Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
|
# for details. All rights reserved. Use of this source code is governed by a
|
|
# BSD-style license that can be found in the LICENSE file.
|
|
#
|
|
# This python script creates a tar archive and a C++ source file which contains
|
|
# the tar archive as an array of bytes.
|
|
|
|
import os
|
|
import sys
|
|
from os.path import join, splitext
|
|
import time
|
|
from optparse import OptionParser
|
|
from datetime import date
|
|
import tarfile
|
|
import tempfile
|
|
|
|
def makeArchive(tar_path, client_root, compress, files):
|
|
mode_string = 'w'
|
|
if compress:
|
|
mode_string = 'w:gz'
|
|
tar = tarfile.open(tar_path, mode=mode_string)
|
|
for input_file_name in files:
|
|
# Chop off client_root.
|
|
archive_file_name = input_file_name[ len(client_root) : ]
|
|
# Replace back slash with forward slash. So we do not have Windows paths.
|
|
archive_file_name = archive_file_name.replace("\\", "/")
|
|
# Open input file and add it to the archive.
|
|
with open(input_file_name, 'rb') as input_file:
|
|
tarInfo = tarfile.TarInfo(name=archive_file_name)
|
|
input_file.seek(0,2)
|
|
tarInfo.size = input_file.tell()
|
|
input_file.seek(0)
|
|
tar.addfile(tarInfo, fileobj=input_file)
|
|
tar.close()
|
|
|
|
def writeCCFile(output_file,
|
|
outer_namespace,
|
|
inner_namespace,
|
|
name,
|
|
tar_archive,
|
|
):
|
|
cc_text = '''
|
|
// Copyright (c) %d, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
''' % date.today().year
|
|
cc_text += '''
|
|
|
|
#if defined(_WIN32)
|
|
typedef unsigned __int8 uint8_t;
|
|
#else
|
|
#include <inttypes.h>
|
|
#include <stdint.h>
|
|
#endif
|
|
#include <stddef.h>
|
|
|
|
'''
|
|
cc_text += 'namespace %s {\n' % outer_namespace
|
|
if inner_namespace != None:
|
|
cc_text += 'namespace %s {\n' % inner_namespace
|
|
cc_text += '\n\n'
|
|
# Write the archive.
|
|
cc_text += 'static const uint8_t %s_[] = {\n ' % name
|
|
lineCounter = 0
|
|
for byte in tar_archive:
|
|
cc_text += r" %d," % ord(byte)
|
|
lineCounter += 1
|
|
if lineCounter == 10:
|
|
cc_text += '\n '
|
|
lineCounter = 0
|
|
if lineCounter != 0:
|
|
cc_text += '\n '
|
|
cc_text += '\n};\n'
|
|
cc_text += '\nunsigned int %s_len = %d;\n' % (name, len(tar_archive))
|
|
cc_text += '\nconst uint8_t* %s = %s_;\n\n' % (name, name)
|
|
if inner_namespace != None:
|
|
cc_text += '} // namespace %s\n' % inner_namespace
|
|
cc_text += '} // namespace %s\n' % outer_namespace
|
|
|
|
open(output_file, 'w').write(cc_text)
|
|
|
|
def main(args):
|
|
try:
|
|
# Parse input.
|
|
parser = OptionParser()
|
|
parser.add_option("--output",
|
|
action="store", type="string",
|
|
help="output file name")
|
|
parser.add_option("--tar_output",
|
|
action="store", type="string",
|
|
help="tar output file name")
|
|
parser.add_option("--outer_namespace",
|
|
action="store", type="string",
|
|
help="outer C++ namespace",
|
|
default="dart")
|
|
parser.add_option("--inner_namespace",
|
|
action="store", type="string",
|
|
help="inner C++ namespace",
|
|
default="bin")
|
|
parser.add_option("--name",
|
|
action="store", type="string",
|
|
help="name of tar archive symbol")
|
|
parser.add_option("--compress", action="store_true", default=False)
|
|
parser.add_option("--client_root",
|
|
action="store", type="string",
|
|
help="root directory client resources")
|
|
|
|
(options, args) = parser.parse_args()
|
|
if not options.output:
|
|
sys.stderr.write('--output not specified\n')
|
|
return -1
|
|
if not options.tar_output:
|
|
sys.stderr.write('--tar_output not specified\n')
|
|
return -1
|
|
if not options.name:
|
|
sys.stderr.write('--name not specified\n')
|
|
return -1
|
|
if not options.client_root:
|
|
sys.stderr.write('--client_root not specified')
|
|
return -1
|
|
|
|
files = [ ]
|
|
|
|
for dirname, dirnames, filenames in os.walk(options.client_root):
|
|
# strip out all dot files.
|
|
filenames = [f for f in filenames if not f[0] == '.']
|
|
dirnames[:] = [d for d in dirnames if not d[0] == '.']
|
|
for f in filenames:
|
|
src_path = os.path.join(dirname, f)
|
|
if (os.path.isdir(src_path)):
|
|
continue
|
|
files.append(src_path)
|
|
|
|
# Write out archive.
|
|
makeArchive(options.tar_output,
|
|
options.client_root,
|
|
options.compress,
|
|
files)
|
|
|
|
# Read it back in.
|
|
with open(options.tar_output, 'rb') as tar_file:
|
|
tar_archive = tar_file.read()
|
|
|
|
# Write CC file.
|
|
writeCCFile(options.output,
|
|
options.outer_namespace,
|
|
options.inner_namespace,
|
|
options.name,
|
|
tar_archive)
|
|
return 0
|
|
|
|
except Exception, inst:
|
|
sys.stderr.write('create_resources.py exception\n')
|
|
sys.stderr.write(str(inst))
|
|
sys.stderr.write('\n')
|
|
return -1
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(main(sys.argv))
|