2012-04-19 22:31:46 +02: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 21:22:11 +01:00
|
|
|
from __future__ import absolute_import
|
|
|
|
from __future__ import print_function
|
2012-04-19 22:31:46 +02:00
|
|
|
from date_util import *
|
|
|
|
from file_util import *
|
|
|
|
import os
|
|
|
|
import re
|
|
|
|
import string
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
2018-10-24 22:37:39 +02:00
|
|
|
def MakeFileSegment(input, all_names):
|
2012-04-19 22:31:46 +02:00
|
|
|
result = """
|
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
// From $FILE$:
|
|
|
|
"""
|
|
|
|
|
|
|
|
filename = os.path.split(input)[1]
|
|
|
|
result = result.replace('$FILE$', filename)
|
|
|
|
|
|
|
|
contents = read_file(input)
|
|
|
|
|
2019-02-21 01:42:36 +01: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
|
|
|
|
|
|
|
|
regex = '#define\s([A-Za-z0-9_]{1,})\s'
|
|
|
|
if contents.find('ui::WhitelistedResource') > 0:
|
|
|
|
regex += '.*<'
|
|
|
|
regex += '([0-9]{1,})'
|
|
|
|
|
2012-04-19 22:31:46 +02:00
|
|
|
# identify the defines in the file
|
2019-02-21 01:42:36 +01:00
|
|
|
p = re.compile(regex)
|
2012-04-19 22:31:46 +02:00
|
|
|
list = p.findall(contents)
|
|
|
|
for name, id in list:
|
2018-10-24 22:37:39 +02: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
|
|
|
|
|
2012-04-19 22:31:46 +02:00
|
|
|
result += "\n#define %s %s" % (name, id)
|
|
|
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def MakeFile(output, input):
|
|
|
|
# header string
|
|
|
|
result = \
|
|
|
|
"""// Copyright (c) $YEAR$ Marshall A. Greenblatt. All rights reserved.
|
|
|
|
//
|
|
|
|
// Redistribution and use in source and binary forms, with or without
|
|
|
|
// modification, are permitted provided that the following conditions are
|
|
|
|
// met:
|
|
|
|
//
|
|
|
|
// * Redistributions of source code must retain the above copyright
|
|
|
|
// notice, this list of conditions and the following disclaimer.
|
|
|
|
// * Redistributions in binary form must reproduce the above
|
|
|
|
// copyright notice, this list of conditions and the following disclaimer
|
|
|
|
// in the documentation and/or other materials provided with the
|
|
|
|
// distribution.
|
|
|
|
// * Neither the name of Google Inc. nor the name Chromium Embedded
|
|
|
|
// Framework nor the names of its contributors may be used to endorse
|
|
|
|
// or promote products derived from this software without specific prior
|
|
|
|
// written permission.
|
|
|
|
//
|
|
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
//
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// This file is generated by the make_pack_header.py tool.
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef $GUARD$
|
|
|
|
#define $GUARD$
|
|
|
|
#pragma once"""
|
|
|
|
|
|
|
|
# sort the input files by name
|
|
|
|
input = sorted(input, key=lambda path: os.path.split(path)[1])
|
|
|
|
|
2018-10-24 22:37:39 +02:00
|
|
|
all_names = {}
|
|
|
|
|
2012-04-19 22:31:46 +02:00
|
|
|
# generate the file segments
|
|
|
|
for file in input:
|
2018-10-24 22:37:39 +02:00
|
|
|
result += MakeFileSegment(file, all_names)
|
2012-04-19 22:31:46 +02:00
|
|
|
|
|
|
|
# footer string
|
|
|
|
result += \
|
|
|
|
"""
|
|
|
|
|
|
|
|
#endif // $GUARD$
|
|
|
|
"""
|
|
|
|
|
|
|
|
# add the copyright year
|
|
|
|
result = result.replace('$YEAR$', get_year())
|
|
|
|
# add the guard string
|
|
|
|
filename = os.path.split(output)[1]
|
2020-01-09 21:22:11 +01:00
|
|
|
guard = 'CEF_INCLUDE_' + filename.replace('.', '_').upper() + '_'
|
2012-04-19 22:31:46 +02:00
|
|
|
result = result.replace('$GUARD$', guard)
|
|
|
|
|
2012-04-19 23:18:22 +02:00
|
|
|
if path_exists(output):
|
|
|
|
old_contents = read_file(output)
|
|
|
|
else:
|
|
|
|
old_contents = ''
|
|
|
|
|
2012-04-19 22:31:46 +02:00
|
|
|
if (result != old_contents):
|
|
|
|
write_file(output, result)
|
2017-05-28 15:04:18 +02:00
|
|
|
sys.stdout.write('File ' + output + ' updated.\n')
|
2012-04-19 22:31:46 +02:00
|
|
|
else:
|
2017-05-28 15:04:18 +02:00
|
|
|
sys.stdout.write('File ' + output + ' is already up to date.\n')
|
|
|
|
|
2012-04-19 22:31:46 +02:00
|
|
|
|
|
|
|
def main(argv):
|
|
|
|
if len(argv) < 3:
|
2020-01-09 21:22:11 +01:00
|
|
|
print(("Usage:\n %s <output_filename> <input_file1> [input_file2] ... " %
|
|
|
|
argv[0]))
|
2012-04-19 22:31:46 +02:00
|
|
|
sys.exit(-1)
|
|
|
|
MakeFile(argv[1], argv[2:])
|
|
|
|
|
|
|
|
|
|
|
|
if '__main__' == __name__:
|
|
|
|
main(sys.argv)
|