#!/usr/bin/env python3
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Python script to generate a .pc file from gn.

This scripts fills the fields of the .pc file with the given values of
the flags.
For detailed meaning of each field, please find it in
https://people.freedesktop.org/~dbn/pkg-config-guide.html#concepts

Example:

python generate-pc.py \
  --output="${target}.pc" \
  --name="${libname}" \
  --description="${description}" \
  --version="${version}" \
  --requires="${requires}"
  ...
"""

# TODO(crbug.com/868820): chromite.lib.commandline may be a good alternate
# but is concerned the loading performance. Considering this is a part of
# configuration, use argparse in standard library. Replace it when the loading
# gets enough fast.
import argparse
import sys


_TEMPLATE = """
Name: %(name)s
Description: %(description)s
Version: %(version)s
Requires: %(requires)s
Requires.private: %(requires_private)s
Libs: %(libs)s
Libs.private: %(libs_private)s
Cflags: %(cflags)s
"""


def _generate(output, params):
  """Generates a .pc file.

  Args:
    output: Path to the output file.
    params: an object containing the .pc file data. It should have the
        following members: name, description, version, requires,
        requies_private, libs, libs_private and cflags.
  """
  with open(output, 'w') as f:
    f.write(_TEMPLATE.lstrip('\n') % {
        'name': params.name,
        'description': params.description,
        'version': params.version,
        'requires': ' '.join(params.requires),
        'requires_private': ' '.join(params.requires_private),
        'libs': ' '.join(params.libs),
        'libs_private': ' '.join(params.libs_private),
        'cflags': ' '.join(params.cflags)
    })


def _get_parser():
  """Returns an argument parser for this script."""
  parser = argparse.ArgumentParser(description=__doc__)
  parser.add_argument('--output', required=True, help='The output file name')
  parser.add_argument('--name', required=True, help='The library name')
  parser.add_argument('--description', default='',
                      help='The description of the library')
  parser.add_argument('--version', required=True,
                      help='The version of the library')
  parser.add_argument('--requires', action='append', default=[],
                      help='Packages for Required')
  parser.add_argument('--requires-private', action='append', default=[],
                      help='Packages for Required.private')
  parser.add_argument('--libs', action='append', default=[],
                      help='Libraries for Libs')
  parser.add_argument('--libs-private', action='append', default=[],
                      help='Libraries for Libs.private')
  parser.add_argument('--cflags', action='append', default=[],
                      help='Compiler flags')
  return parser


def main(argv):
  parser = _get_parser()
  options = parser.parse_args(argv)
  _generate(options.output, options)


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
