2012-04-19 20:31:46 +00:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# Copyright (c) 2012 The Chromium Embedded Framework Authors. All rights
|
|
|
|
# reserved. Use of this source code is governed by a BSD-style license
|
|
|
|
# that can be found in the LICENSE file.
|
|
|
|
"""
|
|
|
|
A simple utility function to merge pack resource files into a single resource file.
|
|
|
|
"""
|
|
|
|
|
2020-01-09 22:22:11 +02:00
|
|
|
from __future__ import absolute_import
|
|
|
|
from __future__ import print_function
|
2024-03-28 14:33:29 -04:00
|
|
|
from cef_parser import get_copyright
|
2012-04-19 20:31:46 +00:00
|
|
|
from file_util import *
|
|
|
|
import os
|
|
|
|
import re
|
|
|
|
import string
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
2024-12-09 15:20:44 -05:00
|
|
|
def _make_pack_header_segment(input, ids):
|
2012-04-19 20:31:46 +00:00
|
|
|
result = """
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
// From $FILE$:
|
|
|
|
"""
|
|
|
|
|
|
|
|
filename = os.path.split(input)[1]
|
|
|
|
result = result.replace('$FILE$', filename)
|
|
|
|
|
2024-12-09 15:20:44 -05:00
|
|
|
for name, id in ids.items():
|
|
|
|
result += "\n#define %s %s" % (name, id)
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def make_pack_header(output, all_files):
|
|
|
|
# header string
|
|
|
|
result = get_copyright(full=True, translator=False) + \
|
|
|
|
"""//
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// This file is generated by the make_pack_header.py tool.
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef $GUARD$
|
|
|
|
#define $GUARD$
|
|
|
|
#pragma once"""
|
|
|
|
|
|
|
|
# generate the file segments
|
|
|
|
for file, ids in all_files.items():
|
|
|
|
result += _make_pack_header_segment(file, ids)
|
|
|
|
|
|
|
|
# footer string
|
|
|
|
result += \
|
|
|
|
"""
|
|
|
|
|
|
|
|
#endif // $GUARD$
|
|
|
|
"""
|
|
|
|
|
|
|
|
# add the guard string
|
|
|
|
filename = os.path.split(output)[1]
|
|
|
|
guard = 'CEF_INCLUDE_' + filename.replace('.', '_').upper() + '_'
|
|
|
|
result = result.replace('$GUARD$', guard)
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def _get_cpp_var_name(output):
|
|
|
|
filename_no_ext = os.path.splitext(os.path.split(output)[1])[0]
|
|
|
|
|
|
|
|
# Convert to CamelCase after removing the 'cef_' prefix.
|
|
|
|
parts = filename_no_ext.split('_')[1:]
|
|
|
|
return "".join([p[0].upper() + p[1:] for p in parts])
|
|
|
|
|
|
|
|
|
|
|
|
def make_pack_inc(output, all_files):
|
|
|
|
var = 'IdNames' + _get_cpp_var_name(output)
|
|
|
|
|
|
|
|
result = get_copyright(full=False, translator=False) + \
|
|
|
|
"""//
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// This file was generated by the make_pack_header.py tool.
|
|
|
|
//
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
struct $var$ {
|
|
|
|
int id;
|
|
|
|
const char* const name;
|
|
|
|
};
|
|
|
|
|
|
|
|
const $var$ k$var$[] = {""".replace('$var$', var)
|
|
|
|
|
|
|
|
for file, ids in all_files.items():
|
|
|
|
result += '\n // From %s:' % file
|
|
|
|
for name, id in ids.items():
|
|
|
|
result += '\n {%s, "%s"},' % (id, name)
|
|
|
|
|
|
|
|
result += \
|
|
|
|
"""
|
|
|
|
};
|
|
|
|
|
|
|
|
const size_t k$var$Size = std::size(k$var$);
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
""".replace('$var$', var)
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def _get_defines(input, all_names):
|
2012-04-19 20:31:46 +00:00
|
|
|
contents = read_file(input)
|
|
|
|
|
2024-12-09 15:20:44 -05:00
|
|
|
ids = {}
|
|
|
|
|
2019-02-20 19:42:36 -05:00
|
|
|
# Format for Windows builds with resource whitelisting enabled [1]:
|
|
|
|
# #define IDR_RESOURCE_NAME (::ui::WhitelistedResource<12345>(), 12345)
|
|
|
|
# Format for other builds:
|
|
|
|
# #define IDR_RESOURCE_NAME 12345
|
|
|
|
# [1] See https://crbug.com/684788#c18
|
|
|
|
|
2024-04-12 15:53:51 +00:00
|
|
|
regex = r'#define\s([A-Za-z0-9_]{1,})\s+'
|
2019-02-20 19:42:36 -05:00
|
|
|
if contents.find('ui::WhitelistedResource') > 0:
|
2024-04-12 15:53:51 +00:00
|
|
|
regex += r'.*<'
|
|
|
|
regex += r'([0-9]{1,})'
|
2019-02-20 19:42:36 -05:00
|
|
|
|
2012-04-19 20:31:46 +00:00
|
|
|
# identify the defines in the file
|
2019-02-20 19:42:36 -05:00
|
|
|
p = re.compile(regex)
|
2012-04-19 20:31:46 +00:00
|
|
|
list = p.findall(contents)
|
|
|
|
for name, id in list:
|
2018-10-24 16:37:39 -04:00
|
|
|
# If the same define exists in multiple files add a suffix.
|
|
|
|
if name in all_names:
|
|
|
|
all_names[name] += 1
|
|
|
|
name += '_%d' % all_names[name]
|
|
|
|
else:
|
|
|
|
all_names[name] = 1
|
|
|
|
|
2024-12-09 15:20:44 -05:00
|
|
|
ids[name] = id
|
2012-04-19 20:31:46 +00:00
|
|
|
|
2024-12-09 15:20:44 -05:00
|
|
|
return ids
|
2012-04-19 20:31:46 +00:00
|
|
|
|
|
|
|
|
2024-12-09 15:20:44 -05:00
|
|
|
def write_pack_header(out_header_file, out_inc_file, inputs):
|
2012-04-19 20:31:46 +00:00
|
|
|
# sort the input files by name
|
2024-12-09 15:20:44 -05:00
|
|
|
inputs = sorted(inputs, key=lambda path: os.path.split(path)[1])
|
2012-04-19 20:31:46 +00:00
|
|
|
|
2018-10-24 16:37:39 -04:00
|
|
|
all_names = {}
|
2024-12-09 15:20:44 -05:00
|
|
|
all_files = {}
|
2018-10-24 16:37:39 -04:00
|
|
|
|
2012-04-19 20:31:46 +00:00
|
|
|
# generate the file segments
|
2024-12-09 15:20:44 -05:00
|
|
|
for file in inputs:
|
|
|
|
filename = os.path.split(file)[1]
|
|
|
|
assert not filename in all_files, filename
|
|
|
|
all_files[filename] = _get_defines(file, all_names)
|
2012-04-19 20:31:46 +00:00
|
|
|
|
2024-12-09 15:20:44 -05:00
|
|
|
out_file = os.path.abspath(out_header_file)
|
|
|
|
result = make_pack_header(out_file, all_files)
|
|
|
|
if not bool(result):
|
|
|
|
sys.stderr.write('Failed to create %s\n' % out_file)
|
|
|
|
sys.exit(1)
|
|
|
|
retval1 = write_file_if_changed(out_file, result)
|
2012-04-19 20:31:46 +00:00
|
|
|
|
2024-12-09 15:20:44 -05:00
|
|
|
out_file = os.path.abspath(out_inc_file)
|
|
|
|
result = make_pack_inc(out_file, all_files)
|
|
|
|
if not bool(result):
|
|
|
|
sys.stderr.write('Failed to create %s\n' % out_file)
|
|
|
|
sys.exit(1)
|
|
|
|
retval2 = write_file_if_changed(out_file, result)
|
2012-04-19 20:31:46 +00:00
|
|
|
|
2024-12-09 15:20:44 -05:00
|
|
|
return retval1 #or retval2
|
2017-05-28 15:04:18 +02:00
|
|
|
|
2012-04-19 20:31:46 +00:00
|
|
|
|
|
|
|
def main(argv):
|
2024-12-09 15:20:44 -05:00
|
|
|
if len(argv) < 4:
|
|
|
|
print(
|
|
|
|
"Usage:\n %s <output_header_file> <output_inc_file> <input_file1> [input_file2] ... "
|
|
|
|
% argv[0])
|
2012-04-19 20:31:46 +00:00
|
|
|
sys.exit(-1)
|
2024-12-09 15:20:44 -05:00
|
|
|
write_pack_header(argv[1], argv[2], argv[3:])
|
2012-04-19 20:31:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
if '__main__' == __name__:
|
|
|
|
main(sys.argv)
|