[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [win-pv-devel] [XENVIF-PATCH] Add clean.ps1 and build.ps1 powershell scripts



> -----Original Message-----
> From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On 
> Behalf Of Owen Smith
> Sent: 18 March 2019 15:18
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Owen Smith <owen.smith@xxxxxxxxxx>
> Subject: [win-pv-devel] [XENVIF-PATCH] Add clean.ps1 and build.ps1 powershell 
> scripts
> 
> Add powershell scripts to clean and build the driver project.
> ./clean.ps1 will delete any files not under source control, and will
> return the working folder to a fresh state.
> ./build.ps1 will build the project and create 2 output zip files
> (xenvif-source.zip and xenvif-[free|checked].zip). Contents of the
> driver package zip will also include a WiX merge module .wxs file that
> can be included in a driver installer.
> Scripts have been designd to use a minimal install situation, where only
> git and VCRedist packages are required, by using the Enterprise WDK ISO
> and its provided build environment.
> 
> Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
> ---
>  BUILD.md            |  34 ++++++-
>  build.ps1           | 273 
> ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  clean.ps1           |  16 +++
>  include/version.inc |  22 +++++
>  src/xenvif.wxs      |  30 ++++++
>  5 files changed, 374 insertions(+), 1 deletion(-)
>  create mode 100644 build.ps1
>  create mode 100644 clean.ps1
>  create mode 100644 include/version.inc
>  create mode 100644 src/xenvif.wxs
> 
> diff --git a/BUILD.md b/BUILD.md
> index 7a56ba7..e2502bf 100644
> --- a/BUILD.md
> +++ b/BUILD.md
> @@ -1,15 +1,46 @@
>  Building the XenVif Package
>  ===========================
> 
> +Simplified Build Process using the EWDK
> +=======================================
> +
> +Requirements:
> +* Access to source (git)
> +* Visual C Redistributables (for SDV)
> +* Enterprise WDK ISO
> +

Git is a requirement by the looks of it (and IIRC it is for the python build 
too) so it should really be called out.

> +Simple Install Procedure using Chocolatey (https://chocolatey.org)
> +
> +From a PowerShell Prompt,
> +PS> Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object
> +    
> System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
> +PS> choco install git.install vcredist-all -y
> +
> +* Mount the EWDK iso
> +PS> D:\LaunchBuildEnv.cmd
> +
> +* change to source/build path
> +* acquire source (git clone...)
> +
> +PS> .\build.ps1
> +    build.ps1 takes several optional parameters:
> +    [string]$VsVersion = "vs2017" (valid "vs2017", "vs2015")
> +    [string]$Configuration = "free" (valid "free", "checked")
> +    [switch]$RunSdv (optional, absent indicates SDV will not be run)
> +
> +
> +Python Build Process
> +====================
> +
>  First you'll need a device driver build environment for Windows 10.
>  This means:
> 
>  *   Visual Studio 2015 (Any SKU, including Express or Community)
>  *   Windows Driver Kit 10
> 
> -Install Visual Studio first (you only need install MFC for C++) and then
>  the WDK. Set an environment variable called VS to the base of the Visual
>  Studio Installation (e.g. C:\Program Files\Microsoft Visual Studio 14.0) and
> +Install Visual Studio first (you only need install MFC for C++) and then
>  a variable called KIT to the base of the WDK
>  (e.g. C:\Program Files\Windows Kits\10). Also set an environment variable
>  called SYMBOL\_SERVER to point at a location where driver symbols can be
> @@ -43,3 +74,4 @@ verifier then you can add the 'nosdv' keyword to the end of 
> your command
>  e.g.:
> 
>      build.py free nosdv
> +
> diff --git a/build.ps1 b/build.ps1
> new file mode 100644
> index 0000000..37ce9a5
> --- /dev/null
> +++ b/build.ps1
> @@ -0,0 +1,273 @@
> +#
> +# Build Driver Package
> +#
> +# Steps:
> +#    build list of replacement values
> +#    clean output folder
> +#    generate xenvif\revision
> +#    generate xenvif\version
> +#    generate include\version.h
> +#    generate xenvif.inf
> +#    generate xenvif\xenvif.wxs
> +#    call msbuild (x64)
> +#    call msbuild (Win32)
> +#            call msbuild (sdv)

Why is this tabbed across?

> +#    create source archive
> +#    create output archive
> +#
> +Param(
> +     [string]$VsVersion = "vs2017",
> +     [string]$Configuration = "free",
> +     [switch]$RunSdv
> +)
> +
> +$Driver="xenvif"
> +$Config="Windows 10 Release" # default value - overridden by VsVersion and 
> Configuration
> +
> +Write-Host "======================================================="
> +Write-Host "Building Driver:           " $Driver
> +Write-Host "Visual Studio Project Dir: " $VsVersion
> +Write-Host "Release/Debug Mode:        " $Configuration
> +Write-Host "Run SDV:                   " $RunSdv
> +Write-Host "======================================================="
> +
> +# Define Global Variables
> +$GitDate = & "git.exe" "show" "-s" "--format=%ci" "HEAD"
> +$GitYear = (Get-Date -date $GitDate).Year
> +$GitMonth = (Get-Date -date $GitDate).Month
> +$GitDay = (Get-Date -date $GitDate).Day
> +$GitRevision = & "git.exe" "rev-list" "--max-count=1" "HEAD"
> +$GitBuildNum = & "git.exe" "rev-list" "HEAD" "--count"
> +
> +$Replacements = [ordered]@{
> +     "@MAJOR_VERSION@"="9";
> +     "@MINOR_VERSION@"="0";
> +     "@MICRO_VERSION@"="0";
> +     "@BUILD_NUMBER@"=$GitBuildNum
> +
> +     "@VENDOR_PREFIX@"="XP";
> +     "@VENDOR_DEVICE_ID@"=$null;
> +     "@VENDOR_NAME@"="Xen Project";
> +     "@PRODUCT_NAME@"="Xen";
> +
> +     "@YEAR@"=$GitYear;
> +     "@MONTH@"=$GitMonth;
> +     "@DAY@"=$GitDay;
> +
> +     "@GIT_REVISION@"=$GitRevision;
> +     "@WIX_PREFIX@"="XENVIF"
> +}
> +
> +Function Replace-Strings {
> +     Param(
> +             [string]$infile,
> +             [string]$outfile,
> +             $list
> +     )
> +     Process {
> +             Write-Host $infile " -> " $outfile
> +             (Get-Content $infile) |
> +             ForEach-Object {
> +                     $line = $_
> +                     $list.GetEnumerator() | ForEach-Object {
> +                             if (([string]::IsNullOrEmpty($_.Value)) -and 
> ($line.Contains($_.Name))) {
> +                                     Write-Host "Skipping Line Containing " 
> $_.Name
> +                                     $line = $null
> +                             }
> +                             $line = $line -replace $_.Key, $_.Value
> +                     }
> +                     $line
> +             } |
> +             Set-Content $outfile
> +     }
> +}
> +
> +Function Build-Solution {
> +     Param(
> +             [string]$Name,
> +             [string]$Configuration = "Windows 10 Release",
> +             [string]$Platform = "x64",
> +             [string]$VsVersion = "vs2017"
> +     )
> +     Process {
> +             $c=[string]::Format("/p:Configuration=`"{0}`"", $Configuration)
> +             $p=[string]::Format("/p:Platform=`"{0}`"", $Platform)
> +             $t="/t:`"Build`""
> +             $s=[string]::Format(".\{0}\{1}.sln", $VsVersion, $Name)
> +             Write-Host "msbuild.exe" "/m:1" $c $p $t $s
> +             & "msbuild.exe" "/m:1" $c $p $t $s
> +
> +             $platlist=@{ "x64"="x64"; "Win32"="x86" }
> +             $src = [string]::Format("{0}\Windows10Release\{1}\package\*.*", 
> $VsVersion, $Platform)
> +             $dst = [string]::Format("xenvif\{0}", $platlist[$Platform])
> +             New-Item -Name $dst -ItemType "directory"
> +             Copy-Item $src -Destination $dst
> +     }
> +}
> +
> +Function Build-Project {
> +     Param(
> +             [string]$Name,
> +             [string]$Project,
> +             [string]$Target = "Build",
> +             [string]$Inputs = "",
> +             [string]$Configuration = "Windows 10 Release",
> +             [string]$Platform = "x64",
> +             [string]$VsVersion = "vs2017"
> +     )
> +     Process {
> +             $cwd = (Get-Location).path
> +             $proj = [string]::Format("{0}\{1}\{2}", $cwd, $VsVersion, $Name)
> +             Set-Location -Path $proj
> +             Write-Host $proj
> +
> +             $c=[string]::Format("/p:Configuration=`"{0}`"", $Configuration)
> +             $p=[string]::Format("/p:Platform=`"{0}`"", $Platform)
> +             $t=[string]::Format("/t:{0}", $Target)
> +             $i=[string]::Format("/p:Inputs=`"{0}`"", $Inputs)
> +             $s=[string]::Format("{0}.vcxproj", $Project)
> +             if ($Inputs) {
> +                     Write-Host "msbuild.exe" $c $p $t $i $s
> +                     & "msbuild.exe" $c $p $t $i $s
> +             } else {
> +                     Write-Host "msbuild.exe" $c $p $t $s
> +                     & "msbuild.exe" $c $p $t $s
> +             }
> +
> +             Set-Location -Path $cwd
> +     }
> +}
> +
> +Function Build-Sdv-Logs {
> +     Param(
> +             [string]$Name,
> +             [string]$Project,
> +             [string]$Configuration = "Windows 10 Release",
> +             [string]$VsVersion = "vs2017"
> +     )
> +     Process {
> +             $cwd = (Get-Location).path
> +
> +             Build-Project $Name $Project
> +             Build-Project $Name $Project "sdv" "/clean"
> +             Build-Project $Name $Project "sdv" "/check:default.sdv"
> +             Build-Project $Name $Project "dvl"
> +
> +             $sdv=[string]::Format("{0}\{1}\*.DVL.XML", $VsVersion, $Project)
> +             $dst=[string]::Format("{0}\{1}\", $cwd, $Project)
> +             Copy-Item $sdv -Destination $dst
> +     }
> +}
> +
> +Function Create-Archive {
> +     Param(
> +             [string]$Filename,
> +             $FileList,
> +             [string]$BaseDir
> +     )
> +     Process {
> +             if ($BaseDir -ne ".") {
> +                     $cwd = Get-Location
> +                     Set-Location $BaseDir
> +             }
> +             Write-Host "Creating Archive" $Filename
> +             if (Test-Path -Path $Filename) { Remove-Item $Filename }
> +             ForEach ($file in $FileList) {
> +                     Compress-Archive -Path $file -DestinationPath $Filename 
> -Update
> +             }
> +             if ($BaseDir -ne ".") {
> +                     Set-Location $cwd
> +             }
> +     }
> +}
> +
> +Function Copy-ArchiveSrc {
> +     Param(
> +             $FileList,
> +             [string]$BasePath
> +     )
> +     Process {
> +             New-Item -Path $BasePath -ItemType Directory -ErrorAction 
> Ignore | Out-Null
> +
> +             ForEach ($file in $FileList) {
> +                     $itempath = Split-Path -Path $file
> +                     $dest = Join-Path -Path $BasePath -ChildPath $itempath
> +                     New-Item -ItemType Directory -Path $dest -ErrorAction 
> Ignore | Out-Null
> +                     Copy-Item $file -Destination $dest -Recurse | Out-Null
> +             }
> +     }
> +}
> +
> +# Build Process...
> +$configlist = @{ "free"="Release"; "checked"="Debug" }
> +$targetoslist = @{ "vs2017"="Windows 10"; "vs2015"="Windows 8" }
> +$Config=[string]::Format("{0} {1}", $targetoslist[$VsVersion], 
> $configlist[$Configuration])
> +
> +# Override branding with env vars (if present)
> +if (Test-Path env:VENDOR_PREFIX)     { $Replacements["@VENDOR_PREFIX@"] = 
> $env:VENDOR_PREFIX }

Indentation is inconsistent here.

> +if (Test-Path env:VENDOR_DEVICE_ID)  { $Replacements["@VENDOR_DEVICE_ID@"] =
> $env:VENDOR_DEVICE_ID }
> +if (Test-Path env:VENDOR_NAME)               { 
> $Replacements["@VENDOR_NAME@"] = $env:VENDOR_NAME }
> +if (Test-Path env:PRODUCT_NAME)              { 
> $Replacements["@PRODUCT_NAME@"] = $env:PRODUCT_NAME }
> +if (Test-Path env:WIX_PREFIX)                { $Replacements["@WIX_PREFIX@"] 
> = $env:WIX_PREFIX }
> +
> +# Show Variables Used
> +$Replacements
> +Write-Host "----"
> +
> +# set version variables
> +$env:MAJOR_VERSION=$Replacements["@MAJOR_VERSION@"]
> +$env:MINOR_VERSION=$Replacements["@MINOR_VERSION@"]
> +$env:MICRO_VERSION=$Replacements["@MICRO_VERSION@"]
> +$env:BUILD_NUMBER=$Replacements["@BUILD_NUMBER@"]
> +
> +# Clean Output Path
> +if (Test-Path -Path $Driver) {
> +     Remove-Item $Driver -Recurse | Out-Null
> +}
> +New-Item -Name $Driver -ItemType "directory" | Out-Null
> +
> +# Generate xenif\revision
> +$revision = [string]::Format("{0}\revision", $Driver)
> +Add-Content -Path $revision -Value $GitRevision
> +
> +# Generate xenif\version
> +$version = [string]::Format("{0}\version", $Driver)
> +$versionvalue = [string]::Format("{0}.{1}.{2}.{3}", 
> $Replacements["@MAJOR_VERSION@"],
> $Replacements["@MINOR_VERSION@"], $Replacements["@MICRO_VERSION@"], 
> $Replacements["@BUILD_NUMBER@"])
> +Add-Content -Path $version -Value $versionvalue
> +
> +# Generate include\version.h
> +Replace-Strings "include\version.inc" "include\version.h" $Replacements
> +
> +# Generate vs2017\xenvif.inf
> +$InfSrc=[string]::Format("src\{0}.inf", $Driver)
> +$InfDst=[string]::Format("{0}\{1}.inf", $VsVersion, $Driver)
> +Replace-Strings $InfSrc $InfDst $Replacements
> +
> +# Generate xenif\xenvif.wxs merge module
> +$WxsSrc=[string]::Format("src\{0}.wxs", $Driver)
> +$WxsDst=[string]::Format("{0}\{1}.wxs", $Driver, $Driver)
> +Replace-Strings $WxsSrc $WxsDst $Replacements
> +
> +# Execute MSBuild.exe
> +Build-Solution $Driver $Config "x64"
> +Build-Solution $Driver $Config "Win32"
> +
> +# Execute MSBuild.exe for SDV
> +if ($RunSdv) { Build-Sdv-Logs $Driver "xenvif" }
> +
> +$cwd = Get-Location
> +
> +# Archive Source     (xenvif-source.zip)
> +$SourceFiles = & "git.exe" "ls-tree" "-r" "--name-only" "HEAD"
> +$SourceZip = [string]::Format("{0}/{1}-source.zip", $cwd, $Driver)
> +$ArchiveTemp = Join-Path -Path $cwd -ChildPath "temp"
> +Copy-ArchiveSrc $SourceFiles $ArchiveTemp
> +$ArchiveFiles = (Get-ChildItem -Path $ArchiveTemp).Name
> +Create-Archive $SourceZip $ArchiveFiles $ArchiveTemp
> +Remove-Item $ArchiveTemp -Recurse
> +
> +# Archive Driver     (xenvif-[checked|free].zip)
> +$DriverFiles = (Get-ChildItem -Path $Driver).Name
> +$DriverZip = [string]::Format("{0}/{1}-{2}.zip", $cwd, $Driver, 
> $Configuration)
> +$DriverPath = Join-Path -Path $cwd -ChildPath $Driver
> +Create-Archive $DriverZip $DriverFiles $DriverPath
> diff --git a/clean.ps1 b/clean.ps1
> new file mode 100644
> index 0000000..16dccb1
> --- /dev/null
> +++ b/clean.ps1

No need for this, and clean.py should be retired. 'git clean -fd' does the job.

> @@ -0,0 +1,16 @@
> +#
> +# Delete all files not under source control
> +#
> +$files = & "git.exe" "status" "-u" "--porcelain"
> +ForEach ($line in $files) {
> +     $type = $line.Split(" ")[0]
> +     if ($type -eq "??") {
> +             $file = $line.Split(" ")[1]
> +             Write-Host $file
> +             if (Test-Path -Path $file -PathType Container) {
> +                     Remove-Item $file -Force -Recurse
> +             } else {
> +                     Remove-Item $file -Force
> +             }
> +     }
> +}
> diff --git a/include/version.inc b/include/version.inc
> new file mode 100644
> index 0000000..316a115
> --- /dev/null
> +++ b/include/version.inc
> @@ -0,0 +1,22 @@
> +#define VENDOR_NAME_STR              "@VENDOR_NAME@"
> +#define VENDOR_PREFIX_STR    "@VENDOR_PREFIX@"
> +#define PRODUCT_NAME_STR     "@PRODUCT_NAME@"
> +
> +#define MAJOR_VERSION                @MAJOR_VERSION@
> +#define MINOR_VERSION                @MINOR_VERSION@
> +#define MICRO_VERSION                @MICRO_VERSION@
> +#define BUILD_NUMBER         @BUILD_NUMBER@
> +
> +#define MAJOR_VERSION_STR    "@MAJOR_VERSION@"
> +#define MINOR_VERSION_STR    "@MINOR_VERSION@"
> +#define MICRO_VERSION_STR    "@MICRO_VERSION@"
> +#define BUILD_NUMBER_STR     "@BUILD_NUMBER@"
> +
> +#define YEAR                         @YEAR@
> +#define MONTH                                @MONTH@
> +#define DAY                                  @DAY@
> +
> +#define YEAR_STR                     "@YEAR@"
> +#define MONTH_STR                    "@MONTH@"
> +#define DAY_STR                              "@DAY@"
> +

Indentation above looks a bit odd.

  Paul

> diff --git a/src/xenvif.wxs b/src/xenvif.wxs
> new file mode 100644
> index 0000000..949c630
> --- /dev/null
> +++ b/src/xenvif.wxs
> @@ -0,0 +1,30 @@
> +<?xml version='1.0' encoding='windows-1252' ?>
> +<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'
> +     xmlns:difx='http://schemas.microsoft.com/wix/DifxAppExtension'>
> +<Module Id='@WIX_PREFIX@_XENVIF' Language='1033'
> Version='@MAJOR_VERSION@.@MINOR_VERSION@.@MICRO_VERSION@.@BUILD_NUMBER@'>
> +    <Package Id='31EE53DC-F692-460F-BE31-CE16EDA08605' 
> Keywords='@PRODUCT_NAME@PVDriver'
> Description='@PRODUCT_NAME@ PV Driver Installer'
> +        Comments='@PRODUCT_NAME@ PV Driver' Manufacturer='@VENDOR_NAME@'
> +        InstallerVersion='200' Languages='1033'
> +        SummaryCodepage='1252' />
> +    <Directory Id="TARGETDIR" Name="SourceDir">
> +      <Directory Id="@WIX_PREFIX@_XENVIF" Name="xenvif">
> +        <Directory Id="@WIX_PREFIX@_XENVIF_X86" Name="x86">
> +          <Component Id="@WIX_PREFIX@_XENVIF_X86" Guid="">
> +            <File Id="@WIX_PREFIX@_X86_XENVIF_INF" Name="xenvif.inf" 
> DiskId="1"
> Source="x86/xenvif.inf" />
> +            <File Id="@WIX_PREFIX@_X86_XENVIF_CAT" Name="xenvif.cat" 
> DiskId="1"
> Source="x86/xenvif.cat" />
> +            <File Id="@WIX_PREFIX@_X86_XENVIF_SYS" Name="xenvif.sys" 
> DiskId="1"
> Source="x86/xenvif.sys" />
> +            <File Id="@WIX_PREFIX@_X86_XENVIF_COINST_DLL" 
> Name="xenvif_coinst.dll" DiskId="1"
> Source="x86/xenvif_coinst.dll" />
> +          </Component>
> +        </Directory>
> +        <Directory Id="@WIX_PREFIX@_XENVIF_X64" Name="x64">
> +          <Component Id="@WIX_PREFIX@_XENVIF_X64" Guid="">
> +            <File Id="@WIX_PREFIX@_X64_XENVIF_INF" Name="xenvif.inf" 
> DiskId="1"
> Source="x64/xenvif.inf" />
> +            <File Id="@WIX_PREFIX@_X64_XENVIF_CAT" Name="xenvif.cat" 
> DiskId="1"
> Source="x64/xenvif.cat" />
> +            <File Id="@WIX_PREFIX@_X64_XENVIF_SYS" Name="xenvif.sys" 
> DiskId="1"
> Source="x64/xenvif.sys" />
> +            <File Id="@WIX_PREFIX@_X64_XENVIF_COINST_DLL" 
> Name="xenvif_coinst.dll" DiskId="1"
> Source="x64/xenvif_coinst.dll" />
> +          </Component>
> +        </Directory>
> +      </Directory>
> +    </Directory>
> +</Module>
> +</Wix>
> --
> 2.16.2.windows.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/win-pv-devel
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.