cef/tools/make_pack_header.py
Marshall Greenblatt d65483ae16 Update cef_api_hash.h at build time if necessary (fixes issue #2922)
The cef_api_hash.h file was previously only updated when the translator tool
was run manually. Forgetting to run the translator tool after changing
include/internal/cef_types*.h files would result in cef_parser.py
incorrectly computing the CEF minor version number for future builds. By
updating this file automatically at build time the number of errors should be
reduced.
2020-04-30 17:52:10 -04:00

135 lines
4.1 KiB
Python

#!/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.
"""
from __future__ import absolute_import
from __future__ import print_function
from date_util import *
from file_util import *
import os
import re
import string
import sys
def MakeFileSegment(input, all_names):
result = """
// ---------------------------------------------------------------------------
// From $FILE$:
"""
filename = os.path.split(input)[1]
result = result.replace('$FILE$', filename)
contents = read_file(input)
# 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,})'
# identify the defines in the file
p = re.compile(regex)
list = p.findall(contents)
for name, id in list:
# 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
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])
all_names = {}
# generate the file segments
for file in input:
result += MakeFileSegment(file, all_names)
# 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]
guard = 'CEF_INCLUDE_' + filename.replace('.', '_').upper() + '_'
result = result.replace('$GUARD$', guard)
write_file_if_changed(output, result)
def main(argv):
if len(argv) < 3:
print(("Usage:\n %s <output_filename> <input_file1> [input_file2] ... " %
argv[0]))
sys.exit(-1)
MakeFile(argv[1], argv[2:])
if '__main__' == __name__:
main(sys.argv)