Skip to content
Open
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
116 changes: 67 additions & 49 deletions build_tools/packaging/linux/build_package.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ def create_deb_package(pkg_name, config: PackageConfig):

create_versioned_deb_package(pkg_name, config)
move_packages_to_destination(pkg_name, config)
clean_debian_build_dir()
# Clean debian build directory
remove_dir(DEBIAN_CONTENTS_DIR)
Comment on lines +89 to +90
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I'm just noticing that this is a global variable... you could move it into a local variable that gets passed into each function for better encapsulation.

https://google.github.io/styleguide/pyguide.html#25-mutable-global-state

This looks dangerous since it isn't clear where the variable gets set to a valid directory and this is a destructive operation.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is on our radar and we are making these changes (global to local variable)for the next patch



def create_nonversioned_deb_package(pkg_name, config: PackageConfig):
Expand Down Expand Up @@ -291,11 +292,36 @@ def generate_control_file(pkg_info, deb_dir, config: PackageConfig):
control_file = Path(deb_dir) / "control"

pkg_name = pkg_info.get("Package")
provides = ""
replaces = ""
conflicts = ""
debrecommends = ""
debsuggests = ""

if config.versioned_pkg:
recommends_list = pkg_info.get("DEBRecommends", [])
debrecommends = convert_to_versiondependency(recommends_list, config)
suggests_list = pkg_info.get("DEBSuggests", [])
debsuggests = convert_to_versiondependency(suggests_list, config)

depends_list = pkg_info.get("DEBDepends", [])
else:
depends_list = [pkg_name]
provides_list = [
debian_replace_devel_name(pkg)
for pkg in (pkg_info.get("Provides", []) or [])
]
provides = ", ".join(provides_list)
replaces_list = [
debian_replace_devel_name(pkg)
for pkg in (pkg_info.get("Replaces", []) or [])
]
replaces = ", ".join(replaces_list)
conflicts_list = [
debian_replace_devel_name(pkg)
for pkg in (pkg_info.get("Conflicts", []) or [])
]
conflicts = ", ".join(conflicts_list)

depends = convert_to_versiondependency(depends_list, config)

Expand All @@ -315,6 +341,11 @@ def generate_control_file(pkg_info, deb_dir, config: PackageConfig):
"priority": pkg_info.get("Priority"),
"section": pkg_info.get("Section"),
"version": config.rocm_version,
"provides": provides,
"replaces": replaces,
"conflicts": conflicts,
"debrecommends": debrecommends,
"debsuggests": debsuggests,
}

with control_file.open("w", encoding="utf-8") as f:
Expand Down Expand Up @@ -439,7 +470,8 @@ def create_rpm_package(pkg_name, config: PackageConfig):

create_versioned_rpm_package(pkg_name, config)
move_packages_to_destination(pkg_name, config)
clean_rpm_build_dir()
# Clean rpm build directory
remove_dir(RPM_CONTENTS_DIR)


def generate_spec_file(pkg_name, specfile, config: PackageConfig):
Expand All @@ -455,21 +487,27 @@ def generate_spec_file(pkg_name, specfile, config: PackageConfig):
print_function_name()
os.makedirs(os.path.dirname(specfile), exist_ok=True)

pkginfo = get_package_info(pkg_name)
pkg_info = get_package_info(pkg_name)
# populate packge version details
version = f"{config.rocm_version}.{version_to_str(config.rocm_version)}"
# TBD: Whether to use component version details?
# version = pkginfo.get("Version")

# version = pkg_info.get("Version")
provides = ""
obsoletes = ""
conflicts = ""
rpmrecommends = ""
rpmsuggests = ""
sourcedir_list = []
if config.versioned_pkg:
recommends_list = pkginfo.get("RPMRecommends", [])
recommends_list = pkg_info.get("RPMRecommends", [])
rpmrecommends = convert_to_versiondependency(recommends_list, config)
suggests_list = pkg_info.get("RPMSuggests", [])
rpmsuggests = convert_to_versiondependency(suggests_list, config)

requires_list = pkginfo.get("RPMRequires", [])
requires_list = pkg_info.get("RPMRequires", [])

# Get the packages included by the composite package
pkg_list = pkginfo.get("Includes")
pkg_list = pkg_info.get("Includes")

if pkg_list is None:
pkg_list = [pkg_name]
Expand All @@ -487,7 +525,11 @@ def generate_spec_file(pkg_name, specfile, config: PackageConfig):
for path in sourcedir_list:
convert_runpath_to_rpath(path)
else:
rpmrecommends = ""
# Provides, Obsoletes and Conflicts field is only valid
# for non-versioned packages
provides = ", ".join(pkg_info.get("Provides", []) or [])
obsoletes = ", ".join(pkg_info.get("Obsoletes", []) or [])
conflicts = ", ".join(pkg_info.get("Conflicts", []) or [])
requires_list = [pkg_name]

requires = convert_to_versiondependency(requires_list, config)
Expand All @@ -502,17 +544,21 @@ def generate_spec_file(pkg_name, specfile, config: PackageConfig):
"pkg_name": pkg_name,
"version": version,
"release": config.version_suffix,
"build_arch": pkginfo.get("BuildArch"),
"description_short": pkginfo.get("Description_Short"),
"description_long": pkginfo.get("Description_Long"),
"group": pkginfo.get("Group"),
"pkg_license": pkginfo.get("License"),
"vendor": pkginfo.get("Vendor"),
"build_arch": pkg_info.get("BuildArch"),
"description_short": pkg_info.get("Description_Short"),
"description_long": pkg_info.get("Description_Long"),
"group": pkg_info.get("Group"),
"pkg_license": pkg_info.get("License"),
"vendor": pkg_info.get("Vendor"),
"install_prefix": config.install_prefix,
"requires": requires,
"provides": provides,
"obsoletes": obsoletes,
"conflicts": conflicts,
"rpmrecommends": rpmrecommends,
"disable_rpm_strip": is_rpm_stripping_disabled(pkginfo),
"disable_debug_package": is_debug_package_disabled(pkginfo),
"rpmsuggests": rpmsuggests,
"disable_rpm_strip": is_rpm_stripping_disabled(pkg_info),
"disable_debug_package": is_debug_package_disabled(pkg_info),
"sourcedir_list": sourcedir_list,
}

Expand Down Expand Up @@ -748,28 +794,6 @@ def parse_input_package_list(pkg_name):
return pkg_list


def clean_rpm_build_dir():
"""Clean the rpm build directory

Parameters: None
Returns: None
"""
if os.path.exists(RPM_CONTENTS_DIR) and os.path.isdir(RPM_CONTENTS_DIR):
shutil.rmtree(RPM_CONTENTS_DIR)
print(f"Removed directory: {RPM_CONTENTS_DIR}")


def clean_debian_build_dir():
"""Clean the debian build directory

Parameters: None
Returns: None
"""
if os.path.exists(DEBIAN_CONTENTS_DIR) and os.path.isdir(DEBIAN_CONTENTS_DIR):
shutil.rmtree(DEBIAN_CONTENTS_DIR)
print(f"Removed directory: {DEBIAN_CONTENTS_DIR}")


def clean_package_build_dir(artifacts_dir):
"""Clean the package build directories

Expand All @@ -781,18 +805,12 @@ def clean_package_build_dir(artifacts_dir):
Returns: None
"""
print_function_name()

clean_rpm_build_dir()
clean_debian_build_dir()

PYCACHE_DIR = Path(SCRIPT_DIR) / "__pycache__"
if os.path.exists(PYCACHE_DIR) and os.path.isdir(PYCACHE_DIR):
shutil.rmtree(PYCACHE_DIR)
print(f"Removed directory: {PYCACHE_DIR}")

if os.path.exists(artifacts_dir) and os.path.isdir(artifacts_dir):
shutil.rmtree(artifacts_dir)
print(f"Removed directory: {artifacts_dir}")
remove_dir(RPM_CONTENTS_DIR)
remove_dir(DEBIAN_CONTENTS_DIR)
remove_dir(PYCACHE_DIR)
remove_dir(artifacts_dir)


def run(args: argparse.Namespace):
Expand Down
50 changes: 39 additions & 11 deletions build_tools/packaging/linux/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,17 @@
"License": "MIT",
"Vendor": "Advanced Micro Devices, Inc",
"Homepage": "https://github.com/ROCm/rocm-systems",
"Suggests": [
"DEBSuggests": [
"sudo",
"libdrm-dev",
"libdrm-amdgpu-dev"
],
"RPMSuggests": [
"sudo",
"libdrm-devel",
"libdrm-amdgpu-devel"
],

"Components": [
"lib",
"dev",
Expand Down Expand Up @@ -281,7 +287,13 @@
"python3-wheel",
"rocm-core"
],
"Recommends": [
"RPMRecommends": [
"python3-argcomplete",
"libdrm-devel",
"libdrm-amdgpu-devel"
],

"DEBRecommends": [
"python3-argcomplete",
"libdrm-dev",
"libdrm-amdgpu-dev"
Expand Down Expand Up @@ -447,8 +459,12 @@
"License": "MIT",
"Vendor": "Advanced Micro Devices, Inc",
"Homepage": "https://github.com/ROCm/rocm-systems",
"Provides": "hip-rocclr",
"Replaces": "hip-rocclr",
"Provides": [
"hip-rocclr"
],
"Replaces": [
"hip-rocclr"
],
"Components": [
"lib",
"run",
Expand Down Expand Up @@ -490,8 +506,12 @@
"License": "MIT",
"Vendor": "Advanced Micro Devices, Inc",
"Homepage": "https://github.com/ROCm/rocm-systems",
"Provides": "hip-base",
"Replaces": "hip-base",
"Provides": [
"hip-base"
],
"Replaces": [
"hip-base"
],
"Components": [
"dev"
],
Expand Down Expand Up @@ -647,13 +667,17 @@
"hsakmt-roct-devel",
"hsa-ext-rocr-devel"
],
"Recommends": [
"RPMRecommends": [
"libdrm-amdgpu-devel"
],

"DEBRecommends": [
"libdrm-amdgpu-dev"
],
"Replaces": [
"hsakmt-roct",
"hsakmt-roct-dev",
"hsa-ext-rocr-dev"
"hsakmt-roct-devel",
"hsa-ext-rocr-devel"
],
"Maintainer": "AMD HSA Support <[email protected]>",
"Description_Short": "AMD Heterogeneous System Architecture HSA development package",
Expand Down Expand Up @@ -1677,7 +1701,9 @@
"License": "MIT",
"Vendor": "Advanced Micro Devices, Inc",
"Homepage": "https://github.com/ROCm/rocm-libraries",
"Conflicts": "miopen-opencl",
"Conflicts": [
"miopen-opencl"
],
"Components": [
"lib",
"doc"
Expand Down Expand Up @@ -1709,7 +1735,9 @@
"License": "MIT",
"Vendor": "Advanced Micro Devices, Inc",
"Homepage": "https://github.com/ROCm/rocm-libraries",
"Conflicts": "miopen-opencl",
"Conflicts": [
"miopen-opencl"
],
"Components": [
"dev",
"run"
Expand Down
15 changes: 15 additions & 0 deletions build_tools/packaging/linux/packaging_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@


import json
import os
import shutil
import sys
from pathlib import Path

Expand Down Expand Up @@ -194,6 +196,19 @@ def get_package_list():
return pkg_list


def remove_dir(dir_name):
"""Remove the directory if it exists

Parameters:
dir_name : Directory to be removed

Returns: None
"""
if os.path.exists(dir_name) and os.path.isdir(dir_name):
shutil.rmtree(dir_name)
print(f"Removed directory: {dir_name}")


def version_to_str(version_str):
"""Convert a ROCm version string to a numeric representation.

Expand Down
15 changes: 15 additions & 0 deletions build_tools/packaging/linux/template/debian_control.j2
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,20 @@ Homepage: {{ homepage }}
Package: {{ pkg_name }}
Architecture: {{ arch }}
Depends: {{ depends }}
{%- if provides %}
Provides: {{ provides }}
{%- endif %}
{%- if replaces %}
Replaces: {{ replaces }}
{%- endif %}
{%- if conflicts %}
Conflicts: {{ conflicts }}
{%- endif %}
{%- if debrecommends %}
Recommends: {{ debrecommends }}
{%- endif %}
{%- if debsuggests %}
Suggests: {{ debsuggests }}
{%- endif %}
Description: {{ description_short }}
{{ description_long }}
21 changes: 16 additions & 5 deletions build_tools/packaging/linux/template/rpm_specfile.j2
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,24 @@ Group: {{ group }}
License: {{ pkg_license }}
Vendor: {{ vendor }}
Prefix: {{ install_prefix }}
{% if requires %}
{%- if requires %}
Requires: {{ requires }}
{% endif %}
{% if rpmrecommends %}
{%- endif %}
{%- if rpmrecommends %}
Recommends: {{ rpmrecommends }}
{% endif %}

{%- endif %}
{%- if rpmsuggests %}
Suggests: {{ rpmsuggests }}
{%- endif %}
{%- if provides %}
Provides: {{ provides }}
{%- endif %}
{%- if obsoletes %}
Obsoletes: {{ obsoletes }}
{%- endif %}
{%- if conflicts %}
Conflicts: {{ conflicts }}
{%- endif %}
%description
{{ description_long }}

Expand Down
Loading