if ($PSEdition -eq "Core") { Write-Error "Build must be run with Windows PowerShell due to the use of CodeDOM" Write-Output "Running with Windows PowerShell" powershell.exe "$(Get-Location)\build.ps1" return } # read SelfConfig, remove wierd bits, load it, load Newtonsoft, and turn it into a schema $newtonsoftVer = "12.0.2" $newtonsoftSchemaVer = "3.0.11" $codeDomProviderVer = "3.6.0" $roslynVer = "3.10.0" $nugetBase = "$(Get-Location)/nuget" $newtonsoftLoc = "$nugetBase/Newtonsoft.Json.$newtonsoftVer/lib/netstandard2.0/Newtonsoft.Json.dll" $newtonsoftSchemaLoc = "$nugetBase/Newtonsoft.Json.Schema.$newtonsoftSchemaVer/lib/netstandard2.0/Newtonsoft.Json.Schema.dll" $roslynCodeDomBase = "$nugetBase/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.$codeDomProviderVer" $roslynCodeDom = "$roslynCodeDomBase/lib/net45/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll" $roslynBase = "$nugetBase/Microsoft.Net.Compilers.Toolset.$roslynVer" $roslynInstall = "$roslynBase/tasks/net472/" $selfConfigLoc = "../IPA.Loader/Config/SelfConfig.cs" $ipaRoot = "../IPA" if (!(Test-Path "nuget" -PathType Container)) { $nugetExe = "nuget/nuget.exe" mkdir "nuget" Invoke-WebRequest "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" -OutFile $nugetExe &$nugetExe install Newtonsoft.Json -Version $newtonsoftVer -source https://api.nuget.org/v3/index.json -o $nugetBase &$nugetExe install Newtonsoft.Json.Schema -Version $newtonsoftSchemaVer -source https://api.nuget.org/v3/index.json -o $nugetBase &$nugetExe install Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Version $codeDomProviderVer -source https://api.nuget.org/v3/index.json -o $nugetBase &$nugetExe install Microsoft.Net.Compilers.Toolset -Version $roslynVer -source https://api.nuget.org/v3/index.json -o $nugetBase } & docfx metadata if ((Test-Path $roslynCodeDom -PathType Leaf) -and (Test-Path $roslynInstall -PathType Container)) { # The files we need exist, lets do this! Write-Output "Generating Schema JSON" # Add the Roslyn CodeDom Add-Type -Path $roslynCodeDom # First load Newtonsoft Add-Type -Path $newtonsoftLoc Add-Type -Path $newtonsoftSchemaLoc # Read and parse special directives from SelfConfig function ProcessLines { begin { $inIgnoreSection = $false $ignoreNext = 0 } process { if ( $_ -match "^\s*//\s+([A-Z]+):\s*(?:section)?\s+([a-zA-Z]+)(?:\s+(\d+))?\s*$" ) { $Begin = ($Matches[1] -eq "BEGIN") $End = ($Matches[1] -eq "END") $Line = ($Matches[1] -eq "LINE") $Num = if ($Matches[3].length -gt 0) { [int]($Matches[3]) } else { 1 } switch ($Matches[2]) { "ignore" { if ($Begin) { $inIgnoreSection = $true } if ($End) { $inIgnoreSection = $false } if ($Line) { $ignoreNext = $Num + 1 } } } } if ($inIgnoreSection) { "" } elseif ($ignoreNext -gt 0) { $ignoreNext = $ignoreNext - 1; return "" } else { $_ } } } function Merge-Lines { begin { $str = "" } process { $str = $str + "`n" + $_ } end { $str } } function FilterDef { process { $_ -replace "internal", "public" } } # set up the compiler settings Invoke-Expression -Command @" class RoslynCompilerSettings : Microsoft.CodeDom.Providers.DotNetCompilerPlatform.ICompilerSettings { [string] get_CompilerFullPath() { return "$roslynInstall\csc.exe" } [int] get_CompilerServerTimeToLive() { return 10 } } "@ $codeDomProvider = [Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider]::new([RoslynCompilerSettings]::new()) Add-Type -CodeDomProvider $codeDomProvider -TypeDefinition (Get-Content $selfConfigLoc | ProcessLines | Merge-Lines | FilterDef) -ReferencedAssemblies $newtonsoftLoc,"netstandard" # type will be [IPA.Config.SelfConfig] # Generate schema $schemagen = New-Object -TypeName Newtonsoft.Json.Schema.Generation.JSchemaGenerator $schemagen.DefaultRequired = [Newtonsoft.Json.Required]::Always $schema = $schemagen.Generate([IPA.Config.SelfConfig]) $schema.ToString() | Out-File "other_api/config/_schema.json" } else { Write-Output "Cannot generate schema JSON" } $ipaExe = "$ipaRoot/bin/Release/net472/IPA.exe" # generate IPA.exe args file if (-not (Test-Path $ipaExe -PathType Leaf)) { msbuild -t:Restore -p:Configuration=Release -p:Platform=AnyCPU -p:SolutionDir=.. "$ipaRoot/IPA.csproj" msbuild -p:Configuration=Release -p:Platform=AnyCPU -p:SolutionDir=.. "$ipaRoot/IPA.csproj" } & "$ipaExe" --help > .\articles\_ipa_command_line.txt & docfx build --globalMetadataFiles link_branch.json @Args if ($lastexitcode -ne 0) { throw [System.Exception] "docfx build failed with exit code $lastexitcode." }