| # This file should be written to the wheel package as |
| # `executorch/data/bin/__init__.py`. |
| # |
| # Setuptools will expect to be able to say something like `from |
| # executorch.data.bin import mybin; mybin()` for each entry listed in the |
| # [project.scripts] section of pyproject.toml. This file makes the `mybin()` |
| # function execute the binary at `executorch/data/bin/mybin` and exit with that |
| # binary's exit status. |
| |
| import subprocess |
| import os |
| import sys |
| import types |
| |
| # This file should live in the target `bin` directory. |
| _bin_dir = os.path.join(os.path.dirname(__file__)) |
| |
| def _find_executable_files_under(dir): |
| """Lists all executable files in the given directory.""" |
| bin_names = [] |
| for filename in os.listdir(dir): |
| filepath = os.path.join(dir, filename) |
| if os.path.isfile(filepath) and os.access(filepath, os.X_OK): |
| # Remove .exe suffix on windows. |
| filename_without_ext = os.path.splitext(filename)[0] |
| bin_names.append(filename_without_ext) |
| return bin_names |
| |
| # The list of binaries to create wrapper functions for. |
| _bin_names = _find_executable_files_under(_bin_dir) |
| |
| # We'll define functions named after each binary. Make them importable. |
| __all__ = _bin_names |
| |
| def _run(name): |
| """Runs the named binary, which should live under _bin_dir. |
| |
| Exits the current process with the return code of the subprocess. |
| """ |
| raise SystemExit(subprocess.call([os.path.join(_bin_dir, name)] + sys.argv[1:], close_fds=False)) |
| |
| # Define a function named after each of the binaries. |
| for bin_name in _bin_names: |
| exec(f"def {bin_name}(): _run('{bin_name}')") |