| #!/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(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:])) |