Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
289 changes: 273 additions & 16 deletions build_tools/build_python_packages.py

Large diffs are not rendered by default.

65 changes: 60 additions & 5 deletions build_tools/compute_rocm_package_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,17 @@

python compute_rocm_package_version.py --release-type=nightly --override-base-version=7.99.0
# 7.99.0a20251021

python compute_rocm_package_version.py --release-type=asan --asan-build-id=20260807
# rocm_package_version=10.1.0+asan.20260807
"""

import argparse
from datetime import datetime
from pathlib import Path
import json
import os
import re
import subprocess
import sys

Expand Down Expand Up @@ -105,28 +109,57 @@ def get_current_date():
return datetime.today().strftime("%Y%m%d")


def normalize_asan_build_id(build_id: str | None) -> str:
"""Return a PEP 440 local-version-safe ASAN build identifier.

ASAN wheels are intentionally isolated from release wheels with a local
version of the form ``+asan.<build-id>``. Dots, hyphens and underscores
are equivalent separators under PEP 440, so normalize all of them to dots
to keep filenames and dependency pins deterministic.
"""
if build_id is None:
return get_current_date()

build_id = build_id.strip()
if not build_id:
raise ValueError("ASAN build ID must not be empty")
if not re.fullmatch(r"[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*", build_id):
raise ValueError(
"ASAN build ID must contain only alphanumeric components separated "
"by '.', '-' or '_'"
)
return re.sub(r"[._-]+", ".", build_id).lower()


def compute_version(
package_type: str = "wheel",
release_type: str | None = None,
custom_version_suffix: str | None = None,
prerelease_version: str | None = None,
override_base_version: str | None = None,
override_git_sha: str | None = None,
asan_build_id: str | None = None,
) -> str:
"""Compute package version based on package type and release type.

Args:
package_type: Type of package ("wheel", "deb", or "rpm")
release_type: Release type ("ci", "dev", "nightly", "prerelease", or "release")
release_type: Release type ("asan", "ci", "dev", "nightly",
"prerelease", or "release")
custom_version_suffix: Custom suffix to override automatic suffix
prerelease_version: Prerelease version number
override_base_version: Override the base version from version.json
override_git_sha: Explicit git SHA override, forwarded to get_git_sha().
See get_git_sha() for details on when this is needed.
asan_build_id: Optional ASAN wheel build identifier. Defaults to the
current date and is only valid with ``release_type="asan"``.

Returns:
Computed version string appropriate for the package type
"""
if asan_build_id is not None and release_type != "asan":
raise ValueError("asan_build_id requires release_type='asan'")

if override_base_version:
base_version = override_base_version
else:
Expand All @@ -140,6 +173,8 @@ def compute_version(
# Trust the custom suffix to satisfy the general rules:
# https://packaging.python.org/en/latest/specifications/version-specifiers/
version_suffix = custom_version_suffix
elif release_type == "asan":
version_suffix = f"+asan.{normalize_asan_build_id(asan_build_id)}"
elif release_type in ("ci", "dev"):
# Construct a dev release version:
# https://packaging.python.org/en/latest/specifications/version-specifiers/#developmental-releases
Expand Down Expand Up @@ -167,6 +202,8 @@ def compute_version(

# Handle native packages (deb/rpm)
else: # package_type in ["deb", "rpm"]
if release_type == "asan":
raise ValueError("ASAN package versions are only supported for wheels")
if custom_version_suffix:
# Custom suffix uses the provided value
version_suffix_str = f"{custom_version_suffix}"
Expand Down Expand Up @@ -216,10 +253,11 @@ def main(argv):
release_type_group.add_argument(
"--release-type",
type=str,
choices=["ci", "dev", "nightly", "prerelease", "release"],
choices=["asan", "ci", "dev", "nightly", "prerelease", "release"],
help=(
"The type of package version to produce. "
"'ci' uses dev-style versions; 'release' is only valid for deb/rpm."
"'ci' uses dev-style versions; 'asan' is wheel-only; "
"'release' is only valid for deb/rpm."
),
)
release_type_group.add_argument(
Expand All @@ -246,6 +284,14 @@ def main(argv):
help="Explicit git SHA to embed in the version instead of auto-detecting",
)

parser.add_argument(
"--asan-build-id",
help=(
"Build identifier for --release-type=asan (defaults to YYYYMMDD). "
"The wheel version is <base>+asan.<build-id>."
),
)

args = parser.parse_args(argv)

# Validation
Expand All @@ -259,16 +305,25 @@ def main(argv):
"--prerelease-version is required when release type is 'prerelease'"
)

# Compute versions for all three package types: wheel, deb, and rpm
if args.release_type != "asan" and args.asan_build_id:
parser.error("--asan-build-id requires --release-type=asan")

# ASAN packaging is deliberately wheel-only. Native package production is
# a separate release pipeline and must not accidentally consume this local
# version scheme.
outputs = {}
for pkg_type in ["wheel", "deb", "rpm"]:
package_types = (
["wheel"] if args.release_type == "asan" else ["wheel", "deb", "rpm"]
)
for pkg_type in package_types:
version = compute_version(
package_type=pkg_type,
release_type=args.release_type,
custom_version_suffix=args.custom_version_suffix,
prerelease_version=args.prerelease_version,
override_base_version=args.override_base_version,
override_git_sha=args.override_git_sha,
asan_build_id=args.asan_build_id,
)

# Set appropriate output variable based on package type
Expand Down
1 change: 1 addition & 0 deletions build_tools/linux_portable_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ def do_build(args: argparse.Namespace, *, rest_args: list[str]):
# Pass through environment variables that control build behavior.
# These are set by CI workflows to enable features like build profiling.
passthrough_env_vars = [
"CMAKE_BUILD_PARALLEL_LEVEL",
"EXTRA_C_COMPILER_LAUNCHER",
"EXTRA_CXX_COMPILER_LAUNCHER",
"THEROCK_BUILD_PROF_LOG_DIR",
Expand Down
Loading
Loading