Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

198 lines
7.4 KiB
Markdown

# Patches for TheRock
> [!WARNING]
> New patches are STRONGLY DISCOURAGED.
## Working with patches
### Applying patches with `fetch_sources.py`
The [`build_tools/fetch_sources.py`](/build_tools/fetch_sources.py) script
checks out git submodules and then applies sets of patches from this directory:
```bash
# Typical usage with default arguments
# (--apply-patches defaults to True)
# (--patch-tag defaults to "amd-mainline")
python build_tools/fetch_sources.py
# Equivalent to:
python build_tools/fetch_sources.py --apply-patches --patch-tag amd-mainline
```
This command:
1. Checks out the specified submodules
1. Looks for patch files in `patches/<patch-tag>/<project>/*.patch`
1. Applies patches using `git am --whitespace=nowarn` (as user `therockbot`)
To skip applying patches:
```bash
python build_tools/fetch_sources.py --no-apply-patches
```
<details>
<summary>Technical details: version tracking and git configuration</summary>
After applying patches, the script:
- Generates a `.smrev` file (e.g., `.rocm-libraries.smrev`) containing the
submodule URL and a hash of the applied patches for version tracking
- Sets `git update-index --skip-worktree` on the patched submodule to mark it
as modified. This allows commands like `git status` from the base repository
to report no differences even though patched submodules contain new commits.
</details>
### Saving patches with `save_patches.sh`
Use [`build_tools/save_patches.sh`](/build_tools/save_patches.sh) to save local
commits for a given submodule as patch files:
```bash
# Syntax
./build_tools/save_patches.sh <base_tag> <project_name> <patch_subdir>
# Example: Save commits to hipBLASLt since the m/amd-mainline tag
./build_tools/save_patches.sh m/amd-mainline hipBLASLt amd-mainline
```
This script:
1. Removes existing `*.patch` files in `patches/<patch_subdir>/<project_name>/`
1. Uses `git format-patch` to generate patches for all commits since `<base_tag>`
1. Saves the patches to `patches/<patch_subdir>/<project_name>/`
- When working with an already-patched submodule, this script will
regenerate the same patch files (or updated versions if you've modified
commits).
### Using patches from rocm-libraries, rocm-systems, and other repositories
Several external repositories like
[`rocm-libraries`](https://github.com/ROCm/rocm-libraries) and
[`rocm-systems`](https://github.com/ROCm/rocm-systems) use the build system from
TheRock in their own CI workflows. If there are patches in TheRock for those
submodules, then those CI workflows may need to handle them carefully.
**The typical CI pattern**:
1. The external repository checks out its own code at HEAD
1. Checks out TheRock into a subdirectory (e.g., `./TheRock`)
1. Fetches all _other_ dependencies via TheRock's `fetch_sources.py` (excluding
the external repo itself)
1. Applies patches from `TheRock/patches/amd-mainline/<repo>/` to the external repository
1. Builds using TheRock with the patched external repository as a source override
**Example from rocm-libraries**:
```yml
# (1)
- name: "Checking out repository for rocm-libraries"
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
# (2)
- name: Checkout TheRock repository
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
with:
repository: "ROCm/TheRock"
path: TheRock
ref: a1f6b57cc31890c05ab0094212ae0b269765db8e # 2025-11-25 commit
# (3)
- name: Fetch sources
run: |
./TheRock/build_tools/fetch_sources.py --jobs 12 \
--no-include-rocm-libraries --no-include-ml-frameworks
# (4)
- name: Patch rocm-libraries
run: |
# Remove patches here if they cannot be applied cleanly, and they have not been deleted from TheRock repo
# rm ./TheRock/patches/amd-mainline/rocm-libraries/*.patch
git -c user.name="therockbot" -c "user.email=therockbot@amd.com" am \
--whitespace=nowarn ./TheRock/patches/amd-mainline/rocm-libraries/*.patch
# (5)
- name: Configure Projects
env:
extra_cmake_options: "-DTHEROCK_ROCM_LIBRARIES_SOURCE_DIR=../"
BUILD_DIR: build
run: python3 TheRock/build_tools/github_actions/build_configure.py
- name: Build therock-dist
run: cmake --build TheRock/build --target therock-dist
```
Example full workflows:
- [rocm-libraries - `.github/workflows/therock-ci-linux.yml`](https://github.com/ROCm/rocm-libraries/blob/develop/.github/workflows/therock-ci-linux.yml)
- [rocm-systems - `.github/workflows/therock-ci-linux.yml`](https://github.com/ROCm/rocm-systems/blob/develop/.github/workflows/therock-ci-linux.yml)
#### Resolving conflicts with patches
> [!IMPORTANT]
> If a patch does not apply, such as when another commit modifies a file that
> the patch modifies, the workflow will fail.
>
> - If the conflicting commit is itself equivalent to the patch, then the patch
> can be deleted via the (commented out) `rm ...` line. When TheRock picks up
> the equivalent commit and the external repository in turns picks up a new
> the commit `ref` for TheRock, the `rm ...` line can be removed again.
> - If the conflicting commit is NOT equivalent to the patch, for example if it
> modifies unrelated lines in one of the patched files, then a different
> resolution is needed. **This is why patches are expensive and should be
> avoided at all costs - they can block regular project development!**
## Rules for creating patches
**Remember**: New patches are **STRONGLY DISCOURAGED**. They create maintenance
burden and can block development in external repositories.
### Prefer upstream fixes
If a commit in a repository like
[`rocm-libraries`](https://github.com/ROCm/rocm-libraries) or
[`rocm-systems`](https://github.com/ROCm/rocm-systems) causes issues:
1. **First choice**: Revert the problematic commit in that repository, then
pick up the fix via regular submodule updates
1. **Last resort**: Create a patch in TheRock only if the upstream revert is
not feasible
Supporting legacy build systems or closed-source development processes is NOT
sufficient justification for breaking public builds and tests.
### When patches are acceptable
Patches may be used for:
- **Third-party compatibility**: Adapting third-party dependencies that lack
active maintenance or need project-specific changes that are unlikely to be
accepted upstream (see [`patches/third-party/`](./third-party/))
- **Temporary workarounds**: Short-term fixes for critical issues while waiting
for commits to be merged upstream. Any commits carried as patches
**must** be on a path to being reviewed and accepted into their respective
repositories.
Patches should NOT be used for:
- Working around issues that can be fixed by reverting problematic commits in
the source repository
- Public builds and releases take priority over closed-source builds and
releases
builds
- Adding features that should be developed upstream
- Long-term divergence from upstream projects
### Commit message requirements
Patches are held to a higher commit message standard than standard commits.
Commit messages for patches should include:
1. **Why the patch exists**: Explain the problem being solved and why a patch
is necessary instead of an upstream fix
1. **Upstream tracking**: Link to related upstream issues, pull requests, or
discussions if applicable
1. **Reproduction info**: For bug fixes, include error messages or reproduction
steps