| #!/usr/bin/env python3 | |
| # Copyright (C) 2026 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. | |
| """Regenerate the amalgamated PerfettoSQL parser using the syntaqlite CLI. | |
| Reads the canonical grammar (`perfetto.y`) and AST node definitions | |
| (`perfetto.synq`) from `src/perfetto_sql/syntaqlite/` and | |
| writes the amalgamated `syntaqlite_perfetto.{c,h}` pair back into the same | |
| directory. | |
| The syntaqlite CLI is a prebuilt binary expected at | |
| `buildtools/syntaqlite/syntaqlite[.exe]`. Run | |
| `tools/install-build-deps --syntaqlite` to fetch it. | |
| """ | |
| import os | |
| import platform | |
| import subprocess | |
| import sys | |
| ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |
| SYNTAQLITE_DIR = os.path.join(ROOT_DIR, 'src', 'perfetto_sql', 'syntaqlite') | |
| SYNTAQLITE_BIN_DIR = os.path.join(ROOT_DIR, 'buildtools', 'syntaqlite') | |
| def syntaqlite_binary_path(): | |
| suffix = '.exe' if platform.system() == 'Windows' else '' | |
| return os.path.join(SYNTAQLITE_BIN_DIR, f'syntaqlite{suffix}') | |
| def main(): | |
| binary = syntaqlite_binary_path() | |
| if not os.path.isfile(binary): | |
| sys.exit(f'syntaqlite binary not found at {binary}\n' | |
| f'Run `tools/install-build-deps --syntaqlite` to fetch it.') | |
| cmd = [ | |
| binary, | |
| 'dialect', | |
| 'generate', | |
| '--name', | |
| 'perfetto', | |
| '--actions-dir', | |
| SYNTAQLITE_DIR, | |
| '--nodes-dir', | |
| SYNTAQLITE_DIR, | |
| '--output-type', | |
| 'full', | |
| '--output-dir', | |
| SYNTAQLITE_DIR, | |
| '--macro-style', | |
| 'rust', | |
| ] | |
| print('Running:', ' '.join(cmd)) | |
| subprocess.check_call(cmd) | |
| print(f'Wrote {SYNTAQLITE_DIR}/syntaqlite_perfetto.{{c,h}}') | |
| if __name__ == '__main__': | |
| main() |