使用Ninja+cl -showIncludes时如何减少终端冗余输出?
解决Ninja构建MSVC项目时-showIncludes输出刷屏的问题
方案1:升级Ninja版本
部分旧版本Ninja在使用deps=msvc模式时,不会自动抑制-showIncludes产生的Note: including file:行输出。升级到最新稳定版Ninja后,通常会自动捕获这些依赖信息而不将其打印到终端。
方案2:自定义依赖文件生成(替代内置msvc deps)
放弃Ninja内置的deps=msvc处理,手动生成符合Makefile格式的依赖文件,同时过滤刷屏输出:
- 编写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
- 修改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
相关产品推荐
相关产品推荐

