You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Ninja+cl -showIncludes时如何减少终端冗余输出?

解决Ninja构建MSVC项目时-showIncludes输出刷屏的问题

方案1:升级Ninja版本

部分旧版本Ninja在使用deps=msvc模式时,不会自动抑制-showIncludes产生的Note: including file:行输出。升级到最新稳定版Ninja后,通常会自动捕获这些依赖信息而不将其打印到终端。

方案2:自定义依赖文件生成(替代内置msvc deps)

放弃Ninja内置的deps=msvc处理,手动生成符合Makefile格式的依赖文件,同时过滤刷屏输出:

  1. 编写PowerShell脚本gen_deps.ps1(放置在项目目录下):
param(
    [string]$TargetFile,
    [string]$TempOutputFile
)

$deps = @()
Get-Content $TempOutputFile | ForEach-Object {
    if ($_ -match '^Note: including file:\s*(.*)') {
        $deps += $matches[1].Trim()
    } else {
        Write-Host $_
    }
}

"$TargetFile: $($deps -join ' ')" | Out-File -FilePath "$TargetFile.dep" -Encoding ASCII
  1. 修改Ninja构建规则:
rule cc
  command=cl -EHsc -nologo -showIncludes -std:c++20 -MDd -W2 -WX -DPOSTGRES $ipath $in -c > $out.tmp 2>&1 && powershell -File gen_deps.ps1 $out $out.tmp && del $out.tmp
  depfile=$out.dep

此方案中,cl的所有输出先写入临时文件,脚本过滤出依赖信息生成标准依赖文件,同时将非依赖输出打印到终端,既保留自动依赖处理,又避免刷屏。

方案3:命令行直接过滤输出(无需额外脚本)

利用PowerShell管道直接在命令中处理输出,无需单独脚本:

rule cc
  command=powershell -Command "$out = '$out'; $output = cl -EHsc -nologo -showIncludes -std:c++20 -MDd -W2 -WX -DPOSTGRES $ipath $in -c 2>&1; $output | Where-Object { $_ -notmatch '^Note: including file:' } | Write-Host; $deps = $output | Where-Object { $_ -match '^Note: including file:\s*(.*)' } | ForEach-Object { $matches[1].Trim() }; if ($deps) { \"$out: $($deps -join ' ')\" | Out-File -FilePath $out.dep -Encoding ASCII }"
  depfile=$out.dep

该命令会先执行cl并捕获所有输出,将非依赖行打印到终端,提取依赖行生成标准依赖文件,Ninja通过depfile读取依赖信息。

内容的提问来源于stack exchange,提问作者rwallace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:40:38