diff options
Diffstat (limited to 'qpid/cpp/bld-winsdk.ps1')
-rw-r--r-- | qpid/cpp/bld-winsdk.ps1 | 494 |
1 files changed, 494 insertions, 0 deletions
diff --git a/qpid/cpp/bld-winsdk.ps1 b/qpid/cpp/bld-winsdk.ps1 new file mode 100644 index 0000000000..1a6727fc07 --- /dev/null +++ b/qpid/cpp/bld-winsdk.ps1 @@ -0,0 +1,494 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# This script builds a WinSDK from a Qpid source checkout that
+# has been cleaned of any SVN artifacts. +# It builds a single SDK.zip file. +# The environment for the build has been set up externally so +# that 'devenv' runs the right version of Visual Studio (2008 +# 2010 2012) and the right architecture (x86 or x64), typically: +# call "%VS90COMNTOOLS%..\..\VC\vcvarsall.bat" x86 +# call "%VS90COMNTOOLS%..\..\VC\vcvarsall.bat" amd64 +# or +# call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" x86 +# call "%VS100COMNTOOLS%..\..\VC\vcvarsall.bat" amd64 +# or +# call "%VS110COMNTOOLS%..\..\VC\vcvarsall.bat" x86 +# call "%VS110COMNTOOLS%..\..\VC\vcvarsall.bat" amd64 +# +# On entry: +# 1. Args[0] holds the BOOST_ROOT directory. "c:\boost" +# 2. Args[1] holds the version number. "2.0.0.1" +# This arg/version number is used for output package naming purposes. +# The version number embedded in the built executables and libraries +# comes from qpid/cpp/src/CMakeWinVersions.cmake. +# 3. Args[2] holds the Visual Studio version handle "VS2010" +# Pick VS2008, VS2010, or VS2012. Defaults to VS2008. +# 4. Args[3] holds the architecture handle "x86" +# Either x86 or x64. Defaults to x86. +# 4a. Args[4] optionally holds relative path to proton "..\..\proton\install" +# install root from the directory in which cmake +# is run. If this arg is specified then the +# shared directory is used. If this arg is blank +# or absent then the kit is built without proton. +# The path is relative to <kitroot>\<arch>-<vSversion> described below. +# 5. This file exists in directory kitroot/qpid/cpp. +# The kit is built in a directory <kitroot>\<arch>-<VSversion>. +# For example: <kitroot>\x86-VS2008 +# 6. The <arch>-<VSversion> dirs are where cmake will run. +# 7. Boost must have been built with the same version of Visual Studio +# and the same architecture as this build. +# 8. Boost directories must not be on the path. +# 9. cmake, 7z, and devenv are already on the path. +# +# This script creates a separate zip kit for 32-bit or +# for 64-bit variants. Example output files: +# qpid-cpp-x86-VS2008-2.0.0.1.zip +# qpid-cpp-x64-VS2008-2.0.0.1.zip +# + +# Avoid "The OS handle's position is not what FileStream expected" errors +# that crop up when powershell's and spawned subprocesses' std streams are merged. +# fix from: http://www.leeholmes.com/blog/2008/07/30/workaround-the-os-handles-position-is-not-what-filestream-expected/ +$flagsFld = [Reflection.BindingFlags] "Instance,NonPublic,GetField" +$flagsProp = [Reflection.BindingFlags] "Instance,NonPublic,GetProperty" +$objectRef = $host.GetType().GetField("externalHostRef", $flagsFld).GetValue($host) +$consoleHost = $objectRef.GetType().GetProperty("Value", $flagsProp).GetValue($objectRef, @()) +[void] $consoleHost.GetType().GetProperty("IsStandardOutputRedirected", $flagsProp).GetValue($consoleHost, @()) +$field = $consoleHost.GetType().GetField("standardOutputWriter", $flagsFld) +$field.SetValue( $consoleHost, [Console]::Out) +$field2 = $consoleHost.GetType().GetField("standardErrorWriter", $flagsFld) +$field2.SetValue($consoleHost, [Console]::Out) +
+ +Set-PSDebug -Trace 1 +Set-PSDebug -strict +$ErrorActionPreference='Stop' + +################################ +# +# Global variables +# +[string] $global:bldwinsdkDirectory = Split-Path -parent $MyInvocation.MyCommand.Definition +[string] $global:sourceDirectory = Split-Path -parent $global:bldwinsdkDirectory +[string] $global:currentDirectory = Split-Path -parent $global:sourceDirectory +[string] $global:vsVersion = "VS2008" +[string] $global:vsArch = "x86" +[string] $global:sharedBuildDir = "" + + +################################ +# +# Unix2Dos +# Change text file to DOS line endings +# +function Unix2Dos +{ + param + ( + [string] $fname + )
+ + $fContent = Get-Content $fname
+ $fContent | Set-Content $fname +}
+
+
+################################ +# +# BuildAPlatform +# Build a platform, x86 or x64. +# Compiles and packages Debug and RelWithDebInfo configurations. +# +# Typical invocation: +# BuildAPlatform C:\qpid\cpp x86 "Visual Studio 9 2008" "Debug|Win32" ` +# "RelWithDebInfo|Win32" D:\boost 01234567 VS2008 +# +function BuildAPlatform +{ + param + ( + [string] $qpid_cpp_dir, + [string] $platform, + [string] $cmakeGenerator, + [string] $vsTargetDebug, + [string] $vsTargetRelease, + [string] $boostRoot, + [string] $randomness, + [string] $vsName, + [string] $sharedInstallDir + ) + + [string] $install_dir = $sharedInstallDir + if ($install_dir -eq "") { + # If proton shared install not specified use some local random dir + $install_dir = "install_$randomness" + } + [string] $preserve_dir = "preserve_$randomness" + [string] $zipfile = "qpid-cpp-$platform-$vsName-$ver.zip" + [string] $platform_dir = "$global:currentDirectory/$platform-$vsName" + [string] $qpid_cpp_src = "$global:currentDirectory/$qpid_cpp_dir" + [string] $msvcVer = "" + [string] $msvcVerX = "" + + Write-Host "BuildAPlatform" + Write-Host " qpid_cpp_dir : $qpid_cpp_dir" + Write-Host " platform : $platform" + Write-Host " cmakeGenerator : $cmakeGenerator" + Write-Host " vsTargetDebug : $vsTargetDebug" + Write-Host " vsTargetRelease: $vsTargetRelease" + Write-Host " boostRoot : $boostRoot" + Write-Host " randomness : $randomness" + Write-Host " vsName : $vsName" + Write-Host " installDir : $installDir" + + # + # Compute msvcVer string from the given vsName + # + if ($vsName -eq "VS2008") { + $msvcVer = "msvc9" + $msvcVerX = "msvc9" + } else { + if ($vsName -eq "VS2010") { + $msvcVer = "msvc10" + $msvcVerX = "msvcx" + } else { + if ($vsName -eq "VS2012") { + $msvcVer = "msvc11" + $msvcVerX = "msvcx" + } else { + Write-Host "illegal vsName parameter: $vsName Choose VS2008, VS2010, or VS2012" + exit + } + } + } +
+ # + # Create the platform directory if necessary + # + if (!(Test-Path -path $platform_dir)) + { + New-Item $platform_dir -type Directory | Out-Null + } + + # + # Descend into platform directory + # + Set-Location $platform_dir + + $env:BOOST_ROOT = "$boostRoot" + $env:QPID_BUILD_ROOT = Get-Location + + # + # Run cmake + # + Write-Host "Running cmake: cmake -G ""$cmakeGenerator"" ""-DCMAKE_INSTALL_PREFIX=$install_dir"" $qpid_cpp_src" + Write-Host "From directory: " $(Get-Location) + cmake -G "$cmakeGenerator" "-DCMAKE_INSTALL_PREFIX=$install_dir" $qpid_cpp_src + + # + # Need to build doxygen api docs separately as nothing depends on them. + # Build for both x86 and x64 or cmake_install fails. + if ("x86" -eq $platform) { + devenv qpid-cpp.sln /build "Release|Win32" /project docs-user-api + } else { + devenv qpid-cpp.sln /build "Release|$platform" /project docs-user-api + } + + # Build both Debug and Release builds so we can ship both sets of libs: + # Make RelWithDebInfo for debuggable release code. + # (Do Release after Debug so that the release executables overwrite the + # debug executables. Don't skip Debug as it creates some needed content.) + devenv qpid-cpp.sln /build "$vsTargetDebug" /project INSTALL + devenv qpid-cpp.sln /build "$vsTargetRelease" /project INSTALL + + $bindingSln = Resolve-Path $platform_dir\bindings\qpid\dotnet\$msvcVerX\org.apache.qpid.messaging.sln + + # Build the .NET binding + if ("x86" -eq $platform) { + devenv $bindingSln /build "Debug|Win32" /project org.apache.qpid.messaging + devenv $bindingSln /build "Debug|$platform" /project org.apache.qpid.messaging.sessionreceiver + devenv $bindingSln /build "RelWithDebInfo|Win32" /project org.apache.qpid.messaging + devenv $bindingSln /build "RelWithDebInfo|$platform" /project org.apache.qpid.messaging.sessionreceiver + } else { + devenv $bindingSln /build "Debug|$platform" /project org.apache.qpid.messaging + devenv $bindingSln /build "Debug|$platform" /project org.apache.qpid.messaging.sessionreceiver + devenv $bindingSln /build "RelWithDebInfo|$platform" /project org.apache.qpid.messaging + devenv $bindingSln /build "RelWithDebInfo|$platform" /project org.apache.qpid.messaging.sessionreceiver + } + + # Create install Debug and Release directories + New-Item $(Join-Path $install_dir "bin\Debug" ) -type Directory | Out-Null + New-Item $(Join-Path $install_dir "bin\Release") -type Directory | Out-Null + + # Define lists of items to be touched in installation tree + # Move target must be a directory + $move=( + ('bin/*.lib', 'lib'), + ('bin/*-gd-*.dll', 'bin/Debug'), + ('bin/boost*.dll', 'bin/Release'), + ('bin/Microsoft*', 'bin/Release'), + ('bin/msvc*d.dll', 'bin/Debug'), + ('bin/msvc*.dll', 'bin/Release') , + ('bin/*d.dll', 'bin/Debug'), + ('bin/*.dll', 'bin/Release'), + ('bin/*test.exe', 'bin/Release'), + ('bin/qpid-send.exe', 'bin/Release'), + ('bin/qpid-receive.exe', 'bin/Release') + ) + + $preserve=( + 'include/qpid/messaging', + 'include/qpid/sys/IntegerTypes.h', + 'include/qpid/sys/windows/IntegerTypes.h', + 'include/qpid/sys/posix/IntegerTypes.h', + 'include/qpid/types', + 'include/qpid/ImportExport.h') + + $remove=( + 'bin/qpidd.exe', + 'bin/qpidbroker*.*', + 'bin/*PDB/qpidd.exe', + 'bin/*PDB/qpidbroker*.*', + 'bin/qmfengine*.*', + 'bin/qpidxarm*.*', + 'bin/*PDB/qmfengine*.*', + 'bin/*PDB/qpidxarm*.*', + 'bin/*.exe', + 'bin/qmf-gen', + 'bin/Debug/msvc*', + 'conf', + 'examples/*.sln', + 'examples/*.vcproj', + 'examples/messaging/*.vcproj', + 'include', + 'plugins') + + $removeProtonShared=( + 'lib/cmake', + 'lib/pkgconfig', + 'proton', + 'share') + + # Move some files around in the install tree + foreach ($pattern in $move) { + $target = Join-Path $install_dir $pattern[1] + New-Item -force -type directory $target + Move-Item -force -path "$install_dir/$($pattern[0])" -destination "$install_dir/$($pattern[1])" + } + + # Copy aside the files to preserve + New-Item -path $preserve_dir -type directory + foreach ($pattern in $preserve) { + $target = Join-Path $preserve_dir $pattern + $tparent = Split-Path -parent $target + New-Item -force -type directory $tparent + Move-Item -force -path "$install_dir/$pattern" -destination "$preserve_dir/$pattern" + } + + # Remove everything to remove + foreach ($pattern in $remove) { + Remove-Item -recurse "$install_dir/$pattern" + } + if ($sharedInstallDir -ne "") { + foreach ($pattern in $removeProtonShared) { + $target = Join-Path $install_dir $pattern + if (Test-Path -path $target) { + Remove-Item -recurse $target + } + } + } + + # Copy back the preserved things + foreach ($pattern in $preserve) { + $target = Join-Path $install_dir $pattern + $tparent = Split-Path -parent $target + New-Item -force -type directory $tparent + Move-Item -force -path "$preserve_dir/$pattern" -destination "$install_dir/$pattern" + } + Remove-Item -recurse $preserve_dir + + # Install the README + Copy-Item -force -path "$qpid_cpp_src/README-winsdk.txt" -destination "$install_dir/README-winsdk.txt" + + # Set top level info files to DOS line endings
+ Unix2Dos "$install_dir/README-winsdk.txt"
+ Unix2Dos "$install_dir/docs/LICENSE"
+ Unix2Dos "$install_dir/docs/NOTICE" + Unix2Dos "$install_dir/examples/README.txt"
+
+ # Install the .NET binding example source code + New-Item -path $(Join-Path $(Get-Location) $install_dir) -name dotnet_examples -type directory + New-Item -path $(Join-Path $(Get-Location) $install_dir/dotnet_examples) -name examples -type directory + + $src = Resolve-Path "$qpid_cpp_src/bindings/qpid/dotnet/examples" + $dst = Resolve-Path "$install_dir/dotnet_examples" + Copy-Item "$src\" -destination "$dst\" -recurse -force + + Get-ChildItem * -include *.csv -recurse | remove-item + cmd /c "rd /s /q ""$install_dir/dotnet_examples/examples/msvc9""" + cmd /c "rd /s /q ""$install_dir/dotnet_examples/examples/msvc10""" + + # TODO: Fix up the .NET binding example solution/projects before including them. + $src = Resolve-Path "$platform_dir/bindings/qpid/dotnet/winsdk_sources/$msvcVerX" + $dst = Resolve-Path "$install_dir/dotnet_examples" + Copy-Item "$src\*" -destination "$dst\" -recurse -force + + # For the C++ examples: install a CMakeLists.txt file so customers can build + # their own Visual Studio solutions and projects. + New-Item $(Join-Path $install_dir "examples\examples-cmake") -type Directory | Out-Null + $src = Resolve-Path "$global:sourceDirectory/cpp/examples/winsdk-cmake" + $dst = Join-Path $install_dir "examples\examples-cmake" + Copy-Item "$src\*" -destination "$dst\" + + # Create a batch file that will run examples-cmake with the correct generator + $dst = Join-Path $install_dir "examples\examples-cmake\run-cmake.bat" + "REM" | Out-File -filepath $dst -encoding ASCII + "REM run-cmake.bat" | Out-File -filepath $dst -encoding ASCII -append + "REM" | Out-File -filepath $dst -encoding ASCII -append + "REM Runs cmake to build native C++ example solution and" | Out-File -filepath $dst -encoding ASCII -append + "REM projects for this WinSDK: $platform $vsName" | Out-File -filepath $dst -encoding ASCII -append + "REM" | Out-File -filepath $dst -encoding ASCII -append + "cmake -G ""$cmakeGenerator"" ." | Out-File -filepath $dst -encoding ASCII -append + + # Zip the /bin PDB files
+ &'7z' a -mx9 ".\$install_dir\bin\Debug\symbols-debug.zip" ".\$install_dir\lib\DebugPDB\*.pdb" + &'7z' a -mx9 ".\$install_dir\bin\Release\symbols-release.zip" ".\$install_dir\lib\ReleasePDB\*.pdb" + Remove-Item -recurse ".\$install_dir\lib\DebugPDB" + Remove-Item -recurse ".\$install_dir\lib\ReleasePDB" +
+ # Copy the dotnet bindings + Copy-Item -force -path "./src/Debug/org.apache.qpid.messaging*.dll" -destination "$install_dir/bin/Debug/" + Copy-Item -force -path "./src/Debug/org.apache.qpid.messaging*.pdb" -destination "$install_dir/bin/Debug/" +
+ Copy-Item -force -path "./src/RelWithDebInfo/org.apache.qpid.messaging*.dll" -destination "$install_dir/bin/Release/" + Copy-Item -force -path "./src/RelWithDebInfo/org.apache.qpid.messaging*.pdb" -destination "$install_dir/bin/Release/" + + # Create a new zip for the whole kit. + if (Test-Path $zipfile) {Remove-Item $zipfile} + &'7z' a $zipfile ".\$install_dir\*" +} + +################################ +# +# Main() +# +# Process the args +#
+ +if ($args.length -lt 3) { + Write-Host 'Usage: bld-winsdk.ps1 boost_root buildVersion [VisualStudioVersion [architecture [relative-path-to-proton-install-dir]]]' + Write-Host ' bld-winsdk.ps1 d:\boost-32 1.2.3.4 VS2008 x86 ..\..\git-proton\install' + exit +} + +$qpid_src = Split-Path -leaf $global:sourceDirectory +$boostRoot = $args[0] +$ver = $args[1] +$generator = "" +$global:vsVersion = $args[2] +if ( !($global:vsVersion -eq $null) ) { + if ($global:vsVersion -eq "VS2008") { + $generator = "Visual Studio 9 2008" + } else { + if ($global:vsVersion -eq "VS2010") { + $generator = "Visual Studio 10" + } else { + if ($global:vsVersion -eq "VS2012") { + $generator = "Visual Studio 11" + } else { + Write-Host "Visual Studio Version must be VS2008, VS2010, or VS2012" + exit + } + } + } +} else { + # default generator + $global:vsVersion = "VS2008" + $generator = "Visual Studio 9 2008" +} + +$global:vsArch = $args[3] +if ( !($global:vsArch -eq $null) ) { + if ($global:vsArch -eq "x86") { + } else { + if ($global:vsArch -eq "x64") { + } else { + Write-Host "Architecture must be x86 or x64" + exit + } + } +} else { + # default architecture + $global:vsArch = "x86" +} + +$global:sharedBuildDir = $args[4] +if ($global:sharedBuildDir -eq $null) { + $global:sharedBuildDir = "" +} + +Write-Host "bld-winsdk.ps1" +Write-Host " qpid_src : $qpid_src" +Write-Host " boostRoot : $boostRoot" +Write-Host " ver : $ver" +Write-Host " cmake gene : $generator" +Write-Host " vsVersion : $global:vsVersion" +Write-Host " vsArch : $global:vsArch" +Write-Host " sharedBuild : $global:sharedBuildDir" + +# +# Verify that Boost is not in PATH +# +[string] $oldPath = $env:PATH +$oldPath = $oldPath.ToLower() +if ($oldPath.Contains("boost")) +{ + Write-Host "This script will not work with BOOST defined in the path environment variable." + Exit +} + + +$randomness=[System.IO.Path]::GetRandomFileName() +$qpid_cpp_src="$qpid_src\cpp" + +# +# buid +# +if ($global:vsArch -eq "x86") { + BuildAPlatform $qpid_cpp_src ` + "x86" ` + "$generator" ` + "Debug|Win32" ` + "RelWithDebInfo|Win32" ` + $boostRoot ` + $randomness ` + $global:vsVersion ` + $global:sharedBuildDir +} else { + BuildAPlatform $qpid_cpp_src ` + "x64" ` + "$generator Win64" ` + "Debug|x64" ` + "RelWithDebInfo|x64" ` + $boostRoot ` + $randomness ` + $global:vsVersion ` + $global:sharedBuildDir +}
\ No newline at end of file |