blob: bea46da28f0e70a34bb349811fde80603d286881 [file] [log] [blame]
#
# 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.
#
# On entry:
# 1. Args[0] holds the relative path to Qpid/trunk.
# Directory ".\$args[0]" holds the "cpp" directory and
# file QPID_VERSION.txt.
# 2. Args[1] holds the x86 32-bit BOOST_ROOT. "c:\boost"
# 3. Args[2] holds the x64 64-bit BOOST_ROOT. "c:\boost_x64"
# 4. Args[3] holds the version number. "0.7.946106-99"
# 5. The current directory will receive x86 and x64 subdirs.
# 6. The x86 an x64 dirs are where cmake will run.
# 7. Two Boost installations, 32- and 64-bit, are available.
# 9. Boost directories must not be on the path.
# 9. cmake, 7z, and devenv are already on the path.
# 10. devenv is Visual Studio 2008
#
# This script creates separate zip kits for 32- and
# for 64-bit variants.
#
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
################################
#
# 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.
#
function BuildAPlatform
{
param
(
[string] $qpid_cpp_dir,
[string] $platform,
[string] $cmakeGenerator,
[string] $vsTargetDebug,
[string] $vsTargetRelease,
[string] $boostRoot,
[string] $randomness
)
[string] $install_dir = "install_$randomness"
[string] $preserve_dir = "preserve_$randomness"
[string] $zipfile = "qpid-cpp-$platform-$ver.zip"
[string] $platform_dir = "$global:currentDirectory/$platform"
[string] $qpid_cpp_src = "$global:currentDirectory/$qpid_cpp_dir"
#
# 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
#
# Set environment for this build
#
$env:BOOST_ROOT = "$boostRoot"
$env:QPID_BUILD_ROOT = Get-Location
#
# Run cmake
#
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
# Build the .NET binding
if ("x86" -eq $platform) {
devenv $qpid_cpp_src\bindings\qpid\dotnet\org.apache.qpid.messaging.sln `
/build "Debug|Win32" /project org.apache.qpid.messaging
devenv $qpid_cpp_src\bindings\qpid\dotnet\org.apache.qpid.messaging.sln `
/build "Debug|$platform" /project org.apache.qpid.messaging.sessionreceiver
devenv $qpid_cpp_src\bindings\qpid\dotnet\org.apache.qpid.messaging.sln `
/build "RelWithDebInfo|Win32" /project org.apache.qpid.messaging
devenv $qpid_cpp_src\bindings\qpid\dotnet\org.apache.qpid.messaging.sln `
/build "RelWithDebInfo|$platform" /project org.apache.qpid.messaging.sessionreceiver
} else {
devenv $qpid_cpp_src\bindings\qpid\dotnet\org.apache.qpid.messaging.sln `
/build "Debug|$platform" /project org.apache.qpid.messaging
devenv $qpid_cpp_src\bindings\qpid\dotnet\org.apache.qpid.messaging.sln `
/build "Debug|$platform" /project org.apache.qpid.messaging.sessionreceiver
devenv $qpid_cpp_src\bindings\qpid\dotnet\org.apache.qpid.messaging.sln `
/build "RelWithDebInfo|$platform" /project org.apache.qpid.messaging
devenv $qpid_cpp_src\bindings\qpid\dotnet\org.apache.qpid.messaging.sln `
/build "RelWithDebInfo|$platform" /project org.apache.qpid.messaging.sessionreceiver
}
# Define lists of items to be touched in installation tree
# Move target must be a directory
$move=(
('bin/*.lib','lib'),
('bin/boost/*.dll','bin')
)
$preserve=(
'include/qpid/agent',
'include/qpid/amqp_0_10',
'include/qpid/management',
'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/CommonImportExport.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/boost_regex*.*',
'bin/boost',
'conf',
'examples/direct',
'examples/failover',
'examples/fanout',
'examples/pub-sub',
'examples/qmf-console',
'examples/request-response',
'examples/tradedemo',
'include',
'plugins')
# 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"
}
# 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/LICENSE"
Unix2Dos "$install_dir/NOTICE"
# Install the Debug .NET binding
Copy-Item -force -path "./src/Debug/org.apache.qpid.messaging*.dll" -destination "$install_dir/bin"
# Install the .NET binding examples
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
$src = Resolve-Path "$qpid_cpp_src/bindings/qpid/dotnet/winsdk_sources"
$dst = Resolve-Path "$install_dir/dotnet_examples"
Copy-Item "$src\*" -destination "$dst\" -recurse -force
# Zip the /bin PDB files
&'7z' a -mx9 ".\$install_dir\bin\symbols-debug.zip" ".\$install_dir\bin\DebugPDB\*.pdb"
&'7z' a -mx9 ".\$install_dir\bin\symbols-release.zip" ".\$install_dir\bin\ReleasePDB\*.pdb"
Remove-Item -recurse ".\$install_dir\bin\DebugPDB"
Remove-Item -recurse ".\$install_dir\bin\ReleasePDB"
# Zip the dotnet bindings
New-Item -force -type directory "$install_dir/bin/bindingDebug"
Copy-Item -force -path "./src/Debug/org.apache.qpid.messaging*.dll" -destination "$install_dir/bin/bindingDebug/"
Copy-Item -force -path "./src/Debug/org.apache.qpid.messaging*.pdb" -destination "$install_dir/bin/bindingDebug/"
&'7z' a -mx9 ".\$install_dir\bin\dotnet-binding-debug.zip" ".\$install_dir\bin\bindingDebug\*.*"
Remove-Item -recurse ".\$install_dir\bin\bindingDebug"
New-Item -force -type directory "$install_dir/bin/bindingRelease"
Copy-Item -force -path "./src/RelWithDebInfo/org.apache.qpid.messaging*.dll" -destination "$install_dir/bin/bindingRelease/"
Copy-Item -force -path "./src/RelWithDebInfo/org.apache.qpid.messaging*.pdb" -destination "$install_dir/bin/bindingRelease/"
&'7z' a -mx9 ".\$install_dir\bin\dotnet-binding-release.zip" ".\$install_dir\bin\bindingRelease\*.*"
Remove-Item -recurse ".\$install_dir\bin\bindingRelease"
# Create a new zip for the whole kit.
# Exclude *.pdb so as not include the debug symbols twice
if (Test-Path $zipfile) {Remove-Item $zipfile}
&'7z' a $zipfile ".\$install_dir\*" -xr!*pdb
}
################################
#
# Main()
#
# Process the args
#
if ($args.length -lt 3) {
Write-Host 'Usage: bld-winsdk.ps1 qpid_src_dir boost32_dir boost64_dir [version]'
exit
}
$qpid_src = $args[0]
$boostRoot32 = $args[1]
$boostRoot64 = $args[2]
$ver = $args[3]
if ($ver -eq $null) {
$qpid_version_file="$qpid_src\QPID_VERSION.txt"
if ( !(Test-Path $qpid_version_file)) {
Write-Host "Path doesn't seem to be a qpid src tree (no QPID_VERSION.txt)"
exit
}
$ver=Get-Content $qpid_version_file
}
#
# 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
#
BuildAPlatform $qpid_cpp_src `
"x64" `
"Visual Studio 9 2008 Win64" `
"Debug|x64" `
"RelWithDebInfo|x64" `
$boostRoot64 `
$randomness
BuildAPlatform $qpid_cpp_src `
"x86" `
"Visual Studio 9 2008" `
"Debug|Win32" `
"RelWithDebInfo|Win32" `
$boostRoot32 `
$randomness