| #!/usr/bin/env python3 |
| # Copyright (C) 2023 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| """Wrapper of pkg-config command line to format output for gn. |
| |
| Parses the pkg-config output and format it into json, |
| so that it can be used in GN files easily. |
| |
| Usage: |
| pkg-config_wrapper.py pkg-config pkg1 pkg2 ... |
| |
| Specifically, this script does not expect any additional flags. |
| """ |
| |
| import json |
| import shlex |
| import subprocess |
| import sys |
| |
| |
| def get_shell_output(cmd): |
| """Run |cmd| and return output as a list.""" |
| result = subprocess.run( |
| cmd, encoding="utf-8", stdout=subprocess.PIPE, check=False |
| ) |
| if result.returncode: |
| sys.exit(result.returncode) |
| return shlex.split(result.stdout) |
| |
| |
| def main(argv): |
| if len(argv) < 2: |
| sys.exit(f"Usage: {sys.argv[0]} <pkg-config> <modules>") |
| |
| cflags = get_shell_output(argv + ["--cflags"]) |
| libs = [] |
| lib_dirs = [] |
| ldflags = [] |
| for ldflag in get_shell_output(argv + ["--libs"]): |
| if ldflag.startswith("-l"): |
| # Strip -l. |
| libs.append(ldflag[2:]) |
| elif ldflag.startswith("-L"): |
| # Strip -L. |
| lib_dirs.append(ldflag[2:]) |
| else: |
| ldflags.append(ldflag) |
| |
| # Set sort_keys=True for stabilization. |
| result = { |
| "cflags": cflags, |
| "libs": libs, |
| "lib_dirs": lib_dirs, |
| "ldflags": ldflags, |
| } |
| json.dump(result, sys.stdout, sort_keys=True) |
| |
| |
| if __name__ == "__main__": |
| sys.exit(main(sys.argv[1:])) |