# Gcc

GCC 嵌入式工程构建工具（CMake + arm-none-eabi-gcc），用于扫描 CMake 型嵌入式工程、 列出预设、配置、编译、重建、清理和分析 ELF...

- Repository: https://github.com/zhinkgit/embeddedskills (777 stars)
- Category: Engineering
- License: MIT
- Last updated: 2026-10-20
- Runs scripts: yes, review before use

## Install

Claude Code: `npx skills add zhinkgit/embeddedskills --skill gcc -g -a claude-code -y`
Codex: `npx skills add zhinkgit/embeddedskills --skill gcc -g -a codex -y`
Cursor: `npx skills add zhinkgit/embeddedskills --skill gcc -g -a cursor -y`
Gemini CLI: `npx skills add zhinkgit/embeddedskills --skill gcc -g -a gemini-cli -y`

## Description

GCC 嵌入式工程构建工具（CMake + arm-none-eabi-gcc），用于扫描 CMake 型嵌入式工程、 列出预设、配置、编译、重建、清理和分析 ELF 大小。当用户提到 GCC、arm-none-eabi、 CMake 嵌入式编译、Ninja 构建、ELF 大小分析、arm-gcc、交叉编译、cmake --build、 cmake --preset 时自动触发，也兼容 /gcc 显式调用。即使用户只是说"编译一下"或 "看看固件多大"，只要上下文涉及 CMake 嵌入式 GCC 工程就应触发此 skill。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# GCC 嵌入式工程构建

本 skill 提供基于 CMake + arm-none-eabi-gcc 的嵌入式工程发现、preset 枚举、配置生成、增量编译、全量重建、清理和 ELF 大小分析能力。

范围说明：当前仅支持 **CMake 型** GCC 嵌入式工程，不覆盖纯 `Makefile` 工程。

## 配置

### 环境级配置（skill/config.json）

skill 目录下的 `config.json` 包含环境级配置，首次使用前确认 `cmake_exe` 路径正确：

```json
{
  "cmake_exe": "cmake",
  "toolchain_prefix": "arm-none-eabi-",
  "toolchain_path": "",
  "operation_mode": 1
}
```

- `cmake_exe`：cmake 可执行文件路径，默认从 PATH 查找
- `toolchain_prefix`：工具链前缀，默认 `arm-none-eabi-`，用于定位 size 等工具
- `toolchain_path`：工具链 bin 目录，为空时从 PATH 查找
- `operation_mode`：`1` 直接执行 / `2` 输出风险摘要但不阻塞 / `3` 执行前确认

### 工程级配置（workspace/.embeddedskills/config.json）

工程级共享配置统一保存在工作区的 `.embeddedskills/config.json` 中：

```json
{
  "gcc": {
    "project": "",
    "preset": "",
    "log_dir": ".embeddedskills/build"
  }
}
```

- `project`：默认工程路径（相对 workspace），构建成功后会自动更新
- `preset`：默认 CMake preset 名称，构建成功后会自动更新
- `log_dir`：构建日志输出目录，默认 `.embeddedskills/build`

### 参数解析优先级

参数解析顺序（从高到低）：
1. CLI 显式参数
2. 环境级配置（skill/config.json）
3. 工程级配置（.embeddedskills/config.json）
4. state.json（上次构建记录）
5. 搜索/询问

冲突解决规则：同一参数存在多个来源时，以序号最小的来源为准；高序号来源仅在低序号来源未提供该参数时生效。例如：CLI 已指定 `--preset Debug`，则忽略 state.json 中记录的上次 preset。

## 子命令

| 子命令 | 用途 | 风险 |
|--------|------|------|
| `scan` | 搜索当前目录下的 CMake 嵌入式工程 | 低 |
| `presets` | 列出 CMakePresets.json 中的 configure/build preset | 低 |
| `configure` | 执行 `cmake --preset` 生成构建系统 | 中 |
| `build` | 增量编译 `cmake --build` | 中 |
| `rebuild` | 清理后全量重建 | 中 |
| `clean` | 清理构建目录 | 高 |
| `size` | 分析 ELF 文件大小（text/data/bss 和内存使用） | 低 |

## 执行流程

1. 读取 `config.json`，确认 `cmake_exe` 路径有效
2. 未提供有效子命令时默认执行 `scan`
3. 未提供工程路径时先执行 `scan` 搜索工程
4. 发现多个工程或多个 preset 时列出选项让用户选择，绝不自动猜测
5. `configure/build/rebuild/clean` 按 `operation_mode` 决定是否需要确认
6. `build` 前自动检测是否已 configure，未配置时提示先执行 configure
7. `build/rebuild` 成功后返回 `elf_file`，供 `jlink/openocd` 继续使用
8. `size` 默认分析最近一次构建产物的 .elf 文件

## 脚本调用

skill 目录下有三个 Python 脚本，使用标准库实现，无额外依赖。

### gcc_project.py, 工程扫描与 preset 枚举

The rest: https://github.com/zhinkgit/embeddedskills/blob/HEAD/gcc/SKILL.md
