diff --git a/build_tools/packaging/linux/build_package.py b/build_tools/packaging/linux/build_package.py index 933d04449..b2d822119 100755 --- a/build_tools/packaging/linux/build_package.py +++ b/build_tools/packaging/linux/build_package.py @@ -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) def create_nonversioned_deb_package(pkg_name, config: PackageConfig): @@ -287,11 +288,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) @@ -311,6 +337,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: @@ -435,7 +466,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): @@ -451,21 +483,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}" # 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] @@ -483,7 +521,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) @@ -498,17 +540,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, } @@ -744,28 +790,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 @@ -777,18 +801,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): diff --git a/build_tools/packaging/linux/package.json b/build_tools/packaging/linux/package.json index 83ba2e818..e1df14d2e 100644 --- a/build_tools/packaging/linux/package.json +++ b/build_tools/packaging/linux/package.json @@ -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", @@ -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" @@ -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", @@ -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" ], @@ -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 ", "Description_Short": "AMD Heterogeneous System Architecture HSA development package", @@ -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" @@ -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" diff --git a/build_tools/packaging/linux/packaging_utils.py b/build_tools/packaging/linux/packaging_utils.py index 6cbb2e548..77fda2165 100644 --- a/build_tools/packaging/linux/packaging_utils.py +++ b/build_tools/packaging/linux/packaging_utils.py @@ -3,6 +3,8 @@ import json +import os +import shutil import sys from pathlib import Path @@ -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. diff --git a/build_tools/packaging/linux/template/debian_control.j2 b/build_tools/packaging/linux/template/debian_control.j2 index dd59581e4..740c96cb1 100644 --- a/build_tools/packaging/linux/template/debian_control.j2 +++ b/build_tools/packaging/linux/template/debian_control.j2 @@ -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 }} diff --git a/build_tools/packaging/linux/template/rpm_specfile.j2 b/build_tools/packaging/linux/template/rpm_specfile.j2 index fba8fc23b..adae94d54 100644 --- a/build_tools/packaging/linux/template/rpm_specfile.j2 +++ b/build_tools/packaging/linux/template/rpm_specfile.j2 @@ -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 }}