如何在Ninja构建系统的多输出规则中指定特定输出?
在Ninja规则中指定多个输出中的特定项
你遇到的核心问题是Ninja不支持$out1这种变量语法,导致命令中的该变量被替换为空,触发shell语法错误;同时原build语句的格式也存在问题,影响了输出目标的解析。
解决方案
方案一:修正变量语法与build格式
Ninja中引用多个输出里的单个目标,需使用${out[N]}语法(索引N从0开始)。同时修正build语句的格式,正确列出输出目标:
- 修正后的规则定义:
rule test3_r command = ./$in > ${out[1]}; open ${out[1]} description = "tests by making gif and then display"
- 修正后的构建规则(添加
.PHONY标记伪目标):
.PHONY: test3 build test3 out.gif: test3_r $exefile
方案二:拆分伪目标与实际输出(更清晰)
将test3作为伪目标,单独依赖实际输出out.gif,这样规则仅需处理单个输出,逻辑更简洁:
.PHONY: test3 # 伪目标test3触发out.gif的构建 build test3: phony out.gif # 实际生成out.gif的规则 build out.gif: test3_r $exefile rule test3_r command = ./$in > $out; open $out description = "tests by making gif and then display"
错误原因说明
- Ninja没有
$out1这类变量,多个输出的单个项必须用${out[索引]}语法,索引从0开始(你的场景中test3是第0个输出,out.gif是第1个)。 - 原build语句的格式错误(每行输出后加
$),导致Ninja无法正确解析输出目标列表,进而变量替换失败。 - 添加
.PHONY标记test3,是告知Ninja这是伪目标,无需生成实际文件,避免不必要的文件存在性检查。
内容的提问来源于stack exchange,提问作者netskink
相关产品推荐
相关产品推荐

