#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 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}"
  ...
"""

from __future__ import print_function

# 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('-l' + lib for lib in params.libs),
        'libs_private': ' '.join('-l' + lib for lib in 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:]))
