|  | import argparse | 
|  | import os | 
|  | import re | 
|  | import subprocess | 
|  | from pathlib import Path | 
|  | from typing import Optional, Union | 
|  |  | 
|  | from setuptools import distutils  # type: ignore[import] | 
|  |  | 
|  |  | 
|  | UNKNOWN = "Unknown" | 
|  | RELEASE_PATTERN = re.compile(r"/v[0-9]+(\.[0-9]+)*(-rc[0-9]+)?/") | 
|  |  | 
|  |  | 
|  | def get_sha(pytorch_root: Union[str, Path]) -> str: | 
|  | try: | 
|  | return ( | 
|  | subprocess.check_output(["git", "rev-parse", "HEAD"], cwd=pytorch_root) | 
|  | .decode("ascii") | 
|  | .strip() | 
|  | ) | 
|  | except Exception: | 
|  | return UNKNOWN | 
|  |  | 
|  |  | 
|  | def get_tag(pytorch_root: Union[str, Path]) -> str: | 
|  | try: | 
|  | tag = ( | 
|  | subprocess.check_output( | 
|  | ["git", "describe", "--tags", "--exact"], cwd=pytorch_root | 
|  | ) | 
|  | .decode("ascii") | 
|  | .strip() | 
|  | ) | 
|  | if RELEASE_PATTERN.match(tag): | 
|  | return tag | 
|  | else: | 
|  | return UNKNOWN | 
|  | except Exception: | 
|  | return UNKNOWN | 
|  |  | 
|  |  | 
|  | def get_torch_version(sha: Optional[str] = None) -> str: | 
|  | pytorch_root = Path(__file__).parent.parent | 
|  | version = open(pytorch_root / "version.txt", "r").read().strip() | 
|  |  | 
|  | if os.getenv("PYTORCH_BUILD_VERSION"): | 
|  | assert os.getenv("PYTORCH_BUILD_NUMBER") is not None | 
|  | build_number = int(os.getenv("PYTORCH_BUILD_NUMBER", "")) | 
|  | version = os.getenv("PYTORCH_BUILD_VERSION", "") | 
|  | if build_number > 1: | 
|  | version += ".post" + str(build_number) | 
|  | elif sha != UNKNOWN: | 
|  | if sha is None: | 
|  | sha = get_sha(pytorch_root) | 
|  | version += "+git" + sha[:7] | 
|  | return version | 
|  |  | 
|  |  | 
|  | if __name__ == "__main__": | 
|  | parser = argparse.ArgumentParser( | 
|  | description="Generate torch/version.py from build and environment metadata." | 
|  | ) | 
|  | parser.add_argument( | 
|  | "--is_debug", | 
|  | type=distutils.util.strtobool, | 
|  | help="Whether this build is debug mode or not.", | 
|  | ) | 
|  | parser.add_argument("--cuda_version", type=str) | 
|  | parser.add_argument("--hip_version", type=str) | 
|  |  | 
|  | args = parser.parse_args() | 
|  |  | 
|  | assert args.is_debug is not None | 
|  | args.cuda_version = None if args.cuda_version == "" else args.cuda_version | 
|  | args.hip_version = None if args.hip_version == "" else args.hip_version | 
|  |  | 
|  | pytorch_root = Path(__file__).parent.parent | 
|  | version_path = pytorch_root / "torch" / "version.py" | 
|  | # Attempt to get tag first, fall back to sha if a tag was not found | 
|  | tagged_version = get_tag(pytorch_root) | 
|  | sha = get_sha(pytorch_root) | 
|  | if tagged_version == UNKNOWN: | 
|  | version = get_torch_version(sha) | 
|  | else: | 
|  | version = tagged_version | 
|  |  | 
|  | with open(version_path, "w") as f: | 
|  | f.write("__version__ = '{}'\n".format(version)) | 
|  | # NB: This is not 100% accurate, because you could have built the | 
|  | # library code with DEBUG, but csrc without DEBUG (in which case | 
|  | # this would claim to be a release build when it's not.) | 
|  | f.write("debug = {}\n".format(repr(bool(args.is_debug)))) | 
|  | f.write("cuda = {}\n".format(repr(args.cuda_version))) | 
|  | f.write("git_version = {}\n".format(repr(sha))) | 
|  | f.write("hip = {}\n".format(repr(args.hip_version))) |