v8/tools/gen-v8-gn.py
Dan Elphick 553def5ffa [build] Add header for externally-visible defines
Adds a v8-gn.h file containing defines that are used in the
externally-visible headers files like v8.h. This must be included by
include/v8config.h which includes it if the GN flag
v8_generate_external_defines_header is on. (Currently off by default).

To enable the v8config.h file to be included without the other v8
headers (as required by cppgc), this moves it into its own header set
which sets up the include path correctly.

Also updates some headers to ensure v8config.h is included before using
externally-visible defines.

Bug: v8:11292
Change-Id: I5be634f4adfbef144bf684071461d64f1cb30899
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2608212
Commit-Queue: Dan Elphick <delphick@chromium.org>
Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: Ross McIlroy <rmcilroy@chromium.org>
Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#72140}
2021-01-18 16:57:26 +00:00

81 lines
2.5 KiB
Python
Executable File

#!/usr/bin/env python
# Copyright 2021 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
from io import BytesIO
import os
import sys
def parse_args():
global args
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output', type=str, action='store',
help='Location of header file to generate')
parser.add_argument('-p', '--positive-define', type=str, action='append',
help='Externally visibile positive definition')
parser.add_argument('-n', '--negative-define', type=str, action='append',
help='Externally visibile negative definition')
args = parser.parse_args()
def generate_positive_definition(out, define):
out.write('''
#ifndef {define}
#define {define} 1
#else
#if {define} != 1
#error {define} defined but not set to 1
#endif
#endif // {define}
'''.format(define=define))
def generate_negative_definition(out, define):
out.write('''
#ifdef {define}
#error {define} is defined but is disabled by V8's GN build arguments
#endif // {define}
'''.format(define=define))
def generate_header(out):
out.write('''// AUTOMATICALLY GENERATED. DO NOT EDIT.\n
// The following definitions were used when V8 itself was built, but also appear
// in the externally-visible header files and so must be included by any
// embedder. This will be done automatically if V8_GN_HEADER is defined.
// Ready-compiled distributions of V8 will need to provide this generated header
// along with the other headers in include.
// This header must be stand-alone because it is used across targets without
// introducing dependencies. It should only be included via v8config.h.
''')
if args.positive_define:
for define in args.positive_define:
generate_positive_definition(out, define)
if args.negative_define:
for define in args.negative_define:
generate_negative_definition(out, define)
def main():
parse_args()
header_stream = BytesIO("")
generate_header(header_stream)
contents = header_stream.getvalue()
if args.output:
# Check if the contents has changed before writing so we don't cause build
# churn.
old_contents = None
if os.path.exists(args.output):
with open(args.output, 'r') as f:
old_contents = f.read()
if old_contents != contents:
with open(args.output, 'w') as f:
f.write(contents)
else:
print(contents)
if __name__ == '__main__':
main()