blob: 5fdeee4be3c198ab2690e64a3551ce0bac0af43b [file] [log] [blame] [view]
# IREE Developer Tools
This directory contains command-line tools that developers add to their PATH for
convenient access across all IREE worktrees. Tools here provide streamlined
workflows for building, testing, and experimenting with IREE.
**Naming convention**: All tools must be prefixed with `iree-` to avoid PATH
conflicts. Do not use names that conflict with existing IREE tools (e.g., don't
name something `iree-run-module` or `iree-compile`).
## Setup
Add this directory to your PATH:
```bash
export PATH="$PATH:$PWD/build_tools/bin"
```
Or add to your shell configuration for persistence.
---
## Bazel Tools
Wrapper tools for building IREE with Bazel. These handle configuration, provide
better defaults, and work from any subdirectory within a worktree.
For complete Bazel build documentation, see:
[Building with Bazel](../../docs/website/docs/developers/building/bazel.md)
### Quick Start
```bash
# Configure once per worktree
iree-bazel-configure
# Build
iree-bazel-build //tools:iree-compile
# Test
iree-bazel-test //runtime/src/iree/base:status_test
# Run
iree-bazel-run //tools:iree-compile -- --help
```
> **Tip: Working with Claude Code?**
>
> All `iree-bazel-*` tools provide machine-readable documentation via `--agent_md`:
>
> ```shell
> # Generate documentation for Claude
> iree-bazel-configure --agent_md >> CLAUDE.local.md
> ```
>
> This appends concise tool documentation to your local Claude instructions,
> teaching Claude how to use the `iree-bazel-*` tools in your project.
### Tools
| Tool | Description |
|------|-------------|
| `iree-bazel-configure` | Configure IREE for Bazel builds (run once per worktree) |
| `iree-bazel-build` | Build targets |
| `iree-bazel-test` | Run tests |
| `iree-bazel-run` | Build and run executables from current directory |
| `iree-bazel-query` | Query the build graph |
| `iree-bazel-cquery` | Configuration-aware query (resolved select(), actual targets) |
| `iree-bazel-try` | Compile and run C/C++ snippets without BUILD files |
| `iree-bazel-fuzz` | Run libFuzzer targets with persistent corpus |
| `iree-bazel-lib` | Shared library (sourced by other tools) |
### Common Options
All tools support:
- `-h, --help` - Show help
- `-n, --dry_run` - Show command without executing
- `-v, --verbose` - Verbose output
Short flags can be combined: `-nv` is equivalent to `-n -v`.
### Configuration
Driver configuration happens during `iree-bazel-configure`:
```bash
# Enable CUDA driver
IREE_HAL_DRIVER_CUDA=ON iree-bazel-configure
# Enable multiple drivers
IREE_HAL_DRIVER_CUDA=ON IREE_HAL_DRIVER_VULKAN=ON iree-bazel-configure
```
### Output Directories
Built artifacts are placed in standard Bazel output directories at the repo root:
- `bazel-bin/` - Built executables and libraries
- `bazel-testlogs/` - Test outputs and logs
- `bazel-out/` - Full build tree
### Watch Mode
Several tools support watch mode (`-w`) which rebuilds/reruns on file changes:
```bash
iree-bazel-build -w //tools:iree-opt # Rebuild on changes
iree-bazel-test -w //runtime/...:test # Rerun tests on changes
iree-bazel-run -w //tools:iree-opt -- input.mlir # Restart on changes
```
Watch mode requires [ibazel](https://github.com/bazelbuild/bazel-watcher).
### Quick Experiments with iree-bazel-try
Compile and run C/C++ snippets against IREE without writing BUILD files:
```bash
# Quick API exploration
iree-bazel-try -e '
#include "iree/base/api.h"
#include <stdio.h>
int main() {
printf("ok: %d\n", iree_status_is_ok(iree_ok_status()));
return 0;
}'
# Run tests
iree-bazel-try -e '
#include "iree/testing/gtest_harness.h"
TEST(Status, Ok) { IREE_EXPECT_OK(iree_ok_status()); }
'
# MLIR transforms
echo 'func.func @f() { return }' | iree-bazel-try -e '
#include "iree/compiler/Tools/MlirTransformHarness.h"
void xform(ModuleOp m) { m.walk([](Operation *op) { llvm::outs() << op->getName() << "\n"; }); }
MLIR_TRANSFORM_MAIN_NO_PRINT(xform)
'
```
Run `iree-bazel-try --help` for full documentation.