Files
build_infra/Graphviz/Cmake_Target_Graph.ps1.in
T
2026-07-28 10:54:38 +08:00

65 lines
2.5 KiB
Plaintext

$ErrorActionPreference = 'Stop'
$targets = @PSC_TARGETS@
$edges = @PSC_TARGET_EDGES@
$outputDir = '@PSC_OUTPUT_DIR@'
$format = '@PSC_FORMAT@'
$dotExe = '@PSC_DOT_EXECUTABLE@'
New-Item -ItemType Directory -Force -Path $outputDir | Out-Null
function Convert-To_Dot_Text([string]$text) {
return $text.Replace('"', '\"')
}
$lines = [System.Collections.Generic.List[string]]::new()
$lines.Add('digraph "radio cmake_targets" {')
$lines.Add('rankdir=LR;')
$lines.Add('splines=ortho;')
$lines.Add('concentrate=true;')
$lines.Add('forcelabels=true;')
$lines.Add('graph [fontname="Consolas", label="radio cmake_targets", labelloc=t, fontsize=18];')
$lines.Add('node [shape=box, style="rounded,filled", fontname="Consolas", fontsize=10];')
$lines.Add('edge [fontname="Consolas", fontsize=9];')
foreach ($target in $targets) {
$safe = Convert-To_Dot_Text $target
$lines.Add('"' + $safe + '" [label="' + $safe + '", tooltip="' + $safe + '", fillcolor="#dcfce7"];')
}
foreach ($edge in $edges) {
$parts = $edge.Split('|')
if ($parts.Count -eq 2) {
$left = Convert-To_Dot_Text $parts[0]
$right = Convert-To_Dot_Text $parts[1]
$lines.Add('"' + $left + '" -> "' + $right + '" [xlabel="links"];')
}
}
$lines.Add('subgraph cluster_legend {')
$lines.Add('label="legend";')
$lines.Add('style="rounded,dashed";')
$lines.Add('"legend_target" [label="cmake target", fillcolor="#dcfce7"];')
$lines.Add('"legend_edge" [label="edge = target_link_libraries / target dependency", fillcolor="#f8fafc"];')
$lines.Add('}')
$lines.Add('}')
$dotFile = Join-Path $outputDir 'radio_cmake_targets.dot'
$imageFile = Join-Path $outputDir ('radio_cmake_targets.' + $format)
Set-Content -LiteralPath $dotFile -Value $lines -Encoding UTF8
& $dotExe ('-T' + $format) $dotFile '-o' $imageFile
if ($LASTEXITCODE -ne 0) {
exit $LASTEXITCODE
}
$items = @(
'radio_directory_tree',
'radio_module_dependency',
'radio_cmake_targets',
'radio_include_dependency',
'radio_render_architecture'
)
$html = [System.Collections.Generic.List[string]]::new()
$html.Add('<!doctype html><meta charset="utf-8"><title>Radio Graphviz</title><h1>Radio Graphviz</h1><ul>')
foreach ($item in $items) {
$file = $item + '.' + $format
if (Test-Path -LiteralPath (Join-Path $outputDir $file)) {
$html.Add('<li><a href="' + $file + '">' + $item + '</a></li>')
} else {
$html.Add('<li>' + $item + ' (not generated)</li>')
}
}
$html.Add('</ul>')
Set-Content -LiteralPath (Join-Path $outputDir 'index.html') -Value $html -Encoding UTF8