xref: /aosp_15_r20/external/libchrome/build/write_buildflag_header.py (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker#!/usr/bin/env python
2*635a8641SAndroid Build Coastguard Worker# Copyright 2015 The Chromium Authors. All rights reserved.
3*635a8641SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*635a8641SAndroid Build Coastguard Worker# found in the LICENSE file.
5*635a8641SAndroid Build Coastguard Worker
6*635a8641SAndroid Build Coastguard Worker# This writes headers for build flags. See buildflag_header.gni for usage of
7*635a8641SAndroid Build Coastguard Worker# this system as a whole.
8*635a8641SAndroid Build Coastguard Worker#
9*635a8641SAndroid Build Coastguard Worker# The parameters are passed in a response file so we don't have to worry
10*635a8641SAndroid Build Coastguard Worker# about command line lengths. The name of the response file is passed on the
11*635a8641SAndroid Build Coastguard Worker# command line.
12*635a8641SAndroid Build Coastguard Worker#
13*635a8641SAndroid Build Coastguard Worker# The format of the response file is:
14*635a8641SAndroid Build Coastguard Worker#    [--flags <list of one or more flag values>]
15*635a8641SAndroid Build Coastguard Worker
16*635a8641SAndroid Build Coastguard Workerimport optparse
17*635a8641SAndroid Build Coastguard Workerimport os
18*635a8641SAndroid Build Coastguard Workerimport shlex
19*635a8641SAndroid Build Coastguard Workerimport sys
20*635a8641SAndroid Build Coastguard Worker
21*635a8641SAndroid Build Coastguard Worker
22*635a8641SAndroid Build Coastguard Workerclass Options:
23*635a8641SAndroid Build Coastguard Worker  def __init__(self, output, rulename, header_guard, flags):
24*635a8641SAndroid Build Coastguard Worker    self.output = output
25*635a8641SAndroid Build Coastguard Worker    self.rulename = rulename
26*635a8641SAndroid Build Coastguard Worker    self.header_guard = header_guard
27*635a8641SAndroid Build Coastguard Worker    self.flags = flags
28*635a8641SAndroid Build Coastguard Worker
29*635a8641SAndroid Build Coastguard Worker
30*635a8641SAndroid Build Coastguard Workerdef GetOptions():
31*635a8641SAndroid Build Coastguard Worker  parser = optparse.OptionParser()
32*635a8641SAndroid Build Coastguard Worker  parser.add_option('--output', help="Output header name inside --gen-dir.")
33*635a8641SAndroid Build Coastguard Worker  parser.add_option('--rulename',
34*635a8641SAndroid Build Coastguard Worker                    help="Helpful name of build rule for including in the " +
35*635a8641SAndroid Build Coastguard Worker                         "comment at the top of the file.")
36*635a8641SAndroid Build Coastguard Worker  parser.add_option('--gen-dir',
37*635a8641SAndroid Build Coastguard Worker                    help="Path to root of generated file directory tree.")
38*635a8641SAndroid Build Coastguard Worker  parser.add_option('--definitions',
39*635a8641SAndroid Build Coastguard Worker                    help="Name of the response file containing the flags.")
40*635a8641SAndroid Build Coastguard Worker  cmdline_options, cmdline_flags = parser.parse_args()
41*635a8641SAndroid Build Coastguard Worker
42*635a8641SAndroid Build Coastguard Worker  # Compute header guard by replacing some chars with _ and upper-casing.
43*635a8641SAndroid Build Coastguard Worker  header_guard = cmdline_options.output.upper()
44*635a8641SAndroid Build Coastguard Worker  header_guard = \
45*635a8641SAndroid Build Coastguard Worker      header_guard.replace('/', '_').replace('\\', '_').replace('.', '_')
46*635a8641SAndroid Build Coastguard Worker  header_guard += '_'
47*635a8641SAndroid Build Coastguard Worker
48*635a8641SAndroid Build Coastguard Worker  # The actual output file is inside the gen dir.
49*635a8641SAndroid Build Coastguard Worker  output = os.path.join(cmdline_options.gen_dir, cmdline_options.output)
50*635a8641SAndroid Build Coastguard Worker
51*635a8641SAndroid Build Coastguard Worker  # Definition file in GYP is newline separated, in GN they are shell formatted.
52*635a8641SAndroid Build Coastguard Worker  # shlex can parse both of these.
53*635a8641SAndroid Build Coastguard Worker  with open(cmdline_options.definitions, 'r') as def_file:
54*635a8641SAndroid Build Coastguard Worker    defs = shlex.split(def_file.read())
55*635a8641SAndroid Build Coastguard Worker  flags_index = defs.index('--flags')
56*635a8641SAndroid Build Coastguard Worker
57*635a8641SAndroid Build Coastguard Worker  # Everything after --flags are flags. true/false are remapped to 1/0,
58*635a8641SAndroid Build Coastguard Worker  # everything else is passed through.
59*635a8641SAndroid Build Coastguard Worker  flags = []
60*635a8641SAndroid Build Coastguard Worker  for flag in defs[flags_index + 1 :]:
61*635a8641SAndroid Build Coastguard Worker    equals_index = flag.index('=')
62*635a8641SAndroid Build Coastguard Worker    key = flag[:equals_index]
63*635a8641SAndroid Build Coastguard Worker    value = flag[equals_index + 1:]
64*635a8641SAndroid Build Coastguard Worker
65*635a8641SAndroid Build Coastguard Worker    # Canonicalize and validate the value.
66*635a8641SAndroid Build Coastguard Worker    if value == 'true':
67*635a8641SAndroid Build Coastguard Worker      value = '1'
68*635a8641SAndroid Build Coastguard Worker    elif value == 'false':
69*635a8641SAndroid Build Coastguard Worker      value = '0'
70*635a8641SAndroid Build Coastguard Worker    flags.append((key, str(value)))
71*635a8641SAndroid Build Coastguard Worker
72*635a8641SAndroid Build Coastguard Worker  return Options(output=output,
73*635a8641SAndroid Build Coastguard Worker                 rulename=cmdline_options.rulename,
74*635a8641SAndroid Build Coastguard Worker                 header_guard=header_guard,
75*635a8641SAndroid Build Coastguard Worker                 flags=flags)
76*635a8641SAndroid Build Coastguard Worker
77*635a8641SAndroid Build Coastguard Worker
78*635a8641SAndroid Build Coastguard Workerdef WriteHeader(options):
79*635a8641SAndroid Build Coastguard Worker  with open(options.output, 'w') as output_file:
80*635a8641SAndroid Build Coastguard Worker    output_file.write("// Generated by build/write_buildflag_header.py\n")
81*635a8641SAndroid Build Coastguard Worker    if options.rulename:
82*635a8641SAndroid Build Coastguard Worker      output_file.write('// From "' + options.rulename + '"\n')
83*635a8641SAndroid Build Coastguard Worker
84*635a8641SAndroid Build Coastguard Worker    output_file.write('\n#ifndef %s\n' % options.header_guard)
85*635a8641SAndroid Build Coastguard Worker    output_file.write('#define %s\n\n' % options.header_guard)
86*635a8641SAndroid Build Coastguard Worker    output_file.write('#include "build/buildflag.h"\n\n')
87*635a8641SAndroid Build Coastguard Worker
88*635a8641SAndroid Build Coastguard Worker    for pair in options.flags:
89*635a8641SAndroid Build Coastguard Worker      output_file.write('#define BUILDFLAG_INTERNAL_%s() (%s)\n' % pair)
90*635a8641SAndroid Build Coastguard Worker
91*635a8641SAndroid Build Coastguard Worker    output_file.write('\n#endif  // %s\n' % options.header_guard)
92*635a8641SAndroid Build Coastguard Worker
93*635a8641SAndroid Build Coastguard Worker
94*635a8641SAndroid Build Coastguard Workeroptions = GetOptions()
95*635a8641SAndroid Build Coastguard WorkerWriteHeader(options)
96