| #!/usr/bin/env python3 | |
| """Generate rustc arguments for meson rust builds. | |
| This program generates --cfg compile flags for the configuration headers passed | |
| as arguments. | |
| Copyright (c) 2024 Linaro Ltd. | |
| Authors: | |
| Manos Pitsidianakis <manos.pitsidianakis@linaro.org> | |
| This program is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 2 of the License, or | |
| (at your option) any later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| """ | |
| import argparse | |
| import logging | |
| from typing import List | |
| def generate_cfg_flags(header: str) -> List[str]: | |
| """Converts defines from config[..].h headers to rustc --cfg flags.""" | |
| def cfg_name(name: str) -> str: | |
| """Filter function for C #defines""" | |
| if ( | |
| name.startswith("CONFIG_") | |
| or name.startswith("TARGET_") | |
| or name.startswith("HAVE_") | |
| ): | |
| return name | |
| return "" | |
| with open(header, encoding="utf-8") as cfg: | |
| config = [l.split()[1:] for l in cfg if l.startswith("#define")] | |
| cfg_list = [] | |
| for cfg in config: | |
| name = cfg_name(cfg[0]) | |
| if not name: | |
| continue | |
| if len(cfg) >= 2 and cfg[1] != "1": | |
| continue | |
| cfg_list.append("--cfg") | |
| cfg_list.append(name) | |
| return cfg_list | |
| def main() -> None: | |
| # pylint: disable=missing-function-docstring | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("-v", "--verbose", action="store_true") | |
| parser.add_argument( | |
| "--config-headers", | |
| metavar="CONFIG_HEADER", | |
| action="append", | |
| dest="config_headers", | |
| help="paths to any configuration C headers (*.h files), if any", | |
| required=False, | |
| default=[], | |
| ) | |
| args = parser.parse_args() | |
| if args.verbose: | |
| logging.basicConfig(level=logging.DEBUG) | |
| logging.debug("args: %s", args) | |
| for header in args.config_headers: | |
| for tok in generate_cfg_flags(header): | |
| print(tok) | |
| if __name__ == "__main__": | |
| main() |