offline_env_requirements.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. """Export locked production requirements for the Kylin ARM64 CPU target."""
  2. import argparse
  3. from pathlib import Path
  4. import subprocess
  5. from packaging.markers import default_environment
  6. from packaging.requirements import Requirement
  7. ROOT = Path(__file__).resolve().parents[1]
  8. def target_environment():
  9. environment = default_environment()
  10. environment.update({
  11. 'implementation_name': 'cpython',
  12. 'os_name': 'posix',
  13. 'platform_machine': 'aarch64',
  14. 'platform_python_implementation': 'CPython',
  15. 'platform_system': 'Linux',
  16. 'python_full_version': '3.14.5',
  17. 'python_version': '3.14',
  18. 'sys_platform': 'linux',
  19. })
  20. return environment
  21. def filter_export(exported):
  22. environment = target_environment()
  23. selected = []
  24. cpu_torch = False
  25. for line in exported.splitlines():
  26. line = line.strip()
  27. if not line or line.startswith('#'):
  28. continue
  29. requirement = Requirement(line)
  30. if requirement.marker and not requirement.marker.evaluate(environment):
  31. continue
  32. requirement.marker = None
  33. if requirement.name == 'torch' and '+cpu' in str(requirement.specifier):
  34. cpu_torch = True
  35. selected.append(str(requirement))
  36. if not cpu_torch:
  37. raise RuntimeError('target_cpu_torch_missing')
  38. if any(line.startswith(('cuda-', 'nvidia-', 'triton==')) for line in selected):
  39. raise RuntimeError('unexpected_cuda_dependency')
  40. return '\n'.join(selected) + '\n'
  41. def main():
  42. parser = argparse.ArgumentParser(description=__doc__)
  43. parser.add_argument('output', type=Path)
  44. args = parser.parse_args()
  45. export = subprocess.run(
  46. ['uv', '--cache-dir', str(ROOT / '.uv-cache'), 'export', '--locked',
  47. '--offline', '--no-dev', '--no-emit-project', '--no-hashes',
  48. '--no-annotate', '--format', 'requirements-txt'],
  49. cwd=ROOT, check=True, capture_output=True, text=True,
  50. )
  51. requirements = filter_export(export.stdout)
  52. args.output.parent.mkdir(parents=True, exist_ok=True)
  53. args.output.write_text(requirements, encoding='utf-8')
  54. print(f'Wrote {len(requirements.splitlines())} locked ARM64 CPU requirements.')
  55. if __name__ == '__main__':
  56. main()