构建 Makefile 工程
适用场景
Project Profile中标明build_system: makefile。- 工作区存在
Makefile/makefile/GNUmakefile,但没有CMakeLists.txt、platformio.ini、.uvprojx或.ewp。 - 用户希望对裸 Makefile MCU 工程执行编译或确认固件产物。
- 烧录或调试流程需要新的
ELF、HEX或BIN。
必要输入
- 工作区路径,或一份已有的
Project Profile。 - 可选的 make 目标名、额外变量(如
CROSS_COMPILE、MCU)、make 标志和并行任务数。
自动探测
- 脚本启动即自动复用工程根目录
.em_skill.json中上次成功的 profile 作为默认参数(显式参数优先,无需先手动传--resume);--resume仅用于断言缓存必须存在,无缓存则非零退出。无缓存或用户明确要求重新探测时,脚本自动回退到正常扫描。 - 若工作区根目录存在
Makefile/makefile/GNUmakefile,脚本自动识别。 - 解析 Makefile 变量:
CROSS_COMPILE、CC、TARGET、MCU、BOARD、CFLAGS、LDFLAGS等。 - 从
CROSS_COMPILE前缀推断工具链家族(arm-none-eabi-→gnu-arm,riscv32-unknown-elf-→gnu-riscv,xtensa-esp32-elf-→gnu-esp)。 - 从
MCU变量、-mcpu=标志或链接脚本名推断目标芯片。 - 检测
make/gmake/mingw32-make是否可用。 - 若 Makefile 包含
# Generated by CMake,提示用户使用build-cmakeskill。
执行步骤
- 先阅读 references/usage.md,确认本次是环境探测、解析 Makefile、列出目标、执行构建,还是仅扫描产物。
- 若不确定环境是否就绪,先运行自带脚本 scripts/makefile_builder.py 的
--detect模式确认。 - 运行
--parse-makefile检查解析出的变量和工具链信息,确认目标芯片和编译器。 - 若需查看可用目标,运行
--list-targets。 - 使用
--source运行构建,按需指定--target、--clean、--extra-args和-j。 - 读取脚本输出的构建结果和产物扫描报告,将产物路径写回
Project Profile并交给下游 skill。
失败分流
- 当缺少
make或交叉编译器时,返回environment-missing。 - 当 Makefile 语法错误、链接失败或目标名无效时,返回
project-config-error。 - 当构建成功但未在源目录及
build/、output/、out/中找到可烧录产物时,返回artifact-missing。 - 当工作区存在多个顶层 Makefile 且意图不明确时,返回
ambiguous-context。
平台说明
- Linux / macOS 上
make通常已预装。 - Windows 上需要 MSYS2、MinGW 或 WSL 提供
make。脚本会依次尝试make、gmake、mingw32-make。 - 输出中的构建目录应保持为绝对路径,方便下游烧录和调试 skill 直接复用。
输出约定
- 输出构建命令、构建目录、解析的工具链信息和首选产物路径。
- 用
artifact_path、artifact_kind、toolchain和target_mcu更新Project Profile。 - 成功后推荐
flash-openocd、flash-jlink或debug-gdb-openocd。
交接关系
- 当下一步意图是给硬件烧录程序时,将成功构建结果交给
flash-openocd或flash-jlink。 - 当下一步需要符号信息或调试会话时,将成功构建结果交给
debug-gdb-openocd或debug-jlink。