| import sys |
| import subprocess |
| import os |
| |
| |
| def run_llvm_config(args): |
| """ |
| Runs llvm-config with the given arguments and returns its stripped stdout. |
| Exits the script if llvm-config is not found or returns an error. |
| """ |
| try: |
| return subprocess.check_output( |
| ["llvm-config"] + args, |
| text=True, # Decode output as text (Python 3) |
| ).strip() |
| except (subprocess.CalledProcessError, FileNotFoundError) as e: |
| sys.stderr.write(f"Error: Failed to run 'llvm-config {' '.join(args)}'.\n") |
| if isinstance(e, subprocess.CalledProcessError): |
| sys.stderr.write(f"STDOUT: {e.stdout}\n") |
| sys.stderr.write(f"STDERR: {e.stderr}\n") |
| else: # FileNotFoundError |
| sys.stderr.write( |
| "Ensure 'llvm-config' is installed and in your system's PATH.\n") |
| sys.exit(1) |
| |
| |
| def format_gn_list(items): |
| """Formats a Python list into a GN-compatible list string, removing duplicates and sorting.""" |
| if not items: |
| return "[]" |
| return "[\n" + ",\n".join( |
| f' "{item}"' for item in sorted(list(set(items)))) + "\n]" |
| |
| |
| def main(): |
| llvm_include_dir = run_llvm_config(["--includedir"]) |
| cxxflags_raw = run_llvm_config(["--cxxflags"]) |
| |
| defines_list = [] |
| cflags_list = [] |
| |
| for flag in cxxflags_raw.split(): |
| if flag.startswith('-D'): |
| defines_list.append(flag[2:]) |
| elif not flag.startswith('-I'): |
| cflags_list.append(flag) |
| |
| cflags_list.insert(0, f'-isystem{llvm_include_dir}') |
| |
| # Get ALL flags and library names needed for SHARED linking |
| ldflags_and_libs_raw = run_llvm_config( |
| ["--ldflags", "--libs", "--link-shared", "symbolize"]) |
| |
| ldflags_list = [] |
| libs_list = [] |
| |
| for part in ldflags_and_libs_raw.split(): |
| if part.startswith('-L'): |
| # Add library search paths (e.g., "-L/usr/lib/llvm-19/lib") |
| ldflags_list.append(part) |
| elif part.startswith('-l'): |
| # Add library names (e.g., "LLVM-19", "z") |
| libs_list.append(part[2:]) |
| else: |
| # Add other miscellaneous flags |
| ldflags_list.append(part) |
| |
| # Print output in GN-compatible format |
| print(f"defines = {format_gn_list(defines_list)}") |
| print(f"cflags = {format_gn_list(cflags_list)}") |
| print(f"libs = {format_gn_list(libs_list)}") |
| print(f"ldflags = {format_gn_list(ldflags_list)}") |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |