xref: /aosp_15_r20/external/perfetto/gn/write_buildflag_header.py (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2019 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker#
4*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker#
8*6dbdd20aSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker#
10*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker
16*6dbdd20aSAndroid Build Coastguard Worker# This writes headers for build flags. See the gen_buildflags target in
17*6dbdd20aSAndroid Build Coastguard Worker# /gn/BUILD.gn for usage.
18*6dbdd20aSAndroid Build Coastguard Worker#
19*6dbdd20aSAndroid Build Coastguard Worker# The parameters are passed in a response file so we don't have to worry
20*6dbdd20aSAndroid Build Coastguard Worker# about command line lengths. The name of the response file is passed on the
21*6dbdd20aSAndroid Build Coastguard Worker# command line.
22*6dbdd20aSAndroid Build Coastguard Worker#
23*6dbdd20aSAndroid Build Coastguard Worker# The format of the response file is:
24*6dbdd20aSAndroid Build Coastguard Worker#    [--flags <list of one or more flag values>]
25*6dbdd20aSAndroid Build Coastguard Worker
26*6dbdd20aSAndroid Build Coastguard Workerimport argparse
27*6dbdd20aSAndroid Build Coastguard Workerimport os
28*6dbdd20aSAndroid Build Coastguard Workerimport shlex
29*6dbdd20aSAndroid Build Coastguard Workerimport sys
30*6dbdd20aSAndroid Build Coastguard Worker
31*6dbdd20aSAndroid Build Coastguard WorkerCOPYRIGHT_HEADER = '''/*
32*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
33*6dbdd20aSAndroid Build Coastguard Worker *
34*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
35*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
36*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
37*6dbdd20aSAndroid Build Coastguard Worker *
38*6dbdd20aSAndroid Build Coastguard Worker *      http://www.apache.org/licenses/LICENSE-2.0
39*6dbdd20aSAndroid Build Coastguard Worker *
40*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
41*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
42*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
43*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
44*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
45*6dbdd20aSAndroid Build Coastguard Worker */
46*6dbdd20aSAndroid Build Coastguard Worker
47*6dbdd20aSAndroid Build Coastguard Worker'''
48*6dbdd20aSAndroid Build Coastguard Worker
49*6dbdd20aSAndroid Build Coastguard Worker
50*6dbdd20aSAndroid Build Coastguard Workerdef main():
51*6dbdd20aSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
52*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--rsp', help='Input response file containing the flags.')
53*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--out', help='Output path of the generated header file.')
54*6dbdd20aSAndroid Build Coastguard Worker  args = parser.parse_args()
55*6dbdd20aSAndroid Build Coastguard Worker
56*6dbdd20aSAndroid Build Coastguard Worker  flags = []
57*6dbdd20aSAndroid Build Coastguard Worker  with open(args.rsp, 'r') as def_file:
58*6dbdd20aSAndroid Build Coastguard Worker    marker_seen = False
59*6dbdd20aSAndroid Build Coastguard Worker    for flag in shlex.split(def_file.read()):
60*6dbdd20aSAndroid Build Coastguard Worker      if not marker_seen:
61*6dbdd20aSAndroid Build Coastguard Worker        marker_seen = flag == '--flags'
62*6dbdd20aSAndroid Build Coastguard Worker        continue
63*6dbdd20aSAndroid Build Coastguard Worker      key, value = flag.split('=', 1)
64*6dbdd20aSAndroid Build Coastguard Worker      value = '1' if value == 'true' else '0' if value == 'false' else value
65*6dbdd20aSAndroid Build Coastguard Worker      flags.append((key, value))
66*6dbdd20aSAndroid Build Coastguard Worker
67*6dbdd20aSAndroid Build Coastguard Worker  guard = '%s_' % args.out.upper()
68*6dbdd20aSAndroid Build Coastguard Worker  guard = guard.replace('/', '_').replace('\\', '_').replace('.', '_') \
69*6dbdd20aSAndroid Build Coastguard Worker          .replace('-', '_')
70*6dbdd20aSAndroid Build Coastguard Worker  lines = []
71*6dbdd20aSAndroid Build Coastguard Worker  lines.append('// Generated by %s' % os.path.basename(__file__))
72*6dbdd20aSAndroid Build Coastguard Worker  lines.append('')
73*6dbdd20aSAndroid Build Coastguard Worker  lines.append('// fix_include_guards: off')
74*6dbdd20aSAndroid Build Coastguard Worker  lines.append('#ifndef %s' % guard)
75*6dbdd20aSAndroid Build Coastguard Worker  lines.append('#define %s' % guard)
76*6dbdd20aSAndroid Build Coastguard Worker  lines.append('')
77*6dbdd20aSAndroid Build Coastguard Worker  lines.append('// clang-format off')
78*6dbdd20aSAndroid Build Coastguard Worker  for kv in flags:
79*6dbdd20aSAndroid Build Coastguard Worker    lines.append('#define PERFETTO_BUILDFLAG_DEFINE_%s() (%s)' % kv)
80*6dbdd20aSAndroid Build Coastguard Worker  lines.append('')
81*6dbdd20aSAndroid Build Coastguard Worker  lines.append('// clang-format on')
82*6dbdd20aSAndroid Build Coastguard Worker  lines.append('#endif  // %s' % guard)
83*6dbdd20aSAndroid Build Coastguard Worker  lines.append('')
84*6dbdd20aSAndroid Build Coastguard Worker
85*6dbdd20aSAndroid Build Coastguard Worker  with open(args.out, 'w', newline='\n') as out:
86*6dbdd20aSAndroid Build Coastguard Worker    out.write(COPYRIGHT_HEADER)
87*6dbdd20aSAndroid Build Coastguard Worker    out.write('\n'.join(lines))
88*6dbdd20aSAndroid Build Coastguard Worker
89*6dbdd20aSAndroid Build Coastguard Worker
90*6dbdd20aSAndroid Build Coastguard Workerif __name__ == '__main__':
91*6dbdd20aSAndroid Build Coastguard Worker  sys.exit(main())
92