# Build Workspace

> Build the `geniesim_ros` colcon workspace inside the Genie Sim Docker container using the `geniesim ros build` CLI verb. Produces the `./devel` overlay that every `ros2 launch genie_sim_bringup …` step depends on. Trigger: When the user asks to "build ros workspace", "编译 ros 工作空间", "colcon build", "build genie_sim_bringup", "set up the ROS overlay", or after a fresh `geniesim docker into` shell where the workspace isn't sourced yet.

- Skill: `agibottech/build-workspace` (Agent Skill)
- Install (CLI): `npx skillmds@latest add agibottech/build-workspace`
- Raw SKILL.md: https://api.skillmd.com/api/skills/agibottech/build-workspace/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- License: MPL-2.0
- Author: agibottech (https://skillmd.com/u/agibottech)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/agibottech/build-workspace

---


## When to Use

- First time entering the container in a fresh checkout.
- After pulling new commits that touched any package under
  `source/geniesim_ros/src/ros_ws/src/`.
- After running `geniesim ros build cleanup` and you want to rebuild
  from scratch.
- Before invoking the `launch-scene` skill (its `ros2 launch …` step
  needs the workspace sourced).

Do **not** use for:
- Installing the wheel layout that ships with `pip install geniesim_ros`
  — that's already built; just `source` the install tree.
- Building a Release wheel for deploy → use `geniesim deploy geniesim_ros`.

## Critical Patterns

1. **Run inside the container.** The colcon toolchain and rosdep tree
   live in the Isaac Sim + Jazzy image; outside the container the
   build will pick up the wrong Python / Boost / Eigen.
2. **Dev vs Release.** `geniesim ros build dev` produces a
   `RelWithDebInfo` + `--symlink-install` overlay at `./devel`,
   `./devel_build`, `./devel_log` (intentionally namespaced so they
   can't collide with a release build under `./install`).
   `geniesim ros build release` is for deploy, not for iteration.
3. **Always `source devel/setup.bash` after building.** The shell
   environment doesn't carry the overlay automatically.
4. **rosdep first if anything fails.** Missing apt-side dependencies
   are the #1 source of "package not found" build errors — run
   `geniesim ros doctor` before re-trying the build.

## Workflow

### Step 1 — Confirm you're inside the container

```bash
geniesim status                       # should report all distributions OK
echo $ROS_DISTRO                      # should print "jazzy"
```

If `$ROS_DISTRO` is empty, you're on the host — `geniesim docker into`
first.

### Step 2 — (optional) Repair rosdep

```bash
geniesim ros doctor                   # check & fix rosdep deps
```

### Step 3 — Build

```bash
cd /workspace                         # repo root (mounted by `geniesim docker up`)
geniesim ros build dev                # RelWithDebInfo + symlink-install -> ./devel
```

Iteration loop after editing C++ / xacro / launch files:

```bash
geniesim ros build dev                # re-runs incrementally thanks to symlink-install
```

### Step 4 — Source the overlay

```bash
source devel/setup.bash
```

Verify:

```bash
ros2 pkg list | grep genie_sim         # should list the 10 genie_sim_* packages
```

### Step 5 — Cleanup (only when something is wedged)

```bash
geniesim ros build cleanup             # interactive prompt before removing devel*/build/install/log
```

## Commands (copy-paste summary for the user)

```bash
# Inside the container, from the repo root:
geniesim ros doctor                    # optional — fix rosdep first
geniesim ros build dev                 # build the overlay
source devel/setup.bash                # overlay the built workspace
ros2 pkg list | grep genie_sim         # sanity check
```

## Notes

- `geniesim ros build` is a thin wrapper around `colcon build` — the
  same flags work if you call colcon directly, but the CLI sets the
  right `CMAKE_BUILD_TYPE`, picks up `$GENIESIM_WORKSPACE`, and routes
  output to the namespaced `./devel*` dirs.
- `geniesim ros graph` writes `colcon graph` to `geniesim_graph.png`
  in the cwd — handy when you need to reason about which packages
  pull in which.
- The bundled workspace is also installed system-wide via
  `pip install geniesim_ros`; that path is fine for *running* but not
  for iterating — every edit needs a rebuild, and `pip` won't pick up
  a symlink-install layout.

## Resources

- **CLI dispatcher**: [source/geniesim_cli/src/geniesim_cli/commands/ros.py](../../../geniesim_cli/src/geniesim_cli/commands/ros.py)
- **Workspace root**: [source/geniesim_ros/src/ros_ws/](../../src/ros_ws/)
- **Package routing**: [source/geniesim_ros/AGENTS.md](../../AGENTS.md)

