blob: 95171033ed7d371a92cbadc2c1116d0f451aa745 [file] [view]
# Build Verification for `fx ide-query`
This document outlines the design for verifying that source files and their generated dependencies are correctly built. This ensures that IDEs have access to fresh artifacts (like FIDL-generated headers) before performing analysis.
## Overview
To provide a consistent and isolated analysis environment, `ide-query` uses a dedicated "shadow" build directory. This prevents IDE-triggered builds from interfering with, locking, or dirtying the user's primary build directory.
## Shadow Build Directory
The tool will use a specific directory for all analysis-related builds:
- **Path**: `out/.ide-analysis` (relative to the Fuchsia root).
- **Rationale**: Since the tool runs in a network-mounted file system (Cog), disk space is not a primary concern. Using a dedicated directory allows for a clean separation of build artifacts.
## Build Workflow
The build verification process follows these steps:
### 1. Synchronization and Setup
Before any build is attempted, the shadow directory must be configured to match the user's current build environment:
1. **Locate `args.gn`**: Find the `args.gn` file in the user's primary `BuildDir` (as determined by `WORKSPACE_CONTEXT_DESIGN.md`).
2. **Verify Configuration**: If `args.gn` is missing in the primary build directory (indicating the user has not configured a build with `fx set`), the tool will report an `AnalysisError`.
3. **Sync `args.gn`**:
- Compare `${BuildDir}/args.gn` with `out/.ide-analysis/args.gn`.
- If they differ, or if the shadow directory does not exist:
- Copy `args.gn` to the shadow directory.
- Execute `fx --dir out/.ide-analysis gen` to regenerate the Ninja files.
### 2. Identifying Targets
The tool identifies the GN labels for all requested files as described in `BUILD_TARGETS_DESIGN.md`.
### 3. Executing the Build
To accurately report build failures for each file, targets are built individually. The tool iterates through each unique target and executes `fx --dir out/.ide-analysis build <target>`. While this is less parallel than a single multi-target build, it prevents a single failing target from obscuring the status of other targets.
1. **Collect Targets**: Filter for all unique, known GN labels.
2. **Run Build**: For each unique target, execute `fx --dir out/.ide-analysis build <target>`.
3. **Capture Failures**: If the build fails for a target, the tool marks all files associated with that target as failed.
## Error Handling and Reporting
The results are reported back to the IDE via two fields in the `FileEntry` structure.
### `AnalysisError` (string)
This field is used for terminal errors that prevent the tool from progressing to the build phase. If this is set, the `AnalysisResult` is typically omitted.
**Scenarios**:
- Fuchsia root or build directory not provided/found.
- `args.gn` missing in the primary build directory.
- `compile_commands.json` is missing or unreadable.
- Internal tool errors (e.g., failure to execute `fx gen`).
### `AnalysisResult` (object)
This field captures the outcome of the build attempt for a specific file.
```go
type AnalysisStatus string
const (
StatusOk AnalysisStatus = "OK"
StatusNotFound AnalysisStatus = "NOT_FOUND"
StatusBuildFailed AnalysisStatus = "BUILD_FAILED"
StatusUnknown AnalysisStatus = "UNKNOWN"
)
type AnalysisResult struct {
Status AnalysisStatus `json:"status"`
Message string `json:"message,omitempty"`
}
```
**Status Mapping**:
- **`OK`**: The building of the target(s) associated with the file succeeded.
- **`NOT_FOUND`**: The file itself does not exist on disk.
- **`BUILD_FAILED`**: Ninja reported an error specifically while building the targets for this file.
- **Message**: Instead of the full Ninja log, the message will succinctly state: `"File failed to build."`
- **`UNKNOWN`**: The file was not found in `compile_commands.json` and heuristics failed to identify a target.
## Consistency and Performance
- **Deduplication**: Even if 10 files belong to the same target, they are only built once.
- **Incrementalism**: Ninja naturally handles incremental builds in the shadow directory, ensuring that subsequent queries are fast.
- **Isolation**: By passing `--dir out/.ide-analysis` to `fx` commands, we ensure that no side effects impact the user's primary development workflow.