Home | History | Annotate | Download | only in tools
      1 #!/usr/bin/env python
      2 # Copyright (C) 2017 The Android Open Source Project
      3 #
      4 # Licensed under the Apache License, Version 2.0 (the "License");
      5 # you may not use this file except in compliance with the License.
      6 # You may obtain a copy of the License at
      7 #
      8 #      http://www.apache.org/licenses/LICENSE-2.0
      9 #
     10 # Unless required by applicable law or agreed to in writing, software
     11 # distributed under the License is distributed on an "AS IS" BASIS,
     12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 # See the License for the specific language governing permissions and
     14 # limitations under the License.
     15 
     16 # Generates proto definitions from ftrace format files.
     17 # Arguments:
     18 #   path to ftrace_proto_gen
     19 #   path to input directory full of format files
     20 #   path to output directory for proto definitions files
     21 #   Either:
     22 #    --whitelist PATH : path to a list of events to generate
     23 #    --event EVENT : a single event to generate
     24 #
     25 # Example:
     26 # ./tools/update_protos.py
     27 #    out/linux/ftrace_proto_gen
     28 #   libftrace/test/data/android_seed_N2F62_3.10.49
     29 #   protos/ftrace
     30 #   --whitelist tools/ftrace_proto_gen/event_whitelist
     31 
     32 
     33 from __future__ import print_function
     34 import argparse
     35 import os
     36 import subprocess
     37 import sys
     38 import tempfile
     39 
     40 
     41 HEADER = """# Copyright (C) 2018 The Android Open Source Project
     42 #
     43 # Licensed under the Apache License, Version 2.0 (the "License");
     44 # you may not use this file except in compliance with the License.
     45 # You may obtain a copy of the License at
     46 #
     47 #      http://www.apache.org/licenses/LICENSE-2.0
     48 #
     49 # Unless required by applicable law or agreed to in writing, software
     50 # distributed under the License is distributed on an "AS IS" BASIS,
     51 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     52 # See the License for the specific language governing permissions and
     53 # limitations under the License.
     54 
     55 """
     56 
     57 
     58 def command(*args):
     59   subprocess.check_call(args, stdout=sys.stdout, stderr=sys.stderr)
     60 
     61 def main():
     62   parser = argparse.ArgumentParser(description='Generate protos.')
     63   parser.add_argument('ftrace_proto_gen',
     64                       help='an ftrace_proto_gen binary')
     65   parser.add_argument('input_dir',
     66                       help='input directory')
     67   parser.add_argument('output_dir',
     68                       help='output directory')
     69   parser.add_argument('--whitelist', dest='whitelist_path',
     70                       default=None,
     71                       help='path to whitelist of events')
     72   parser.add_argument('--event', dest='event',
     73                       default=None,
     74                       help='output directory')
     75   parser.add_argument('--update-build-files', dest='update_build_files',
     76                       action='store_true',
     77                       help='should update metadata')
     78   args = parser.parse_args()
     79 
     80   gen_path = args.ftrace_proto_gen
     81   input_dir = args.input_dir
     82   output_dir = args.output_dir
     83   whitelist_path = args.whitelist_path
     84   update_build_files = args.update_build_files
     85 
     86   if whitelist_path is not None and not os.path.isfile(whitelist_path):
     87     parser.error('Whitelist file {} does not exist.'.format(whitelist_path))
     88   if not os.path.isdir(input_dir):
     89     parser.error('Input directory {} does not exist.'.format(input_dir))
     90   if not os.path.isdir(output_dir):
     91     parser.error('Output directory {} does not exist.'.format(output_dir))
     92 
     93   # Run ftrace_proto_gen
     94   command(gen_path, whitelist_path, input_dir, output_dir)
     95 
     96   if update_build_files:
     97     names = sorted(os.listdir(output_dir))
     98     names = [name for name in names if name.endswith('.proto')]
     99     names = ''.join(['  "{}",\n'.format(name) for name in names])
    100     body = 'ftrace_proto_names = [\n{}]'.format(names)
    101     with open(os.path.join(output_dir, 'all_protos.gni'), 'wb') as f:
    102       f.write(HEADER)
    103       f.write(body)
    104 
    105   return 0
    106 
    107 
    108 if __name__ == '__main__':
    109   sys.exit(main())
    110