aboutsummaryrefslogblamecommitdiffstatshomepage
path: root/.appveyor/build.ps1
blob: 18e7cc6a4ff0457175c2bd0dc033a56384fe85be (plain) (tree)
1
2
3
4
5
6
7
      

                                 
                                 
                               

                                    





























                                                                                

                                              
                                                           

 


                                    


                                    

     
                                           






























                                                                                   

                                    



                                    


                                    




                                                                                           
                                                                                                          
                                                                                                                   









                                                             

                                    

                                    


                                    

     




                                                          
                                           




                                           

 





                                


                                                               
         
                                                  
                                                  
                                                  


                                                  


                            
                            




                     
param(
    [Parameter(Mandatory=$true)]
    [string] $InstallDir = $null,
    [string] $ProjectDir = $null,
    [string] $Platform = $null,
    [string] $Configuration = $null,
    [string] $DriverTargetOS = $null
)

$ErrorActionPreference = "Stop";
Set-PSDebug -Strict

function Invoke-Exe {
    param(
        [ScriptBlock] $Cmd,
        [int[]] $AllowedExitCodes = @(0)
    )

    $backupErrorActionPreference = $script:ErrorActionPreference
    $script:ErrorActionPreference = 'Continue'

    try {
        & $Cmd
        if ($AllowedExitCodes -notcontains $LastExitCode) {
            throw "External command failed with exit code ${LastExitCode}: $Cmd"
        }
    } finally {
        $script:ErrorActionPreference = $backupErrorActionPreference
    }
}

function Test-AppVeyor {
    return Test-Path env:APPVEYOR
}

function Set-AppVeyorDefaults {
    $script:ProjectDir = $env:APPVEYOR_BUILD_FOLDER
    $script:Platform = $env:PLATFORM
    $script:Configuration = $env:CONFIGURATION
    $script:DriverTargetOS = $env:appveyor_driver_target_os
}

function Get-DriverConfiguration {
    param(
        [Parameter(Mandatory=$true)]
        [string] $Configuration,
        [Parameter(Mandatory=$true)]
        [string] $DriverTargetOS
    )

    return "$DriverTargetOS $Configuration"
}

function Get-DriverBuildDir {
    param(
        [Parameter(Mandatory=$true)]
        [string] $ProjectDir,
        [Parameter(Mandatory=$true)]
        [string] $DriverSpec
    )

    return "$ProjectDir\km\build\wdk8.1update\$DriverSpec"
}

function Get-DriverSolutionPath {
    param(
        [Parameter(Mandatory=$true)]
        [string] $ProjectDir,
        [Parameter(Mandatory=$true)]
        [string] $DriverSpec
    )

    $build_dir = Get-DriverBuildDir -ProjectDir $ProjectDir -DriverSpec $DriverSpec
    $driver_name = Split-Path -Path $build_dir -Leaf -Resolve
    return "$build_dir\$driver_name.vs12.sln"
}

function Build-Driver {
    param(
        [Parameter(Mandatory=$true)]
        [string] $ProjectDir,
        [Parameter(Mandatory=$true)]
        [string] $InstallDir,
        [Parameter(Mandatory=$true)]
        [string] $DriverSpec,
        [Parameter(Mandatory=$true)]
        [string] $Platform,
        [Parameter(Mandatory=$true)]
        [string] $Configuration,
        [Parameter(Mandatory=$true)]
        [string] $DriverTargetOS
    )

    $build_dir = Get-DriverBuildDir -ProjectDir $ProjectDir -DriverSpec $DriverSpec
    $solution_path = Get-DriverSolutionPath -ProjectDir $ProjectDir -DriverSpec $DriverSpec

    $Configuration = Get-DriverConfiguration -Configuration $Configuration -DriverTargetOS $DriverTargetOS
    $msbuild_params = "/p:Platform=$Platform;Configuration=$Configuration;SignMode=TestSign;OutDir=$InstallDir\lib"

    cd $build_dir
    Invoke-Exe { msbuild.exe $msbuild_params $solution_path }
}

function Build-ProjectKernelMode {
    param(
        [Parameter(Mandatory=$true)]
        [string] $ProjectDir,
        [Parameter(Mandatory=$true)]
        [string] $InstallDir,
        [Parameter(Mandatory=$true)]
        [string] $Platform,
        [Parameter(Mandatory=$true)]
        [string] $Configuration,
        [Parameter(Mandatory=$true)]
        [string] $DriverTargetOS
    )

    $drivers = 'minimal', 'simple', 'special\nt_namespace'

    foreach ($driver in $drivers) {
        Build-Driver                      `
            -ProjectDir $ProjectDir       `
            -InstallDir $InstallDir       `
            -DriverSpec $driver           `
            -Platform $Platform           `
            -Configuration $Configuration `
            -DriverTargetOS $DriverTargetOS
    }
}

function Build-ProjectAppVeyor {
    if (Test-AppVeyor) {
        Set-AppVeyorDefaults
        $appveyor_cwd = pwd
    }

    $script:ProjectDir = (Resolve-Path $script:ProjectDir).Path
    $script:InstallDir = (Resolve-Path $script:InstallDir).Path

    try {
        Build-ProjectKernelMode                  `
            -ProjectDir $script:ProjectDir       `
            -InstallDir $script:InstallDir       `
            -Platform $script:Platform           `
            -Configuration $script:Configuration `
            -DriverTargetOS $script:DriverTargetOS
    } finally {
        if (Test-AppVeyor) {
            cd $appveyor_cwd
            Set-PSDebug -Off
        }
    }
}

Build-ProjectAppVeyor