From f56b001028b41d63118dff63755bc938bbdcc93f Mon Sep 17 00:00:00 2001 From: Dennis Hill Date: Fri, 20 Feb 2026 14:51:06 -0600 Subject: [PATCH 1/3] Refactored build flow so normies can use this tool; cleaned up build scripts --- .vscode/settings.json | 3 + Bhelper.ps1 | 333 ++++++++++++++++++++++++++++++++++++++++++ build.bat | 33 +++++ microwin.zip | Bin 34128 -> 0 bytes 4 files changed, 369 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 Bhelper.ps1 create mode 100644 build.bat delete mode 100644 microwin.zip diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..013007b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "dotnet.preferCSharpExtension": true +} \ No newline at end of file diff --git a/Bhelper.ps1 b/Bhelper.ps1 new file mode 100644 index 0000000..3cbd205 --- /dev/null +++ b/Bhelper.ps1 @@ -0,0 +1,333 @@ +param( + [Parameter(Mandatory = $true)] + [ValidateSet('Build')] + [string]$Action, + + [Parameter(Mandatory = $true)] + [string]$ScriptDir +) + +$ErrorActionPreference = 'Stop' + +$normalizedScriptDir = $ScriptDir +if ($null -eq $normalizedScriptDir) { + throw 'ScriptDir parameter is missing.' +} +$normalizedScriptDir = $normalizedScriptDir.Trim() +$normalizedScriptDir = $normalizedScriptDir.Trim('"') +if ([string]::IsNullOrWhiteSpace($normalizedScriptDir)) { + throw 'ScriptDir parameter is empty after normalization.' +} +$script:ScriptDir = [System.IO.Path]::GetFullPath($normalizedScriptDir) +$script:ToolsDir = Join-Path $script:ScriptDir 'tools' +$script:LogFile = Join-Path $script:ScriptDir 'BuildLog.txt' +$script:NugetExe = Join-Path $script:ToolsDir 'nuget.exe' +$script:NugetUrl = 'https://dist.nuget.org/win-x86-commandline/latest/nuget.exe' +$script:BuildToolsInstaller = Join-Path $script:ToolsDir 'vs_buildtools.exe' +$script:BuildToolsUrl = 'https://aka.ms/vs/17/release/vs_buildtools.exe' +$script:LockDir = Join-Path $script:ScriptDir '.build.lock' +$script:ProjectPath = Join-Path $script:ScriptDir 'MicroWin\MicroWin.csproj' + +function Write-LogLine { + param([string]$Message) + + $line = "[{0}] {1}" -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff'), $Message + Write-Host $Message + Add-Content -Path $script:LogFile -Value $line -Encoding UTF8 +} + +function Write-LogOutputLine { + param([string]$Message) + + $line = "[{0}] {1}" -f (Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff'), $Message + Add-Content -Path $script:LogFile -Value $line -Encoding UTF8 +} + +function Invoke-Download { + param( + [string]$Url, + [string]$OutFile + ) + + [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 + Write-LogLine "Downloading: $Url" + Invoke-WebRequest -Uri $Url -OutFile $OutFile + Write-LogLine "Saved: $OutFile" +} + +function Invoke-External { + param( + [string]$FilePath, + [string[]]$Arguments, + [string]$WorkingDirectory + ) + + if (-not [string]::IsNullOrWhiteSpace($WorkingDirectory)) { + Push-Location $WorkingDirectory + } + + try { + $argText = if ($Arguments) { ($Arguments -join ' ') } else { '' } + Write-LogLine "Running: $FilePath $argText".Trim() + + & $FilePath @Arguments 2>&1 | ForEach-Object { + $text = [string]$_ + Write-Host $text + Write-LogOutputLine -Message $text + } + + $exitCode = $LASTEXITCODE + if ($null -eq $exitCode) { + $exitCode = 0 + } + + if ($exitCode -ne 0) { + throw "Command failed with exit code $exitCode" + } + } + finally { + if (-not [string]::IsNullOrWhiteSpace($WorkingDirectory)) { + Pop-Location + } + } +} + +function Find-MSBuild { + $candidates = @( + 'C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files (x86)\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files (x86)\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files (x86)\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe', + 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin\MSBuild.exe' + ) + + foreach ($candidate in $candidates) { + if (Test-Path -Path $candidate) { + return $candidate + } + } + + $vswhere = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio\Installer\vswhere.exe' + if (Test-Path -Path $vswhere) { + $found = & $vswhere -latest -requires Microsoft.Component.MSBuild -find MSBuild\**\Bin\MSBuild.exe | Select-Object -First 1 + if ($found) { + return $found + } + } + + return $null +} + +function Find-BuiltExe { + $candidates = @( + (Join-Path $script:ScriptDir 'MicroWin\bin\Release\MicroWin.exe'), + (Join-Path $script:ScriptDir 'MicroWin\bin\AnyCPU\Release\MicroWin.exe'), + (Join-Path $script:ScriptDir 'MicroWin\bin\x64\Release\MicroWin.exe'), + (Join-Path $script:ScriptDir 'MicroWin\bin\x86\Release\MicroWin.exe') + ) + + foreach ($candidate in $candidates) { + if (Test-Path -Path $candidate) { + return $candidate + } + } + + return $null +} + +function Confirm-Yes { + param([string]$Prompt) + + $choice = Read-Host $Prompt + return ($choice -match '^(?i)y(es)?$') +} + +function Initialize-Log { + $tries = 0 + while ($tries -lt 5) { + try { + Set-Content -Path $script:LogFile -Value @( + '==================================================', + "MicroWin Build Log - $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff')", + "Script: $([System.IO.Path]::Combine($script:ScriptDir, 'build.bat'))", + '==================================================', + '' + ) -Encoding UTF8 + return + } + catch { + $tries++ + Start-Sleep -Seconds 1 + } + } + + throw 'Could not initialize BuildLog.txt because it is in use.' +} + +function Acquire-Lock { + if (Test-Path -Path $script:LockDir) { + throw 'Another build process is already running. Close the other build window and try again.' + } + + New-Item -Path $script:LockDir -ItemType Directory -Force | Out-Null +} + +function Release-Lock { + if (Test-Path -Path $script:LockDir) { + Remove-Item -Path $script:LockDir -Recurse -Force -ErrorAction SilentlyContinue + } +} + +function Run-Build { + Acquire-Lock + + try { + if (-not (Test-Path -Path $script:ToolsDir)) { + New-Item -Path $script:ToolsDir -ItemType Directory | Out-Null + } + + Initialize-Log + + Write-Host '========================================' + Write-Host 'MicroWin Build Script' + Write-Host '========================================' + Write-Host '' + Write-LogLine "Build log: $script:LogFile" + + Write-Host '' + Write-LogLine '[1/4] Checking for MSBuild...' + $msbuildPath = Find-MSBuild + if (-not $msbuildPath) { + Write-LogLine 'MSBuild not found. Downloading minimal build tools...' + Invoke-Download -Url $script:BuildToolsUrl -OutFile $script:BuildToolsInstaller + + Write-LogLine 'Installing minimal build tools (MSBuild + .NET Framework 4.8 SDK)...' + Write-LogLine 'This will download ~500MB and install required components.' + Invoke-External -FilePath $script:BuildToolsInstaller -Arguments @( + '--quiet','--wait','--norestart','--nocache', + '--installPath',"$env:ProgramFiles(x86)\Microsoft Visual Studio\2022\BuildTools", + '--add','Microsoft.VisualStudio.Workload.MSBuildTools', + '--add','Microsoft.Net.Component.4.8.SDK', + '--add','Microsoft.Net.Component.4.8.TargetingPack' + ) -WorkingDirectory $script:ScriptDir + + $msbuildPath = Find-MSBuild + if (-not $msbuildPath) { + throw 'MSBuild not found after installation.' + } + } + Write-LogLine "Found MSBuild at: $msbuildPath" + + Write-Host '' + Write-LogLine '[2/4] Checking for NuGet...' + if (-not (Test-Path -Path $script:NugetExe)) { + Write-LogLine 'NuGet not found. Downloading NuGet.exe ~8MB...' + Invoke-Download -Url $script:NugetUrl -OutFile $script:NugetExe + } + Write-LogLine "Found NuGet at: $script:NugetExe" + + Write-Host '' + Write-LogLine '[3/4] Restoring NuGet packages...' + Invoke-External -FilePath $script:NugetExe -Arguments @('restore','MicroWin\MicroWin.csproj','-PackagesDirectory','packages') -WorkingDirectory $script:ScriptDir + Write-LogLine 'NuGet restore completed.' + + Write-Host '' + Write-LogLine '[4/4] Building MicroWin...' + Invoke-External -FilePath $msbuildPath -Arguments @('MicroWin\MicroWin.csproj','/p:Configuration=Release','/p:Platform=AnyCPU','/verbosity:minimal') -WorkingDirectory $script:ScriptDir + + Write-Host '' + Write-Host '========================================' + Write-Host 'Build completed successfully!' + Write-Host '========================================' + Write-Host '' + Write-LogLine 'Build completed successfully.' + + $builtExe = Find-BuiltExe + $outputDir = Join-Path $script:ScriptDir 'MicroWin\bin\Release\' + if ($builtExe) { + Write-LogLine "Output location: $builtExe" + $outputDir = [System.IO.Path]::GetDirectoryName($builtExe) + if (-not $outputDir.EndsWith('\')) { + $outputDir = "$outputDir\" + } + } + else { + Write-LogLine 'Output location: not found' + } + + Write-Host '' + $desktopBuildDir = Join-Path $env:USERPROFILE 'Desktop\MicroWin-Build' + if ($builtExe) { + if (Confirm-Yes 'Copy build output files to Desktop\MicroWin-Build? (Y/N)') { + if (Test-Path -Path $desktopBuildDir) { + Remove-Item -Path $desktopBuildDir -Recurse -Force -ErrorAction SilentlyContinue + } + New-Item -Path $desktopBuildDir -ItemType Directory -Force | Out-Null + Copy-Item -Path (Join-Path $outputDir '*') -Destination $desktopBuildDir -Recurse -Force + if (Test-Path -Path $script:LogFile) { + Copy-Item -Path $script:LogFile -Destination (Join-Path $desktopBuildDir 'BuildLog.txt') -Force + } + Write-LogLine "Copied build output to: $desktopBuildDir" + } + else { + Write-LogLine 'Desktop output copy skipped by user.' + } + } + else { + Write-LogLine 'WARNING: Built executable not found, skipping Desktop copy option.' + } + + Write-Host '' + if (Confirm-Yes 'Remove downloaded build utility files from tools folder? (Y/N)') { + if (Test-Path -Path $script:NugetExe) { Remove-Item -Path $script:NugetExe -Force -ErrorAction SilentlyContinue } + if (Test-Path -Path $script:BuildToolsInstaller) { Remove-Item -Path $script:BuildToolsInstaller -Force -ErrorAction SilentlyContinue } + if (Test-Path -Path $script:ToolsDir) { + try { Remove-Item -Path $script:ToolsDir -Force -ErrorAction Stop } catch {} + } + Write-LogLine 'Removed downloaded build utility files from tools folder.' + } + else { + Write-LogLine 'Build utility cleanup skipped by user.' + } + + Write-Host '' + if (Confirm-Yes 'Open build output folder now? (Y/N)') { + if (Test-Path -Path $outputDir) { + Start-Process -FilePath $outputDir | Out-Null + Write-LogLine "Opened output folder: $outputDir" + } + else { + Write-LogLine 'WARNING: Output folder not found.' + } + } + else { + Write-LogLine 'Open output folder skipped by user.' + } + + Write-Host '' + Write-LogLine 'Build script finished.' + exit 0 + } + catch { + Write-LogLine "ERROR: $($_.Exception.Message)" + exit 1 + } + finally { + Release-Lock + } +} + +if ($Action -eq 'Build') { + Run-Build +} diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..964ead3 --- /dev/null +++ b/build.bat @@ -0,0 +1,33 @@ +@echo off +setlocal enabledelayedexpansion + +set "SCRIPT_DIR=%~dp0" +set "SCRIPT_DIR_SAFE=%SCRIPT_DIR%." +set "HELPER_PS1=%SCRIPT_DIR%Bhelper.ps1" + +net session >nul 2>&1 +if %errorLevel% neq 0 ( + echo Relaunching with Administrator privileges... + pause + powershell -NoProfile -ExecutionPolicy Bypass -Command "try { Start-Process -FilePath '%~f0' -WorkingDirectory '%CD%' -Verb RunAs -ErrorAction Stop; exit 0 } catch { exit 1 }" + if !errorLevel! neq 0 ( + echo ERROR: Failed to start elevated process. UAC may have been cancelled or blocked. + pause + exit /b 1 + ) + echo Elevated build started in a new window. + pause + exit /b 0 +) + +if not exist "%HELPER_PS1%" ( + echo ERROR: Missing helper script: %HELPER_PS1% + pause + exit /b 1 +) + +powershell -NoProfile -ExecutionPolicy Bypass -File "%HELPER_PS1%" -Action Build -ScriptDir "%SCRIPT_DIR_SAFE%" +set "EXIT_CODE=%errorLevel%" + +pause +exit /b %EXIT_CODE% diff --git a/microwin.zip b/microwin.zip deleted file mode 100644 index 37d3a6d2dde19541619244f9261e3bd5d31a43ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34128 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 G+y4WVD0r^` From 4aa0339818c18dd4334133d9b1af96bb695b79fb Mon Sep 17 00:00:00 2001 From: Dennis Hill Date: Fri, 20 Feb 2026 15:10:57 -0600 Subject: [PATCH 2/3] Add GitHub Actions CI build workflow --- .github/workflows/ci-build.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/ci-build.yml diff --git a/.github/workflows/ci-build.yml b/.github/workflows/ci-build.yml new file mode 100644 index 0000000..55faaf5 --- /dev/null +++ b/.github/workflows/ci-build.yml @@ -0,0 +1,28 @@ +name: CI Build + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + workflow_dispatch: + +jobs: + build: + runs-on: windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup MSBuild + uses: microsoft/setup-msbuild@v2 + + - name: Setup NuGet + uses: nuget/setup-nuget@v2 + + - name: Restore packages + run: nuget restore MicroWin/MicroWin.csproj -PackagesDirectory packages + + - name: Build Release + run: msbuild MicroWin/MicroWin.csproj /p:Configuration=Release /p:Platform=AnyCPU /verbosity:minimal \ No newline at end of file From 3d523c13a9d208bcb4af0296e4658e3f7c1a6c2f Mon Sep 17 00:00:00 2001 From: Dennis Hill Date: Fri, 20 Feb 2026 15:16:46 -0600 Subject: [PATCH 3/3] docs: add CI build status badge to README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e6d804c..7031c08 100755 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ ![License: MIT](https://img.shields.io/badge/License-MIT-green) ![Platform: Windows](https://img.shields.io/badge/Platform-Windows%2010%20%2F%2011-0078d4) +[![CI Build](https://github.com/dennisflb/MicroWin/actions/workflows/ci-build.yml/badge.svg)](https://github.com/dennisflb/MicroWin/actions/workflows/ci-build.yml) This repository contains the source code for the C# rewrite of MicroWin. This serves as the continuation of MicroWin from [WinUtil](https://github.com/ChrisTitusTech/winutil) that got removed recently.