| # IREE Repository Management |
| |
| Due to the process by which we synchronize this GitHub project with our internal |
| Google source code repository, there are some oddities in our workflows and |
| processes. We aim to minimize these, and especially to minimize their impact on |
| external contributors, but they are documented here for clarity and |
| transparency. If any of these things are particularly troublesome or painful for |
| your workflow, please reach out to us so we can prioritize a fix. |
| |
| ## Branches |
| |
| The default branch is called `main`. PRs should be sent there. We also have a |
| `google` branch that is synced from the Google internal source repository. This |
| branch is merged from and to `main` frequently to upstream any changes coming |
| from `google` and as part of updating the internal source repository. For the |
| most part this integration with `google` should have minimal effect on normal |
| developer workflows. |
| |
| ## Dependencies |
| |
| As a project which brings together compiler, runtime and graphics systems, |
| dependency management is somewhat complex. We use git submodules for C++ |
| dependencies and, where possible, language specific external package management |
| for other types of dependencies (e.g. Python). |
| |
| In addition, dependencies are managed entirely different in the Google internal |
| source code repository. This imposes constraints on repository management tasks |
| that may not be obvious. |
| |
| The git submodule state is not accessible to the tooling that moves the IREE |
| source between GitHub and Google's source repository. We therefore mirror this |
| state in a special `SUBMODULE_VERSIONS.txt` file. This file is considered the |
| source of truth for the correct submodule state and is what is used by the CI. |
| When updating the submodule state from Google's source repository, only this |
| file is updated and another |
| [GitHub Actions workflow](https://github.com/google/iree/blob/main/.github/workflows/synchronize_submodules.yml) |
| immediately commits a submodule update on top of that. |
| |
| Shortcut commands (read below for full documentation): |
| |
| ```shell |
| # Update SUBMODULE_VERSIONS.txt from current git submodule pointers |
| $ ./scripts/git/submodule_versions.py export |
| |
| # Update current git submodule pointers based on SUBMODULE_VERSIONS.txt |
| $ ./scripts/git/submodule_versions.py import |
| ``` |
| |
| ### The special relationship with LLVM and TensorFlow |
| |
| TL;DR: Dependency management with TensorFlow and LLVM are managed as part of the |
| integration with Google's internal source repository and updates will be picked |
| up by the `main` branch at an approximately daily cadence when merging in the |
| `google` branch. |
| |
| Currently, the two most challenging projects to manage as dependencies are |
| TensorFlow and LLVM. Both are typically pinned to specific versions that are |
| integrated in the Google source repository at a cadence up to many times per |
| day. Additionally, TensorFlow itself depends on LLVM. We use BUILD files in the |
| utils/bazel directory in the llvm-project repository. Just to make it more |
| interesting, since TensorFlow does not ship with CMakeLists, IREE uses overlay |
| CMakeLists.txt to build subsets of TensorFlow needed for the compiler (when |
| built with CMake). While these externally managed build files are written to be |
| moderately generic, they can and do break and require manual intervention at |
| times (i.e. there is no guarantee that updating to a new commit of either will |
| not require some manual work on the build files). |
| |
| The only combination which is expected to work is the llvm-project commit noted |
| in the `LLVM_COMMIT` setting in |
| `third_party/tensorflow/tensorflow/workspace.bzl`. In reality, it is often |
| possible (especially with the CMake build) to use a newer llvm-project commit, |
| and private development forks should feel free to do this. However, to submit |
| upstream, we will need to integrate this newer commit in the internal Google |
| source of truth prior to accepting code that depends on it. |
| |
| LLVM is integrated into Google's source repository at a cadence up to several |
| times a day. The LLVM submodule version used by IREE is also updated as part of |
| this integration. When this necessitates updating IREE to changing LLVM and MLIR |
| APIs, these updates are performed atomically as part of the integration. However |
| the changes performed here only guarantee that the internal build is not broken, |
| which means that such integrations may very well break the OSS build on the |
| `google` branch (in particular, it does not update the LLVM BUILD files). The |
| IREE build cop will fix the breakage on the `google` branch. We are continuing |
| to work on improving this situation. |
| |
| ### Tasks: |
| |
| #### Adding dependencies |
| |
| In general, adding dependencies will require coordination with Google engineers |
| to make the dependency available both on GitHub and in the Google source |
| repository. It is important to ask on the mailing list prior to expecting to |
| contribute such changes. |
| |
| #### Pushing dependency changes |
| |
| When working on a development branch, feel free to stage changes however makes |
| sense. However, when sending a PR, note that our integration systems will |
| overwrite the submodule version updates from the `SUBMODULE_VERSIONS.txt` file in |
| the repository root. Here is an example: |
| |
| ```text |
| 309de5988eb949a27e077a24a1d83c0687d10d57 third_party/benchmark |
| 97f3aa91746a7d207513a73725e92cee7c35bb87 third_party/flatbuffers |
| f2fb48c3b3d79a75a88a99fba6576b25d42ec528 third_party/googletest |
| a21beccea2020f950845cbb68db663d0737e174c third_party/llvm-project |
| 80d452484c5409444b0ec19383faa84bb7a4d351 third_party/pybind11 |
| b252a50953ac4375cb1864e94f4b0234db9d215d third_party/spirv_headers |
| 6652f0b6428777b5a4a3d191cc30d8b31366b999 third_party/swiftshader |
| 9b32b2db1142166b190ea30757f48d8dd0fb00e3 third_party/tensorflow |
| ba091ba6a947f79623b28fe8bfccdce1ab9fa467 third_party/vulkan_headers |
| 909f36b714c9239ee0b112a321220213a474ba53 third_party/vulkan_memory_allocator |
| ``` |
| |
| If bumping versions, you must include an update to this file with your commit. |
| To generate it, run: |
| |
| ```shell |
| # Performs a submodule sync+update and stages an updated SUBMODULE_VERSIONS.txt |
| # file. |
| $ ./scripts/git/submodule_versions.py export |
| ``` |
| |
| If you don't know if this is required, you may run: |
| |
| ```shell |
| # The check command is intended to eventually be usable as a git hook |
| # for verification of consistency between SUBMODULE_VERSIONS.txt and the |
| # corresponding local git state. |
| $ ./scripts/git/submodule_versions.py check |
| ``` |
| |
| #### Pulling dependency changes |
| |
| If you pull a change to `SUBMODULE_VERSIONS.txt` it is necessary to import it into |
| the current git state: |
| |
| ```shell |
| # Updates the commit hash of any entries in SUBMODULE_VERSIONS.txt that differ |
| # and stages the changes. |
| $ ./scripts/git/submodule_versions.py import |
| ``` |
| |
| This will stage any needed changes to the submodules to bring them up to date |
| with the `SUBMODULE_VERSIONS.txt`. If you have local changes, you may get conflicts |
| on the `submodule update` step at the end, and you will need to manually resolve |
| as usual. |
| |
| Any CI systems or other things that retrieve an arbitrary commit should invoke |
| this prior to running just to make sure that their git view of the submodule |
| state is consistent. |