summaryrefslogtreecommitdiff
path: root/build-scripts/winrtbuild.ps1
diff options
context:
space:
mode:
authorDavid Ludwig <dludwig@pobox.com>2014-11-03 13:07:51 -0500
committerDavid Ludwig <dludwig@pobox.com>2014-11-03 13:07:51 -0500
commit33bbbc10f1693a8a51674075c00bef680e678ada (patch)
tree45e13f770f3b9ad95791a3917c13892ceeb85997 /build-scripts/winrtbuild.ps1
parent84207e93f8e2699c89cfb4e8c6ccab0fb159835a (diff)
downloadsdl-33bbbc10f1693a8a51674075c00bef680e678ada.tar.gz
WinRT: removed '-' from build script file names
Most of the other build scripts don't include a '-' in their file names. This change makes the WinRT build scripts use the same convention.
Diffstat (limited to 'build-scripts/winrtbuild.ps1')
-rw-r--r--build-scripts/winrtbuild.ps1225
1 files changed, 225 insertions, 0 deletions
diff --git a/build-scripts/winrtbuild.ps1 b/build-scripts/winrtbuild.ps1
new file mode 100644
index 000000000..2b1186990
--- /dev/null
+++ b/build-scripts/winrtbuild.ps1
@@ -0,0 +1,225 @@
+#
+# winrtbuild.ps1 -- A Powershell script to build all SDL/WinRT variants,
+# across all WinRT platforms, in all of their supported, CPU architectures.
+#
+# Initial version written by David Ludwig <dludwig@pobox.com>
+#
+# This script can be launched from Windows Explorer by double-clicking
+# on winrtbuild.bat
+#
+# Output will be placed in the following subdirectories of the SDL source
+# tree:
+# * VisualC-WinRT\lib\ -- final .dll, .lib, and .pdb files
+# * VisualC-WinRT\obj\ -- intermediate build files
+#
+# Recommended Dependencies:
+# * Windows 8.1 or higher
+# * Powershell 4.0 or higher (included as part of Windows 8.1)
+# * Visual C++ 2012, for building Windows 8.0 and Windows Phone 8.0 binaries.
+# * Visual C++ 2013, for building Windows 8.1 and Windows Phone 8.1 binaries
+# * SDKs for Windows 8.0, Windows 8.1, Windows Phone 8.0, and
+# Windows Phone 8.1, as needed
+#
+# Commom parameters/variables may include, but aren't strictly limited to:
+# * PlatformToolset: the name of one of Visual Studio's build platforms.
+# Different PlatformToolsets output different binaries. One
+# PlatformToolset exists for each WinRT platform. Possible values
+# may include:
+# - "v110": Visual Studio 2012 build tools, plus the Windows 8.0 SDK
+# - "v110_wp80": Visual Studio 2012 build tools, plus the Windows Phone 8.0 SDK
+# - "v120": Visual Studio 2013 build tools, plus the Windows 8.1 SDK
+# - "v120_wp81": Visual Studio 2013 build tools, plus the Windows Phone 8.1 SDK
+# * VSProjectPath: the full path to a Visual Studio or Visual C++ project file
+# * VSProjectName: the internal name of a Visual Studio or Visual C++ project
+# file. Some of Visual Studio's own build tools use this name when
+# calculating paths for build-output.
+# * Platform: a Visual Studio platform name, which often maps to a CPU
+# CPU architecture. Possible values may include: "Win32" (for 32-bit x86),
+# "ARM", or "x64" (for 64-bit x86).
+#
+
+
+# Gets the .bat file that sets up an MSBuild environment, given one of
+# Visual Studio's, "PlatformToolset"s.
+function Get-MSBuild-Env-Launcher
+{
+ param(
+ [Parameter(Mandatory=$true,Position=1)][string]$PlatformToolset
+ )
+
+ if ($PlatformToolset -eq "v110") { # Windows 8.0 (not Windows Phone), via VS 2012
+ return "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"
+ }
+ if ($PlatformToolset -eq "v110_wp80") { # Windows Phone 8.0, via VS 2012
+ return "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\WPSDK\WP80\vcvarsphoneall.bat"
+ }
+ if ($PlatformToolset -eq "v120") { # Windows 8.1 (not Windows Phone), via VS 2013
+ return "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
+ }
+ if ($PlatformToolset -eq "v120_wp81") { # Windows Phone 8.1, via VS 2013
+ return "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
+ }
+ return ""
+}
+
+# Gets a string that identifies the build-variant of SDL/WinRT that is specific
+# to a particular Visual Studio PlatformToolset.
+function Get-SDL-WinRT-Variant-Name
+{
+ param(
+ [Parameter(Mandatory=$true,Position=1)][string]$PlatformToolset,
+
+ # If true, append a string to this function's output, identifying the
+ # build-variant's minimum-supported version of Visual Studio.
+ [switch]$IncludeVSSuffix = $false
+ )
+
+ if ($PlatformToolset -eq "v110") { # Windows 8.0 (not Windows Phone), via VS 2012 project files
+ if ($IncludeVSSuffix) {
+ return "WinRT80_VS2012"
+ } else {
+ return "WinRT80"
+ }
+ }
+ if ($PlatformToolset -eq "v110_wp80") { # Windows Phone 8.0, via VS 2012 project files
+ if ($IncludeVSSuffix) {
+ return "WinPhone80_VS2012"
+ } else {
+ return "WinPhone80"
+ }
+ }
+ if ($PlatformToolset -eq "v120") { # Windows 8.1 (not Windows Phone), via VS 2013 project files
+ if ($IncludeVSSuffix) {
+ return "WinRT81_VS2013"
+ } else {
+ return "WinRT81"
+ }
+ }
+ if ($PlatformToolset -eq "v120_wp81") { # Windows Phone 8.1, via VS 2013 project files
+ if ($IncludeVSSuffix) {
+ return "WinPhone81_VS2013"
+ } else {
+ return "WinPhone81"
+ }
+ }
+ return ""
+}
+
+# Returns the internal name of a Visual Studio Project.
+#
+# The internal name of a VS Project is encoded inside the project file
+# itself, inside a set of <ProjectName></ProjectName> XML tags.
+function Get-VS-ProjectName
+{
+ param(
+ [Parameter(Mandatory=$true,Position=1)]$VSProjectPath
+ )
+
+ # For now, just do a regex for the project name:
+ $matches = (Get-Content $VSProjectPath | Select-String -Pattern ".*<ProjectName>([^<]+)<.*").Matches
+ foreach ($match in $matches) {
+ if ($match.Groups.Count -ge 1) {
+ return $match.Groups[1].Value
+ }
+ }
+ return $null
+}
+
+# Build a specific variant of SDL/WinRT
+function Build-SDL-WinRT-Variant
+{
+ #
+ # Read in arguments:
+ #
+ param (
+ # name of an SDL project file, minus extensions and
+ # platform-identifying suffixes
+ [Parameter(Mandatory=$true,Position=1)][string]$SDLProjectName,
+
+ [Parameter(Mandatory=$true,Position=2)][string]$PlatformToolset,
+
+ [Parameter(Mandatory=$true,Position=3)][string]$Platform
+ )
+
+ #
+ # Derive other properties from read-in arguments:
+ #
+
+ # The .bat file to setup a platform-appropriate MSBuild environment:
+ $BatchFileForMSBuildEnv = Get-MSBuild-Env-Launcher $PlatformToolset
+
+ # The full path to the VS Project that'll be built:
+ $VSProjectPath = "$PSScriptRoot\..\VisualC-WinRT\$(Get-SDL-WinRT-Variant-Name $PlatformToolset -IncludeVSSuffix)\$SDLProjectName-$(Get-SDL-WinRT-Variant-Name $PlatformToolset).vcxproj"
+
+ # The internal name of the VS Project, used in some post-build steps:
+ $VSProjectName = Get-VS-ProjectName $VSProjectPath
+
+ # Where to place output binaries (.dll, .lib, and .pdb files):
+ $OutDir = "$PSScriptRoot\..\VisualC-WinRT\lib\$PlatformToolset\$Platform"
+
+ # Where to place intermediate build files:
+ $IntermediateDir = "$PSScriptRoot\..\VisualC-WinRT\obj\$SDLProjectName-$(Get-SDL-WinRT-Variant-Name $PlatformToolset)\$Platform"
+
+ #
+ # Build the VS Project:
+ #
+ cmd.exe /c " ""$BatchFileForMSBuildEnv"" x86 & msbuild ""$VSProjectPath"" /p:Platform=$Platform /p:OutDir=""$OutDir\\"" /p:IntDir=""$IntermediateDir\\""" | Out-Host
+ $BuildResult = $?
+
+ #
+ # Move .dll files into place. This fixes a problem whereby MSBuild may
+ # put output files into a sub-directory of $OutDir, rather than $OutDir
+ # itself.
+ #
+ if (Test-Path "$OutDir\$VSProjectName\") {
+ Move-Item -Force "$OutDir\$VSProjectName\*" "$OutDir"
+ }
+
+ #
+ # Clean up unneeded files in $OutDir:
+ #
+ if (Test-Path "$OutDir\$VSProjectName\") {
+ Remove-Item -Recurse "$OutDir\$VSProjectName"
+ }
+ Remove-Item "$OutDir\*.exp"
+ Remove-Item "$OutDir\*.ilk"
+ Remove-Item "$OutDir\*.pri"
+
+ #
+ # All done. Indicate success, or failure, to the caller:
+ #
+ #echo "RESULT: $BuildResult" | Out-Host
+ return $BuildResult
+}
+
+
+#
+# Build each variant, with corresponding .dll, .lib, and .pdb files:
+#
+$DidAnyFail = $false
+
+# Build for Windows Phone 8.0, via VC++ 2012:
+if ( ! (Build-SDL-WinRT-Variant "SDL" "v110_wp80" "ARM")) { $DidAnyFail = $true }
+if ( ! (Build-SDL-WinRT-Variant "SDL" "v110_wp80" "Win32")) { $DidAnyFail = $true }
+
+# Build for Windows Phone 8.1, via VC++ 2013:
+if ( ! (Build-SDL-WinRT-Variant "SDL" "v120_wp81" "ARM")) { $DidAnyFail = $true }
+if ( ! (Build-SDL-WinRT-Variant "SDL" "v120_wp81" "Win32")) { $DidAnyFail = $true }
+
+# Build for Windows 8.0 and Windows RT 8.0, via VC++ 2012:
+if ( ! (Build-SDL-WinRT-Variant "SDL" "v110" "ARM")) { $DidAnyFail = $true }
+if ( ! (Build-SDL-WinRT-Variant "SDL" "v110" "Win32")) { $DidAnyFail = $true }
+if ( ! (Build-SDL-WinRT-Variant "SDL" "v110" "x64")) { $DidAnyFail = $true }
+
+# Build for Windows 8.1 and Windows RT 8.1, via VC++ 2013:
+if ( ! (Build-SDL-WinRT-Variant "SDL" "v120" "ARM")) { $DidAnyFail = $true }
+if ( ! (Build-SDL-WinRT-Variant "SDL" "v120" "Win32")) { $DidAnyFail = $true }
+if ( ! (Build-SDL-WinRT-Variant "SDL" "v120" "x64")) { $DidAnyFail = $true }
+
+# Let the script's caller know whether or not any errors occurred.
+# Exit codes compatible with Buildbot are used (1 for error, 0 for success).
+if ($DidAnyFail -eq $true) {
+ exit 1
+} else {
+ exit 0
+}