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