blob: 1f4d893f33166403e44a5a16628a552927ad9de1 [file] [log] [blame]
#!/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:]))