mirror of
https://github.com/microsoft/terminal.git
synced 2026-07-09 01:56:07 +00:00
* Refactors TerminalApp into two projects:
- TerminalAppLib, which builds a .lib, and includes all the code
- TerminalApp, which builds a dll by linking the lib
* Adds a TerminalApp.Unit.Tests project
- Includes the ability to test cppwinrt types we've authored using a SxS manifest for unpackaged winrt activation
- includes the ability to test types with XAML content using an appxmanifest
* Adds a giant doc explaining how this was all done. Really, just go read that doc, it'll really help you understand what's going on in this PR.
-------------------------
These are some previous commit messages. They may be helpful to future readers.
* Start adding unittests for json parsing, end up creating a TerminalAppLib project to make a lib. See #1042
* VS automatically did this for me
* This is a dead end
I tried including the idl-y things into the lib, but that way leads insanity
If you want to make a StaticLibrary, then suddenly the winrt toolchain forgets
that ProjectReferences can have winmd's in them, so it won't be able to
compile any types from the referenced projects. If you instead try to manually
reference the types, you'll get duplicate types up the wazoo, which of course
is insane, since we're referencing them the _one_ time
* Yea just follow #1042 on github for status
So current state:
1. If you try to add a `Reference` to all of MUX.Markup, TerminalControl and
TerminalSettings, then mdmerge will complain about all the types from
TerminalSettings being defined twice. In this magic scenario, the
dependencies of TerminalControl are used directly for some reason:
```
12> Load input metadata file ...OpenConsole\x64\Debug\TerminalSettings\Microsoft.Terminal.Settings.winmd.
12> Load input metadata file ...OpenConsole\x64\Debug\TerminalControl\Microsoft.Terminal.Settings.winmd.
12> Load input metadata file ...OpenConsole\x64\Debug\TerminalControl\Microsoft.Terminal.TerminalConnection.winmd.
12> Load input metadata file ...OpenConsole\x64\Debug\TerminalControl\Microsoft.Terminal.TerminalControl.winmd.
12> Load input metadata file ...OpenConsole\x64\Debug\Microsoft.UI.Xaml.Markup\Microsoft.UI.Xaml.Markup.winmd.
```
2. If you don't add a `Reference` TerminalControl, then it'll complain about
being unable to find the type TitleChangedEventArgs, which is defined in
TerminalControl.
3. If you don't add a `Reference` TerminalSettings, then it'll complain about
being unable to find the type KeyChord and other types from
TerminalSettings. In this scenario, it doesn't recurse on the other
dependencies from TerminalControl for whatever reason.
4. If you instead try to add all 3 as a `ProjectReference`, then it'll
complain about being unable to find TitleChangedEventArgs, as in 2.
Presumably, it;ll have troubles with the other types too, as none of the 3
are actually included in the midlrt.rsp file.
5. If you add all 3 as a `ProjectReference`, then also add TerminalControl as
a `Reference`, you'll get a `MIDL2011: [msg] unresolved type declaration
Microsoft.UI.Xaml.Markup.XamlApplication`
6. If you add all 3 as a `ProjectReference`, then also add TerminalControl AND
MUX.Markup as a `Reference`, you'll get the same result as 3.
* what if we just don't idl
This seems to compile
* This compiles but I broke the MUX resources
look at the App.xaml change. in this changelist. That's what's broken right now. Lets fix that!
* lets do this
If I leave the MUX nuget out of the project, I'll get a compile error in
App.xaml:
```
...OpenConsole\src\cascadia\TerminalApp\App.xaml(21,40): XamlCompiler error WMC0001: Unknown type 'XamlControlsResources' in XML namespace 'using:Microsoft.UI.Xaml.Controls'
```
If I add it back to the project, it works
* Some cleanup from the previous commit
* This is busted again.
Doing a clean build didn't work.
A clean rebuild of the project, paired with some removal of dead code
revealed a problem with what I have so far.
TerminalAppLib depends on the generation of two headers,
`AppKeyBindings.g.h` and `App.g.h`, as those define some of bits of the
winrt types. They're needed to be able to compile the implementations.
Presumably that's not getting generated by the lib project, because the dll
project is the one to generate that file.
So we need to move the idl's to the lib project. This created maddness,
because of course the Duplicate Type thing. The solution to that is to
actually mark the winrt DLLs that we're chaining up through us as
```
<Private>false</Private>
<CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
```
This will prevent them from getting double-included.
This still doesn't work however, since
```
app.cpp(40): error C2039: 'XamlMetaDataProvider': is not a member of 'winrt::TerminalApp'
error C3861: 'XamlMetaDataProvider': identifier not found
```
So we need to figure that out. The dll project is still generating the right
header, so lets look there.
* Move the xaml stuff to the lib
This compiles, but when we launch, we fail to load the tabviewcontrol
resources again. So that's not what you want. Why is it not included?
* It works again!
* Use the pri, xbf files from TerminalAppLib, not TerminalApp
* Manually make TerminalApp include a reference to TerminalAppLib's
TerminalApp.winmd. This will force the build to copy TerminalApp.winmd to
TerminalApp/, which WindowsTerminal needs to be able to ProjectReference the
TerminalApp project (it's expecting it to have a winmd)
* Remove the module.g.cpp from TerminalApp, and move to TerminalAppLib. The
dll doesn't do any codegen anymore.
* Agressively clean up these files
* Clean up unnecessary includes in the dll pch.h
* This does NOT work.
The WindowsxamlManager call crashes. I'm thinking it has to do with activation
of winrt types from a dll.
Email out to @Austin-Lamb to see if he can assist
* This gets our cppwinrt types working, but xaml islands is still broken
* Split the tests apart, so they aren't insane
* These are the magic words to make xaml islands work
* All this witchcraft is necessary to make XAML+MUX work right
* Clean this up a bit and add comments
* Create an enormous doc explaining this madness
* Unsure how this got changed.
* Trying to get the CI build to work again.
This resolves the MUX issue. We need to manually include it, because their package's target doesn't mark it as CopyLocalSatelliteAssemblies=false, Private=false.
However, the TerminalApp project is still able to magically reason that the TerminalAppLib project should be included in the MdMerge step, because it think's it's a `GetCppWinRTStaticProjectReferences` reference.
* Update cppwinrt to the latest version - this fixes the MSBuild
* I still need to re-add the KeyModifiers checks from TermControl. I think
this update broke `operator&` for that enum.
* There needs to be some cleanup obviously
* The doc should be updated as well
* Clean up changes from cppwinrt update
* Try doing this, even though it seems wrong
* Lets try this (press x to doubt)
* Clean up vcxproj file, and remove appxmanifest change from previous commit
* Update to the latest TAEF release, maybe that'll work
* Let's try a prerelease version, shall we?
* Add notes about TAEF package, comment out tests
* Format the code
* Hopefully fix the arm64 and x86 builds
also a typo
* Fix PR nits
* Fix some bad merge conflicts
* Some cleanup from the merge
* Well I was close to getting the merge right
* I believe this will fix CI
* Apply suggestions from code review
Co-Authored-By: Carlos Zamora <carlos.zamora@microsoft.com>
* These definitely need to be fixed
* Try version detecting in the test
IDK if this will build, I'm letting the CI try while I clean rebuild locally
* Try blindly updating to the newest nuget version
* Revert "Try blindly updating to the newest nuget version"
This reverts commit b72bd9eb73.
* We're just going to see if these work in CI with this change
* Comment the tests back out. Windows Server 2019 is 10.0.17763.557
* Remove the nuget package
We don't need this package anymore now that we're hosting it
* Okay this _was_ important
342 lines
9.8 KiB
PowerShell
342 lines
9.8 KiB
PowerShell
|
|
# The project's root directory.
|
|
Set-Item -force -path "env:OpenConsoleRoot" -value "$PSScriptRoot\.."
|
|
|
|
#.SYNOPSIS
|
|
# Finds and imports a module that should be local to the project
|
|
#.PARAMETER ModuleName
|
|
# The name of the module to import
|
|
function Import-LocalModule
|
|
{
|
|
[CmdletBinding()]
|
|
param(
|
|
[parameter(Mandatory=$true, Position=0)]
|
|
[string]$Name
|
|
)
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
$modules_root = "$env:OpenConsoleRoot\.PowershellModules"
|
|
|
|
$local = $null -eq (Get-Module -Name $Name)
|
|
|
|
if (-not $local)
|
|
{
|
|
return
|
|
}
|
|
|
|
if (-not (Test-Path $modules_root)) {
|
|
New-Item $modules_root -ItemType 'directory' | Out-Null
|
|
}
|
|
|
|
if (-not (Test-Path "$modules_root\$Name")) {
|
|
Write-Verbose "$Name not downloaded -- downloading now"
|
|
$module = Find-Module "$Name"
|
|
$version = $module.Version
|
|
|
|
Write-Verbose "Saving $Name to $modules_root"
|
|
Save-Module -InputObject $module -Path $modules_root
|
|
Import-Module "$modules_root\$Name\$version\$Name.psd1"
|
|
} else {
|
|
Write-Verbose "$Name already downloaded"
|
|
$versions = Get-ChildItem "$modules_root\$Name" | Sort-Object
|
|
|
|
Get-ChildItem -Path "$modules_root\$Name\$($versions[0])\$Name.psd1" | Import-Module
|
|
}
|
|
}
|
|
|
|
#.SYNOPSIS
|
|
# Grabs all environment variable set after vcvarsall.bat is called and pulls
|
|
# them into the Powershell environment.
|
|
function Set-MsbuildDevEnvironment
|
|
{
|
|
[CmdletBinding()]
|
|
param(
|
|
[switch]$Prerelease
|
|
)
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
Import-LocalModule -Name 'VSSetup'
|
|
|
|
Write-Verbose 'Searching for VC++ instances'
|
|
$vsinfo = `
|
|
Get-VSSetupInstance -All -Prerelease:$Prerelease `
|
|
| Select-VSSetupInstance `
|
|
-Latest -Product * `
|
|
-Require 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64'
|
|
|
|
$vspath = $vsinfo.InstallationPath
|
|
|
|
switch ($env:PROCESSOR_ARCHITECTURE) {
|
|
"amd64" { $arch = "x64" }
|
|
"x86" { $arch = "x86" }
|
|
default { throw "Unknown architecture: $switch" }
|
|
}
|
|
|
|
$vcvarsall = "$vspath\VC\Auxiliary\Build\vcvarsall.bat"
|
|
|
|
Write-Verbose 'Setting up environment variables'
|
|
cmd /c ("`"$vcvarsall`" $arch & set") | ForEach-Object {
|
|
if ($_ -match '=')
|
|
{
|
|
$s = $_.Split("=");
|
|
Set-Item -force -path "env:\$($s[0])" -value "$($s[1])"
|
|
}
|
|
}
|
|
|
|
Write-Host "Dev environment variables set" -ForegroundColor Green
|
|
}
|
|
|
|
#.SYNOPSIS
|
|
# Runs a Taef test suite in a new OpenConsole window.
|
|
#
|
|
#.PARAMETER OpenConsolePath
|
|
# Path to the OpenConsole.exe to run.
|
|
#
|
|
#.PARAMETER $TaefPath
|
|
# Path to the taef.exe to run.
|
|
#
|
|
#.PARAMETER $TestDll
|
|
# Path to the test DLL to run with Taef.
|
|
#
|
|
#.PARAMETER $TaefArgs
|
|
# Any arguments to path to Taef.
|
|
function Invoke-TaefInNewWindow()
|
|
{
|
|
[CmdletBinding()]
|
|
Param (
|
|
[parameter(Mandatory=$true)]
|
|
[string]$OpenConsolePath,
|
|
|
|
[parameter(Mandatory=$true)]
|
|
[string]$TaefPath,
|
|
|
|
[parameter(Mandatory=$true)]
|
|
[string]$TestDll,
|
|
|
|
[parameter(Mandatory=$false)]
|
|
[string]$TaefArgs
|
|
)
|
|
|
|
Start-Process $OpenConsolePath -Wait -ArgumentList "powershell.exe $TaefPath $TestDll $TaefArgs; Read-Host 'Press enter to continue...'"
|
|
}
|
|
|
|
#.SYNOPSIS
|
|
# Runs OpenConsole's tests. Will only run unit tests by default. Each ft test is
|
|
# run in its own window. Note that the uia tests will move the mouse around, so
|
|
# it must be left alone for the duration of the test.
|
|
#
|
|
#.PARAMETER AllTests
|
|
# When set, all tests will be run.
|
|
#
|
|
#.PARAMETER FTOnly
|
|
# When set, only ft tests will be run.
|
|
#
|
|
#.PARAMETER Test
|
|
# Can be used to specify that only a particular test should be run.
|
|
# Current values allowed are: host, interactivityWin32, terminal, adapter,
|
|
# feature, uia, textbuffer.
|
|
#
|
|
#.PARAMETER TaefArgs
|
|
# Used to pass any additional arguments to the test runner.
|
|
#
|
|
#.PARAMETER Platform
|
|
# The platform of the OpenConsole tests to run. Can be "x64" or "x86".
|
|
# Defaults to "x64".
|
|
#
|
|
#.PARAMETER Configuration
|
|
# The configuration of the OpenConsole tests to run. Can be "Debug" or
|
|
# "Release". Defaults to "Debug".
|
|
function Invoke-OpenConsoleTests()
|
|
{
|
|
[CmdletBinding()]
|
|
Param (
|
|
[parameter(Mandatory=$false)]
|
|
[switch]$AllTests,
|
|
|
|
[parameter(Mandatory=$false)]
|
|
[switch]$FTOnly,
|
|
|
|
[parameter(Mandatory=$false)]
|
|
[ValidateSet('host', 'interactivityWin32', 'terminal', 'adapter', 'feature', 'uia', 'textbuffer', 'types', 'terminalCore', 'terminalApp')]
|
|
[string]$Test,
|
|
|
|
[parameter(Mandatory=$false)]
|
|
[string]$TaefArgs,
|
|
|
|
[parameter(Mandatory=$false)]
|
|
[ValidateSet('x64', 'x86')]
|
|
[string]$Platform = "x64",
|
|
|
|
[parameter(Mandatory=$false)]
|
|
[ValidateSet('Debug', 'Release')]
|
|
[string]$Configuration = "Debug"
|
|
|
|
)
|
|
|
|
if (($AllTests -and $FTOnly) -or ($AllTests -and $Test) -or ($FTOnly -and $Test))
|
|
{
|
|
Write-Host "Invalid combination of flags" -ForegroundColor Red
|
|
return
|
|
}
|
|
$OpenConsolePlatform = $Platform
|
|
if ($Platform -eq 'x86')
|
|
{
|
|
$OpenConsolePlatform = 'Win32'
|
|
}
|
|
$OpenConsolePath = "$env:OpenConsoleroot\bin\$OpenConsolePlatform\$Configuration\OpenConsole.exe"
|
|
$RunTePath = "$env:OpenConsoleRoot\tools\runte.cmd"
|
|
$TaefExePath = "$env:OpenConsoleRoot\packages\Taef.Redist.Wlk.10.30.180808002\build\binaries\$Platform\te.exe"
|
|
$BinDir = "$env:OpenConsoleRoot\bin\$OpenConsolePlatform\$Configuration"
|
|
[xml]$TestConfig = Get-Content "$env:OpenConsoleRoot\tools\tests.xml"
|
|
|
|
# check if WinAppDriver needs to be started
|
|
$WinAppDriverExe = $null
|
|
if ($AllTests -or $FtOnly -or $Test -eq "uia")
|
|
{
|
|
$WinAppDriverExe = [Diagnostics.Process]::Start("$env:OpenConsoleRoot\dep\WinAppDriver\WinAppDriver.exe")
|
|
}
|
|
|
|
# select tests to run
|
|
if ($AllTests)
|
|
{
|
|
$TestsToRun = $TestConfig.tests.test
|
|
}
|
|
elseif ($FTOnly)
|
|
{
|
|
$TestsToRun = $TestConfig.tests.test | Where-Object { $_.type -eq "ft" }
|
|
}
|
|
elseif ($Test)
|
|
{
|
|
$TestsToRun = $TestConfig.tests.test | Where-Object { $_.name -eq $Test }
|
|
}
|
|
else
|
|
{
|
|
# run unit tests by default
|
|
$TestsToRun = $TestConfig.tests.test | Where-Object { $_.type -eq "unit" }
|
|
}
|
|
|
|
# run selected tests
|
|
foreach ($t in $TestsToRun)
|
|
{
|
|
if ($t.type -eq "unit")
|
|
{
|
|
& $TaefExePath "$BinDir\$($t.binary)" $TaefArgs
|
|
}
|
|
elseif ($t.type -eq "ft")
|
|
{
|
|
Invoke-TaefInNewWindow -OpenConsolePath $OpenConsolePath -TaefPath $TaefExePath -TestDll "$BinDir\$($t.binary)" -TaefArgs $TaefArgs
|
|
}
|
|
else
|
|
{
|
|
Write-Host "Invalid test type $t.type for test: $t.name" -ForegroundColor Red
|
|
return
|
|
}
|
|
}
|
|
|
|
# stop running WinAppDriver if it was launched
|
|
if ($WinAppDriverExe)
|
|
{
|
|
Stop-Process -Id $WinAppDriverExe.Id
|
|
}
|
|
}
|
|
|
|
|
|
#.SYNOPSIS
|
|
# Builds OpenConsole.sln using msbuild. Any arguments get passed on to msbuild.
|
|
function Invoke-OpenConsoleBuild()
|
|
{
|
|
& "$env:OpenConsoleRoot\dep\nuget\nuget.exe" restore "$env:OpenConsoleRoot\OpenConsole.sln"
|
|
msbuild.exe "$env:OpenConsoleRoot\OpenConsole.sln" @args
|
|
}
|
|
|
|
#.SYNOPSIS
|
|
# Launches an OpenConsole process.
|
|
#
|
|
#.PARAMETER Platform
|
|
# The platform of the OpenConsole executable to launch. Can be "x64" or "x86".
|
|
# Defaults to "x64".
|
|
#
|
|
#.PARAMETER Configuration
|
|
# The configuration of the OpenConsole executable to launch. Can be "Debug" or
|
|
# "Release". Defaults to "Debug".
|
|
function Start-OpenConsole()
|
|
{
|
|
[CmdletBinding()]
|
|
Param (
|
|
[parameter(Mandatory=$false)]
|
|
[string]$Platform = "x64",
|
|
|
|
[parameter(Mandatory=$false)]
|
|
[string]$Configuration = "Debug"
|
|
)
|
|
if ($Platform -like "x86")
|
|
{
|
|
$Platform = "Win32"
|
|
}
|
|
& "$env:OpenConsoleRoot\bin\$Platform\$Configuration\OpenConsole.exe"
|
|
}
|
|
|
|
#.SYNOPSIS
|
|
# Launches an OpenConsole process and attaches the default debugger.
|
|
#
|
|
#.PARAMETER Platform
|
|
# The platform of the OpenConsole executable to launch. Can be "x64" or "x86".
|
|
# Defaults to "x64".
|
|
#
|
|
#.PARAMETER Configuration
|
|
# The configuration of the OpenConsole executable to launch. Can be "Debug" or
|
|
# "Release". Defaults to "Debug".
|
|
function Debug-OpenConsole()
|
|
{
|
|
[CmdletBinding()]
|
|
Param (
|
|
[parameter(Mandatory=$false)]
|
|
[string]$Platform = "x64",
|
|
|
|
[parameter(Mandatory=$false)]
|
|
[string]$Configuration = "Debug"
|
|
)
|
|
if ($Platform -like "x86")
|
|
{
|
|
$Platform = "Win32"
|
|
}
|
|
$process = [Diagnostics.Process]::Start("$env:OpenConsoleRoot\bin\$Platform\$Configuration\OpenConsole.exe")
|
|
Debug-Process -Id $process.Id
|
|
}
|
|
|
|
#.SYNOPSIS
|
|
# runs clang-format on list of files
|
|
#
|
|
#.PARAMETER Path
|
|
# The full paths to the files to format
|
|
function Invoke-ClangFormat {
|
|
[CmdletBinding()]
|
|
Param (
|
|
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
|
|
[string[]]$Path
|
|
)
|
|
|
|
Process {
|
|
ForEach($_ in $Path) {
|
|
Try {
|
|
$n = Get-Item $_ -ErrorAction Stop | Select -Expand FullName
|
|
& "$env:OpenconsoleRoot/dep/llvm/clang-format" -i $n
|
|
} Catch {
|
|
Write-Error $_
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#.SYNOPSIS
|
|
# runs code formatting on all c++ files
|
|
function Invoke-CodeFormat() {
|
|
Get-ChildItem -Recurse "$env:OpenConsoleRoot/src" -Include *.cpp, *.hpp, *.h |
|
|
Where FullName -NotLike "*Generated Files*" |
|
|
Invoke-ClangFormat
|
|
}
|
|
|
|
Export-ModuleMember -Function Set-MsbuildDevEnvironment,Invoke-OpenConsoleTests,Invoke-OpenConsoleBuild,Start-OpenConsole,Debug-OpenConsole,Invoke-CodeFormat
|