cef/tools/make_colorids_header.py
2024-04-03 12:09:22 -04:00

168 lines
4.2 KiB
Python

#!/usr/bin/env python
# Copyright (c) 2024 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 color enum files into a single enum file.
"""
from __future__ import absolute_import
from __future__ import print_function
from cef_parser import get_copyright
from file_util import *
import os
import re
import string
import sys
def MakeFileSegment(input):
result = """
// ---------------------------------------------------------------------------
// From $FILE$:
"""
result = result.replace('$FILE$', input.replace('../../', ''))
contents = read_file(input)
# Extract the portion that defines the enum values.
start_str = "\n// clang-format off"
start_pos = contents.find(start_str)
assert start_pos > 0, input
end_pos1 = contents.find("\n#include", start_pos)
end_pos2 = contents.find("\n// clang-format on", start_pos)
end_pos = min(end_pos1, end_pos2)
assert end_pos > start_pos, input
extract = contents[start_pos + len(start_str):end_pos].strip()
return result + extract
def MakeFile(output, input):
# Header string.
result = get_copyright(full=True, translator=False) + \
"""//
// ---------------------------------------------------------------------------
//
// This file is generated by the make_colorids_header.py tool.
//
#ifndef $GUARD$
#define $GUARD$
#pragma once
#include "include/base/cef_build.h"
"""
# Generate the file segments.
segments = ''
for file in input:
segments += MakeFileSegment(file)
# Extract the unique names of all defines.
p = re.compile('#define\s([A-Za-z0-9_]{1,})\s')
all_defines = sorted(set(p.findall(segments)))
undefines = "\n".join(["#undef %s" % define for define in all_defines])
# Undefine all defines that will be used in this header.
contents = """
// Undefine the macros that will be defined in this file.
// This avoids previous definition conflicts with Chromium.
""" + undefines + segments + """
#include "include/base/internal/cef_color_id_macros.inc"
#ifdef __cplusplus
extern "C" {
#endif
///
/// All input, intermediary, and output colors known to CEF/Chromium.
/// Clients can optionally extend this enum with additional values.
/// Clients define enum values from kChromeColorsEnd. Values named
/// beginning with "kColor" represent the actual colors; the rest are
/// markers.
///
typedef enum {
kUiColorsStart = 0,
COLOR_IDS
kUiColorsEnd,
kComponentsColorsStart = kUiColorsEnd,
COMPONENTS_COLOR_IDS
kComponentsColorsEnd,
kChromeColorsStart = kComponentsColorsEnd,
CHROME_COLOR_IDS
// Clients must start custom color IDs from this value.
kChromeColorsEnd,
// Clients must not assign IDs larger than this value. This is used to
// verify that color IDs and color set IDs are not interchanged.
kUiColorsLast = 0xffff
} cef_color_id_t;
#ifdef __cplusplus
}
#endif
// Note that this second include is not redundant. The second inclusion of the
// .inc file serves to undefine the macros the first inclusion defined.
#include "include/base/internal/cef_color_id_macros.inc"
// Undefine the macros that were defined in this file.
"""
# Undefine all defines that were used in this header.
contents += undefines
replacements = (
# Update platform defines.
('BUILDFLAG(IS_', 'defined(OS_'),
('defined(USE_AURA)', '!defined(OS_MAC)'),
# Update enum value style.
('kColor', 'CEF_Color'),
('kUiColors', 'CEF_UiColors'),
('kComponentsColors', 'CEF_ComponentsColors'),
('kChromeColors', 'CEF_ChromeColors'))
for find, replace in replacements:
contents = contents.replace(find, replace)
result += contents
# Add 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)
write_file_if_changed(output, result)
def main(argv):
if len(argv) < 3:
print(("Usage:\n %s <output_file> <input_file1> [input_file2] ... " %
argv[0]))
sys.exit(-1)
MakeFile(argv[1], argv[2:])
if '__main__' == __name__:
main(sys.argv)