aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/.ci
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2020-01-07 20:55:25 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2020-01-07 21:01:24 +0300
commit475099510d3cf88ec3e7b53a1e001fa711425480 (patch)
tree23549e78b2587a3da65bb99aed16d23a981dab7c /.ci
parentAppVeyor: build cmake/examples (diff)
downloadcmake-common-475099510d3cf88ec3e7b53a1e001fa711425480.tar.gz
cmake-common-475099510d3cf88ec3e7b53a1e001fa711425480.zip
AppVeyor: verify .exe architecture
Diffstat (limited to '.ci')
-rw-r--r--.ci/verify_arch.ps182
1 files changed, 82 insertions, 0 deletions
diff --git a/.ci/verify_arch.ps1 b/.ci/verify_arch.ps1
new file mode 100644
index 0000000..183a8c5
--- /dev/null
+++ b/.ci/verify_arch.ps1
@@ -0,0 +1,82 @@
+param(
+ [Parameter(Mandatory=$true)]
+ [string] $Path,
+ [Parameter(Mandatory=$true)]
+ [ValidateSet('x64', 'x86')]
+ [string] $Arch
+)
+
+$ErrorActionPreference = "Stop";
+Set-PSDebug -Strict
+
+function Get-MachineType {
+ param(
+ [Parameter(Mandatory=$true)]
+ [string] $Arch
+ )
+
+ $machine_type = switch ($Arch) {
+ 'x64' { 0x8664 }
+ 'x86' { 0x14c }
+ default { throw "Unsupported architecture: $Arch" }
+ }
+ return $machine_type
+}
+
+function Parse-MachineType {
+ param(
+ [Parameter(Mandatory=$true)]
+ [string] $Path
+ )
+
+ $header_offset_offset = 0x3c
+ $machine_type_offset = 4 # Two words
+
+ $bytes = [System.IO.File]::ReadAllBytes($Path)
+ $header_offset = [System.BitConverter]::ToUInt32($bytes, $header_offset_offset)
+ $machine_type = [System.BitConverter]::ToUInt16($bytes, $header_offset + $machine_type_offset)
+
+ return $machine_type
+}
+
+function Verify-Architecture {
+ param(
+ [Parameter(Mandatory=$true)]
+ [string] $Path,
+ [Parameter(Mandatory=$true)]
+ [string] $Arch
+ )
+
+ $actual = Parse-MachineType -Path $Path
+ $actual_hex = "0x{0:x}" -f $actual
+ $expected = Get-MachineType -Arch $Arch
+ $expected_hex = "0x{0:x}" -f $expected
+
+ if ($actual -eq $expected) {
+ Write-Host "File '$Path' matches architecture '$Arch'."
+ } else {
+ Write-Host "File '$Path' DOES NOT match architecture '$Arch'."
+ Write-Error "Expected machine type '$expected_hex', actual machine type is '$actual_hex'."
+ }
+}
+
+function Test-AppVeyor {
+ return Test-Path env:APPVEYOR
+}
+
+function Verify-ArchitectureAppVeyor {
+ if (Test-AppVeyor) {
+ $appveyor_cwd = pwd
+ }
+
+ try {
+ Verify-Architecture -Path $script:Path -Arch $script:Arch
+ } finally {
+ if (Test-AppVeyor) {
+ cd $appveyor_cwd
+ Set-PSDebug -Off
+ }
+ }
+}
+
+Verify-ArchitectureAppVeyor