mirror of
https://github.com/dart-lang/sdk
synced 2024-11-02 12:24:24 +00:00
0fae540223
Fuchsia provides pthreads so the linux implementation almost works except that fuchsia does not (currently) provide the clock_gettime clock for CLOCK_THREAD_CPUTIME_ID. Review URL: https://codereview.chromium.org/2154453002 .
172 lines
5.9 KiB
Python
Executable file
172 lines
5.9 KiB
Python
Executable file
#!/usr/bin/env python
|
|
# Copyright (c) 2013, 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 string literals in a C++ source file from a C++
|
|
# source template and one or more resource files.
|
|
|
|
import os
|
|
import sys
|
|
from os.path import join, splitext
|
|
import time
|
|
from optparse import OptionParser
|
|
import re
|
|
from datetime import date
|
|
import zlib
|
|
|
|
def makeResources(root_dir, client_dir, input_files, table_name, compress, no_compress_extensions):
|
|
result = ''
|
|
resources = []
|
|
|
|
# Write each file's contents as a byte string constant.
|
|
for resource_file in input_files:
|
|
if root_dir and resource_file.startswith(root_dir):
|
|
resource_file_name = resource_file[ len(root_dir) : ]
|
|
elif client_dir and resource_file.startswith(client_dir):
|
|
resource_file_name = resource_file[ len(client_dir) : ]
|
|
else:
|
|
resource_file_name = resource_file
|
|
_, ext = os.path.splitext(resource_file)
|
|
if ext in no_compress_extensions:
|
|
# Force no compression for files of this extension.
|
|
compress = None
|
|
resource_url = '/%s' % resource_file_name
|
|
result += '// %s\n' % resource_file
|
|
result += 'const char '
|
|
resource_name = re.sub(r'(/|\.|-|\\)', '_', resource_file_name) + '_'
|
|
result += resource_name
|
|
result += '[] = {\n '
|
|
fileHandle = open(resource_file, 'rb')
|
|
lineCounter = 0
|
|
file_contents = fileHandle.read()
|
|
if compress:
|
|
file_contents = zlib.compress(file_contents)
|
|
for byte in file_contents:
|
|
result += r" '\x%02x'," % ord(byte)
|
|
lineCounter += 1
|
|
if lineCounter == 10:
|
|
result += '\n '
|
|
lineCounter = 0
|
|
if lineCounter != 0:
|
|
result += '\n '
|
|
result += ' 0\n};\n\n'
|
|
resource_url_scrubbed = re.sub(r'\\', '/', resource_url)
|
|
resources.append(
|
|
(resource_url_scrubbed, resource_name, len(file_contents)));
|
|
|
|
# Write the resource table.
|
|
result += 'ResourcesEntry __%s_resources_[] = ' % table_name
|
|
result += '{\n'
|
|
for res in resources:
|
|
result += ' { "%s", %s, %d },\n' % res
|
|
result += ' { 0, 0, 0 },\n'
|
|
result += '};\n\n'
|
|
return result
|
|
|
|
|
|
def makeFile(output_file, root_dir, client_dir, input_files, outer_namespace,
|
|
inner_namespace, table_name, compress, no_compress_extensions):
|
|
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 += 'namespace %s {\n' % outer_namespace
|
|
if inner_namespace != None:
|
|
cc_text += 'namespace %s {\n' % inner_namespace
|
|
cc_text += '''
|
|
struct ResourcesEntry {
|
|
const char* path_;
|
|
const char* resource_;
|
|
int length_;
|
|
};
|
|
|
|
'''
|
|
cc_text += makeResources(root_dir, client_dir, input_files, table_name,
|
|
compress, no_compress_extensions)
|
|
cc_text += '\n'
|
|
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)
|
|
return True
|
|
|
|
|
|
def main(args):
|
|
try:
|
|
# Parse input.
|
|
parser = OptionParser()
|
|
parser.add_option("--output",
|
|
action="store", type="string",
|
|
help="output file name")
|
|
parser.add_option("--root_prefix",
|
|
action="store", type="string",
|
|
help="root directory for resources")
|
|
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")
|
|
parser.add_option("--table_name",
|
|
action="store", type="string",
|
|
help="name of table")
|
|
parser.add_option("--client_root",
|
|
action="store", type="string",
|
|
help="root directory client resources")
|
|
parser.add_option("--compress",
|
|
action="store_true",
|
|
help="zlib compress resources")
|
|
parser.add_option("--no_compress_extensions",
|
|
action="append",
|
|
default=['.dart'],
|
|
help="file extensions that should not be compressed.")
|
|
|
|
(options, args) = parser.parse_args()
|
|
if not options.output:
|
|
sys.stderr.write('--output not specified\n')
|
|
return -1
|
|
if not options.table_name:
|
|
sys.stderr.write('--table_name not specified\n')
|
|
return -1
|
|
if len(args) == 0:
|
|
sys.stderr.write('No input files specified\n')
|
|
return -1
|
|
|
|
files = [ ]
|
|
|
|
if options.client_root != None:
|
|
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
|
|
# Skip devtools version
|
|
if (src_path.find("index_devtools") != -1):
|
|
continue
|
|
files.append(src_path)
|
|
|
|
for arg in args:
|
|
files.append(arg)
|
|
|
|
if not makeFile(options.output, options.root_prefix, options.client_root,
|
|
files, options.outer_namespace, options.inner_namespace,
|
|
options.table_name, options.compress,
|
|
options.no_compress_extensions):
|
|
return -1
|
|
|
|
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))
|