Skip to content

Commit 6b728cd

Browse files
authored
Add source linking information during the build (#2857)
Copies source linking scripts and processes from Microsoft/Microsoft-UI-XAML. This embeds source information inside the PDBs in two formats: One for WinDBG using a PowerShell script that runs during the build, and one for Visual Studio using the Microsoft.SourceLink.GitHub NuGet pacakge. Sources are automatically pulled from raw.githubusercontent.com when debugging a release build inside either of these utilities as of this change.
1 parent 2c8b324 commit 6b728cd

22 files changed

+301
-49
lines changed

build/pipelines/templates/build-console-steps.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ steps:
5454
$Package = Get-ChildItem -Recurse -Filter "CascadiaPackage_*.msix"
5555
.\build\scripts\Test-WindowsTerminalPackage.ps1 -Verbose -Path $Package.FullName
5656
57+
- task: powershell@2
58+
displayName: 'Source Index PDBs'
59+
inputs:
60+
targetType: filePath
61+
filePath: build\scripts\Index-Pdbs.ps1
62+
arguments: -SearchDir '$(Build.SourcesDirectory)' -SourceRoot '$(Build.SourcesDirectory)' -recursive -Verbose -CommitId $(Build.SourceVersion)
63+
errorActionPreference: silentlyContinue
64+
5765
- task: VSTest@2
5866
displayName: 'Run Unit Tests'
5967
inputs:
@@ -81,7 +89,7 @@ steps:
8189
platform: '$(BuildPlatform)'
8290
configuration: '$(BuildConfiguration)'
8391
condition: and(succeeded(), eq(variables['BuildPlatform'], 'x64'))
84-
92+
8593
- task: CopyFiles@2
8694
displayName: 'Copy *.appx/*.msix to Artifacts (Non-PR builds only)'
8795
inputs:
@@ -101,3 +109,4 @@ steps:
101109
PathtoPublish: '$(Build.ArtifactStagingDirectory)/appx'
102110
ArtifactName: 'appx-$(BuildConfiguration)'
103111
condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))
112+

build/scripts/Index-Pdbs.ps1

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
[CmdLetBinding()]
2+
Param(
3+
[Parameter(Mandatory=$true, Position=0)][string]$SearchDir,
4+
[Parameter(Mandatory=$true, Position=1)][string]$SourceRoot,
5+
[Parameter(Mandatory=$true, Position=2)][string]$CommitId,
6+
[string]$Organization = "microsoft",
7+
[string]$Repo = "terminal",
8+
[switch]$recursive
9+
)
10+
11+
$debuggerPath = (Get-ItemProperty -path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows Kits\Installed Roots" -name WindowsDebuggersRoot10).WindowsDebuggersRoot10
12+
$srcsrvPath = Join-Path $debuggerPath "x64\srcsrv"
13+
$srctoolExe = Join-Path $srcsrvPath "srctool.exe"
14+
$pdbstrExe = Join-Path $srcsrvPath "pdbstr.exe"
15+
16+
$fileTable = @{}
17+
foreach ($gitFile in & git ls-files)
18+
{
19+
$fileTable[$gitFile] = $gitFile
20+
}
21+
22+
$mappedFiles = New-Object System.Collections.ArrayList
23+
24+
foreach ($file in (Get-ChildItem -r:$recursive "$SearchDir\*.pdb"))
25+
{
26+
Write-Verbose "Found $file"
27+
28+
$ErrorActionPreference = "Continue" # Azure Pipelines defaults to "Stop", continue past errors in this script.
29+
30+
$allFiles = & $srctoolExe -r "$file"
31+
32+
# If the pdb didn't have enough files then skip it (the srctool output has a blank line even when there's no info
33+
# so check for less than 2 lines)
34+
if ($allFiles.Length -lt 2)
35+
{
36+
continue
37+
}
38+
39+
for ($i = 0; $i -lt $allFiles.Length; $i++)
40+
{
41+
if ($allFiles[$i].StartsWith($SourceRoot, [StringComparison]::OrdinalIgnoreCase))
42+
{
43+
$relative = $allFiles[$i].Substring($SourceRoot.Length).TrimStart("\")
44+
$relative = $relative.Replace("\", "/")
45+
46+
# Git urls are case-sensitive but the PDB might contain a lowercased version of the file path.
47+
# Look up the relative url in the output of "ls-files". If it's not there then it's not something
48+
# in git, so don't index it.
49+
$relative = $fileTable[$relative]
50+
if ($relative)
51+
{
52+
$mapping = $allFiles[$i] + "*$relative"
53+
$mappedFiles.Add($mapping)
54+
55+
Write-Verbose "Mapped path $($i): $mapping"
56+
}
57+
}
58+
}
59+
60+
$pdbstrFile = Join-Path "$env:TEMP" "pdbstr.txt"
61+
62+
Write-Verbose "pdbstr.txt = $pdbstrFile"
63+
64+
@"
65+
SRCSRV: ini ------------------------------------------------
66+
VERSION=2
67+
VERCTRL=http
68+
SRCSRV: variables ------------------------------------------
69+
ORGANIZATION=$Organization
70+
REPO=$Repo
71+
COMMITID=$CommitId
72+
HTTP_ALIAS=https://raw.githubusercontent.com/%ORGANIZATION%/%REPO%/%COMMITID%/
73+
HTTP_EXTRACT_TARGET=%HTTP_ALIAS%%var2%
74+
SRCSRVTRG=%HTTP_EXTRACT_TARGET%
75+
SRC_INDEX=public
76+
SRCSRV: source files ---------------------------------------
77+
$($mappedFiles -join "`r`n")
78+
SRCSRV: end ------------------------------------------------
79+
"@ | Set-Content $pdbstrFile
80+
81+
& $pdbstrExe -p:"$file" -w -s:srcsrv -i:$pdbstrFile
82+
}
83+
84+
# Return with exit 0 to override any weird error code from other tools
85+
Exit 0

src/cascadia/TerminalApp/TerminalApp.vcxproj

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3-
3+
<Import Project="..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.props" Condition="Exists('..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.props')" />
4+
<Import Project="..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.props" Condition="Exists('..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.props')" />
5+
<Import Project="..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.props" Condition="Exists('..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.props')" />
46
<Import Project="..\..\..\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
5-
67
<PropertyGroup>
78
<!-- cppwinrt.build.pre.props depends on these settings: -->
89
<!-- build a dll, not exe (Application) -->
@@ -21,7 +22,6 @@
2122
<ItemGroup>
2223
<!-- DON'T PUT XAML FILES HERE! Put them in TerminalAppLib.vcxproj -->
2324
</ItemGroup>
24-
2525
<!-- ========================= Headers ======================== -->
2626
<ItemGroup>
2727
<!-- Only put headers for winrt types in here. Don't put other header files
@@ -60,31 +60,25 @@
6060
<ProjectReference Include="$(OpenConsoleDir)src\types\lib\types.vcxproj">
6161
<Project>{18D09A24-8240-42D6-8CB6-236EEE820263}</Project>
6262
</ProjectReference>
63-
6463
<!-- The midl compiler however, _will_ aggregate our winmd dependencies
6564
somehow. So make sure to only include top-level dependencies here (don't
6665
include Settings and Connection, since Control will include them for us) -->
6766
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\TerminalSettings\TerminalSettings.vcxproj" />
6867
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\TerminalConnection\TerminalConnection.vcxproj" />
6968
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\TerminalControl\TerminalControl.vcxproj" />
70-
7169
<!-- Reference TerminalAppLib here, so we can use it's TerminalApp.winmd as
7270
our TerminalApp.winmd. This didn't work correctly in VS2017, you'd need to
7371
manually reference the lib -->
74-
75-
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\TerminalApp\lib\TerminalAppLib.vcxproj" >
72+
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\TerminalApp\lib\TerminalAppLib.vcxproj">
7673
<Private>true</Private>
7774
<CopyLocalSatelliteAssemblies>true</CopyLocalSatelliteAssemblies>
7875
</ProjectReference>
79-
8076
</ItemGroup>
81-
8277
<PropertyGroup>
8378
<!-- A small helper for paths to the compiled cppwinrt projects -->
8479
<_BinRoot Condition="'$(Platform)' != 'Win32'">$(OpenConsoleDir)$(Platform)\$(Configuration)\</_BinRoot>
8580
<_BinRoot Condition="'$(Platform)' == 'Win32'">$(OpenConsoleDir)$(Configuration)\</_BinRoot>
8681
</PropertyGroup>
87-
8882
<PropertyGroup>
8983
<!--
9084
DON'T REDIRECT OUR OUTPUT.
@@ -99,18 +93,28 @@
9993
</ClCompile>
10094
<Link>
10195
<AdditionalDependencies>User32.lib;WindowsApp.lib;shell32.lib;%(AdditionalDependencies)</AdditionalDependencies>
102-
10396
<!-- TerminalAppLib contains a DllMain that we need to force the use of. -->
10497
<AdditionalOptions Condition="'$(Platform)'=='Win32'">/INCLUDE:_DllMain@12</AdditionalOptions>
10598
<AdditionalOptions Condition="'$(Platform)'!='Win32'">/INCLUDE:DllMain</AdditionalOptions>
10699
</Link>
107100
</ItemDefinitionGroup>
108101
<Import Project="$(OpenConsoleDir)src\common.build.post.props" />
109-
110102
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.post.props" />
111-
112103
<!-- Import this set of targets that fixes a VS bug that manifests when using
113104
the TerminalAppLib project -->
114105
<Import Project="FixVisualStudioBug.targets" />
115-
116-
</Project>
106+
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
107+
<PropertyGroup>
108+
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
109+
</PropertyGroup>
110+
<Error Condition="!Exists('..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.props'))" />
111+
<Error Condition="!Exists('..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.targets'))" />
112+
<Error Condition="!Exists('..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.props'))" />
113+
<Error Condition="!Exists('..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.targets'))" />
114+
<Error Condition="!Exists('..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.props'))" />
115+
<Error Condition="!Exists('..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.targets'))" />
116+
</Target>
117+
<Import Project="..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.targets" Condition="Exists('..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.targets')" />
118+
<Import Project="..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.targets" Condition="Exists('..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.targets')" />
119+
<Import Project="..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.targets" Condition="Exists('..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.targets')" />
120+
</Project>
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3+
<package id="Microsoft.Build.Tasks.Git" version="1.0.0-beta2-19367-01" targetFramework="native" developmentDependency="true" />
4+
<package id="Microsoft.SourceLink.Common" version="1.0.0-beta2-19367-01" targetFramework="native" developmentDependency="true" />
5+
<package id="Microsoft.SourceLink.GitHub" version="1.0.0-beta2-19367-01" targetFramework="native" developmentDependency="true" />
36
<package id="Microsoft.Toolkit.Win32.UI.XamlApplication" version="6.0.0-preview7" targetFramework="native" />
47
<package id="Microsoft.UI.Xaml" version="2.2.190611001-prerelease" targetFramework="native" />
58
<package id="Microsoft.Windows.CppWinRT" version="2.0.190730.2" targetFramework="native" />
6-
</packages>
9+
</packages>

src/cascadia/TerminalConnection/TerminalConnection.vcxproj

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<Import Project="..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.props" Condition="Exists('..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.props')" />
4+
<Import Project="..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.props" Condition="Exists('..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.props')" />
5+
<Import Project="..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.props" Condition="Exists('..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.props')" />
36
<Import Project="..\..\..\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
47
<PropertyGroup>
58
<ConfigurationType>DynamicLibrary</ConfigurationType>
@@ -35,7 +38,7 @@
3538
</ClInclude>
3639
</ItemGroup>
3740
<ItemGroup>
38-
<ClCompile Include="init.cpp"/>
41+
<ClCompile Include="init.cpp" />
3942
<ClCompile Include="AzureConnection.cpp" Condition="'$(Platform)'!='ARM64'" />
4043
<ClCompile Include="AzureConnection-ARM64.cpp" Condition="'$(Platform)'=='ARM64'" />
4144
<ClCompile Include="pch.cpp">
@@ -90,5 +93,14 @@
9093
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
9194
</PropertyGroup>
9295
<Error Condition="!Exists('..\..\..\packages\vcpkg-cpprestsdk.2.10.0\build\native\vcpkg-cpprestsdk.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\vcpkg-cpprestsdk.2.10.0\build\native\vcpkg-cpprestsdk.targets'))" />
96+
<Error Condition="!Exists('..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.props'))" />
97+
<Error Condition="!Exists('..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.targets'))" />
98+
<Error Condition="!Exists('..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.props'))" />
99+
<Error Condition="!Exists('..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.targets'))" />
100+
<Error Condition="!Exists('..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.props'))" />
101+
<Error Condition="!Exists('..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.targets'))" />
93102
</Target>
94-
</Project>
103+
<Import Project="..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.targets" Condition="Exists('..\..\..\packages\Microsoft.Build.Tasks.Git.1.0.0-beta2-19367-01\build\Microsoft.Build.Tasks.Git.targets')" />
104+
<Import Project="..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.targets" Condition="Exists('..\..\..\packages\Microsoft.SourceLink.Common.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.Common.targets')" />
105+
<Import Project="..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.targets" Condition="Exists('..\..\..\packages\Microsoft.SourceLink.GitHub.1.0.0-beta2-19367-01\build\Microsoft.SourceLink.GitHub.targets')" />
106+
</Project>

src/cascadia/TerminalConnection/TerminalConnection.vcxproj.filters

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
<ClCompile Include="ConhostConnection.cpp" />
1616
<ClCompile Include="$(GeneratedFilesDir)module.g.cpp" />
1717
<ClCompile Include="AzureConnection.cpp" />
18+
<ClCompile Include="init.cpp" />
1819
</ItemGroup>
1920
<ItemGroup>
2021
<ClInclude Include="pch.h" />
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<packages>
3+
<package id="Microsoft.Build.Tasks.Git" version="1.0.0-beta2-19367-01" targetFramework="native" developmentDependency="true" />
4+
<package id="Microsoft.SourceLink.Common" version="1.0.0-beta2-19367-01" targetFramework="native" developmentDependency="true" />
5+
<package id="Microsoft.SourceLink.GitHub" version="1.0.0-beta2-19367-01" targetFramework="native" developmentDependency="true" />
36
<package id="Microsoft.Windows.CppWinRT" version="2.0.190730.2" targetFramework="native" />
47
<package id="vcpkg-cpprestsdk" version="2.10.0" targetFramework="native" />
5-
</packages>
8+
</packages>

0 commit comments

Comments
 (0)