You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[CK] Fix the launch_tests script.
## Motivation
Fix the script that filters the tests.
## Technical Details
There were several places where the paths had to be updated for the
launch_tests script to work correctly.
## Test Plan
<!-- Explain any relevant testing done to verify this PR. -->
## Test Result
<!-- Briefly summarize test outcomes. -->
## Submission Checklist
- [ ] Look over the contributing guidelines at
https://github.com/ROCm/ROCm/blob/develop/CONTRIBUTING.md#pull-requests.
- Maps object files to their source and header dependencies using `ninja -t deps`.
10
10
- Constructs a reverse mapping from each file to all dependent executables.
11
-
-Handles multi-executable dependencies and supports parallel processing for scalability.
11
+
-Automatically detects monorepo structure (`projects/<name>/`) and scopes analysis accordingly.
12
12
- Exports results in CSV and JSON formats for integration with other tools.
13
13
14
14
## Features
15
15
16
16
-**Comprehensive Dependency Tracking**: Captures direct source file dependencies and, critically, all included header files via `ninja -t deps`.
17
17
-**Executable to Object Mapping**: Parses the `build.ninja` file to understand how executables are linked from object files.
18
-
-**Object to Source/Header Mapping**: Uses `ninja -t deps` for each object file to get a complete list of its dependencies.
18
+
-**Batch Dependency Extraction**: Runs a single `ninja -t deps` call (no arguments) to dump all dependency information at once, then filters in-memory. This avoids the massive overhead of per-object subprocess calls on large build files (e.g., a 246MB `build.ninja` with 29K+ objects completes in ~2 seconds instead of ~54 minutes).
19
+
-**Monorepo Awareness**: Automatically detects `projects/<project>/` paths, strips them to project-relative paths, and scopes `git diff` to only the relevant subtree.
19
20
-**File to Executable Inversion**: Inverts the dependency graph to map each file to the set of executables that depend on it.
20
-
-**Parallel Processing**: Utilizes a `ThreadPoolExecutor` to run `ninja -t deps` commands in parallel, significantly speeding up analysis for projects with many object files.
21
-
-**Filtering**: Option to filter out system files and focus on project-specific dependencies.
21
+
-**Filtering**: Filters out system files (`/usr/`, `/opt/rocm/`, etc.) and focuses on project-specific dependencies.
22
22
-**Multiple Output Formats**:
23
-
-**CSV**: `enhanced_file_executable_mapping.csv` - A comma-separated values file where each row lists a file and a semicolon-separated list of executables that depend on it.
24
-
-**JSON**: `enhanced_dependency_mapping.json` - A JSON file representing a dictionary where keys are file paths and values are lists of dependent executables.
23
+
-**CSV**: `enhanced_file_executable_mapping.csv` - Each row lists a file and a semicolon-separated list of dependent executables.
24
+
-**JSON**: `enhanced_dependency_mapping.json` - Includes file-to-executable mapping, executable-to-file mapping, repo metadata, and statistics.
25
25
-**Robust Error Handling**: Includes error handling for missing files and failed subprocess commands.
26
26
27
27
## Prerequisites
28
28
29
29
-**Python 3.7+**
30
30
-**Ninja build system**: The `ninja` executable must be in the system's PATH or its path provided as an argument.
31
-
- A **Ninja build directory** containing a `build.ninja` file and the compiled object files. The project should have been built at least once.
31
+
- A **Ninja build directory** containing a `build.ninja` file. The project should have been built at least once (even partially) so that `ninja -t deps` has dependency data.
32
+
33
+
## Quick Start with launch_tests.sh
34
+
35
+
The easiest way to use this tool is via the `launch_tests.sh` wrapper script:
36
+
37
+
```bash
38
+
# From the monorepo root (or anywhere):
39
+
script/launch_tests.sh /path/to/build-dir
40
+
41
+
# Uses default build dir (<CK_ROOT>/build) if no argument given:
42
+
script/launch_tests.sh
43
+
```
44
+
45
+
This script:
46
+
1. Discovers the git root (monorepo root) automatically.
47
+
2. Runs the dependency parser against `build.ninja`.
48
+
3. Runs `git diff` between `origin/develop` and the current branch (scoped to CK files only).
49
+
4. Maps changed files to affected tests/examples.
50
+
5. Runs the affected tests via `ctest` in chunks.
51
+
52
+
Environment variables:
53
+
-`CTEST_CHUNK_SIZE`: Number of tests per ctest invocation (default: 10).
54
+
-`CTEST_FAIL_FAST`: Set to `true` to stop on first failure (default: `false`).
32
55
33
56
## Using CMake with Ninja
34
57
35
-
To use this tool effectively, your C++ project should be configured with CMake to generate Ninja build files and dependency information. Follow these steps:
58
+
To use this tool effectively, your C++ project should be configured with CMake to generate Ninja build files:
36
59
37
-
1.**Configure CMake to use Ninja and generate dependencies:**
**Note:**Always run Ninja to ensure all dependencies are up to date before invoking the parser. If you change source files or headers, re-run Ninja first.
85
+
**Note:**`--workspace-root` should point to the **git root** (monorepo root) for correct monorepo detection. If omitted, it defaults to `..` relative to the build directory.
57
86
58
87
## Usage
59
88
60
-
All features are available via the unified main.py CLI:
89
+
All features are available via the unified `main.py` CLI:
|`--all`| No | Include all affected executables (default) |
121
+
|`--test-prefix`| No | Only include executables starting with `test_`|
122
+
|`--output`| No | Output JSON file (default: `tests_to_run.json`) |
94
123
95
124
## How It Works
96
125
97
-
1. **Initialization**:
98
-
* Takes the path to `build.ninja` and optionally the `ninja` executable.
99
-
* Sets up internal data structures to store mappings.
100
-
101
-
2. **Build File Parsing (`_parse_build_file`)**:
102
-
* Reads the `build.ninja` file.
103
-
* Uses regular expressions to identify rules for linking executables (e.g., `build my_exe: link main.o utils.o`) and compiling object files (e.g., `build main.o: cxx ../src/main.cpp`).
104
-
* Populates `executable_to_objects` (mapping an executable name to a list of its .o files) and `object_to_source` (mapping an object file to its primary source file).
* For a given object file (e.g., `main.o`), it runs the command: `ninja -t deps main.o`in the build directory.
113
-
* This command outputs a list of all files that `main.o` depends on, including its primary source (`main.cpp`) and all headers (`*.h`, `*.hpp`) it includes directly or indirectly.
114
-
* The output is parsed, cleaned, and returned as a list of file paths.
115
-
116
-
5. **Building Final File-to-Executable Mapping (`_build_file_to_executable_mapping`)**:
117
-
* This is the core inversion step. It iterates through each executable and its associated object files.
118
-
* For each object file, it looks up the full list of its dependencies (source and headers) obtained in step 3 & 4.
119
-
* For every dependent file found, it adds the current executable to that file's entry in the `file_to_executables` dictionary.
120
-
* If `filter_project_files` is enabled, it checks each dependency against a list of common system paths (e.g., `/usr/include`, `_deps/`) and excludes them if they match.
121
-
122
-
6. **Filtering (`_is_project_file`)**:
123
-
* A helper function to determine if a given file path is likely a project file or a system/external library file. This helps in focusing the dependency map on the user's own codebase.
124
-
125
-
7. **Output Generation**:
126
-
***`export_to_csv(csv_file)`**: Writes the `file_to_executables` mapping to a CSV file. Each row contains a file path and a semicolon-delimited string of executable names.
127
-
***`export_to_json(json_file)`**: Dumps the `file_to_executables` mapping (where the set of executables is converted to a list) into a JSON file.
128
-
***`print_summary()`**: Prints a summary of the findings, including the number of executables, object files, source files, and header files mapped.
126
+
1. **Build File Parsing (`_parse_build_file`)**:
127
+
* Reads the `build.ninja` file (~246MB for the full CK monorepo build).
128
+
* Uses regular expressions to identify executable link rules and object compilation rules.
129
+
* Populates `executable_to_objects` and `object_to_source` mappings.
- **Impact Analysis**: Determine which executables (especially tests) need to be rebuilt or re-run when a specific source or header file changes.
154
-
- **Build Optimization**: Understand the dependency structure to potentially optimize build times.
189
+
- **Selective CI/CD Testing**: Run only the tests affected by a PR's changes, cutting CI time dramatically.
190
+
- **Impact Analysis**: Determine which executables need to be rebuilt when a header changes.
191
+
- **Build Optimization**: Identify which targets are affected by a set of file changes.
155
192
- **Code Auditing**: Get a clear overview of how files are used across different executables.
156
-
- **Selective Testing**: Integrate with CI/CD systems to run only the tests affected by a given set of changes.
157
193
158
194
## Limitations
159
195
160
196
- Relies on the accuracy of Ninja's dependency information (`ninja -t deps`). If the build system doesn't correctly generate `.d` (dependency) files, the header information might be incomplete.
161
-
- The definition of "project file" vs. "system file" is based on a simple path-based heuristic and might need adjustment for specific project structures.
162
-
- Performance for extremely large projects (tens of thousands of object files) might still be a consideration, though parallelization helps significantly.
197
+
- Only objects that have been **actually built** will have dependency data. A partial build means partial coverage of the dependency map.
198
+
- The definition of "project file" vs. "system file" is based on a path-based heuristic and might need adjustment for other project structures.
163
199
164
200
## Troubleshooting
165
201
166
-
- **"ninja: command not found"**: Ensure `ninja` is installed and in your PATH, or provide the full path to the executable as the second argument.
202
+
- **"ninja: command not found"**: Ensure `ninja` is installed and in your PATH, or provide the full path via `--ninja`.
167
203
- **"build.ninja not found"**: Double-check the path to your `build.ninja` file.
168
204
- **Empty or Incomplete Output**:
169
205
* Make sure the project has been successfully built at least once. `ninja -t deps` relies on information generated during the build.
170
-
* Verify that your CMake (or other meta-build system) is configured to generate dependency files for Ninja.
171
-
- **Slow Performance**: For very large projects, the number of `ninja -t deps` calls can be substantial. While parallelized, it can still take time. Consider if all object files truly need to be analyzed or if a subset is sufficient for your needs.
172
-
173
-
This tool provides a powerful way to gain deep insights into your Ninja project's dependency structure, enabling more intelligent build and test workflows.
206
+
* Verify that your CMake is configured to generate dependency files for Ninja (`-G Ninja`).
207
+
- **JSON shows `"type": "component"` instead of `"monorepo"`**: Ensure `--workspace-root` points to the **git/monorepo root**, not the CK project root. The parser needs to see `projects/<name>/` in the dependency paths to detect monorepo mode.
0 commit comments