blob: 7adea1c0f7f3d0888a63bd3483323c2e921860ee [file] [view] [edit]
# Bootstrapping Design for `fx ide-query`
This document details the self-bootstrapping mechanism used by the `fx ide-query` tool.
## Overview
The `ide-query` tool is implemented in Go but is triggered via a shell script wrapper at `//tools/devshell/ide-query`. This wrapper handles the compilation of the Go source on-demand, caching the resulting binary for subsequent executions.
This design mirrors the approach taken by other core `fx` tools like `fx set`.
## Initial Goal
The first step is to implement a minimal "Hello World" version of the Go tool. This ensures the bootstrapping logic (compilation, caching, and execution) is functional before any real query logic is added.
## Rationale
- **Performance**: Compiled Go binaries are faster than `go run` for complex tools.
- **Decoupling**: The tool can be built and run even if the main GN/Ninja build is in a broken or unconfigured state.
- **Workflow Integration**: It allows rapid iteration via a `--dev` flag to force recompilation without waiting for a full `fx build`.
## Bootstrapping Steps
The shell script wrapper performs the following steps:
1. **Environment Initialization**: Sources `//tools/devshell/lib/vars.sh` to define `${FUCHSIA_DIR}`, `${FX_CACHE_DIR}`, and find the prebuilt Go toolchain.
2. **Lazy Build Check**:
- Compares the current git revision (`git rev-parse HEAD`) with a value stored in `${FX_CACHE_DIR}/ide-query.revision`.
- If the revision differs, the binary is missing, or the `--dev` flag is set, a rebuild is triggered.
3. **Source Preparation**:
- Creates a temporary build directory.
- Symlinks the necessary Go module metadata (`go.mod`, `go.sum`, `vendor`) from `//third_party/golibs`.
- Symlinks required Fuchsia internal libraries (e.g., `//tools`).
4. **Compilation**:
- Runs `go build` using the prebuilt Go binary.
- Disables network access and CGO (`GOPROXY=off`, `CGO_ENABLED=0`).
- Outputs the binary to `${FX_CACHE_DIR}/ide-query.bin`.
5. **Execution**: Executes the binary with any arguments passed to the script.
## Assumptions
- **Prebuilt Go**: Assumes the Fuchsia prebuilt Go toolchain is available in `${PREBUILT_GO_DIR}`.
- **Vendored Dependencies**: Relies on third-party dependencies being vendored in `//third_party/golibs`.
- **Cache Directory**: Assumes `${FX_CACHE_DIR}` exists and is writable.
- **Host Platform**: Currently assumes the host platform is Linux (mirroring Fuchsia development requirements).
## Testing Plan
To maintain high quality and correctness, the following testing strategies will be used:
### 1. Basic Unit Tests
All logic inside `//scripts/cog/ide_query` should be covered by standard Go unit tests (`*_test.go`).
- **Execution**: Tests will be run using `go test ./scripts/cog/ide_query/...`.
- **Mocking**: Use mock file systems or interfaces for testing code that interacts with the Fuchsia source tree.
### 2. GN-Based Tests
A `BUILD.gn` will be added to the directory to allow the tool to be tested by Fuchsia's standard infrastructure.
- **Target**: A `go_test` target will be defined to run unit tests as part of `fx test`.
- **Verification**: This ensures the tool's dependencies and logic are compatible with the broader Fuchsia build graph.
### 3. Bootstrap Integration Tests
The shell script wrapper's ability to compile and run the tool will be verified by:
- Running `fx ide-query --dev` and verifying it prints "Hello World".
- Modifying the source and ensuring `fx ide-query --dev` reflects the change.