mirror of
https://github.com/pocoproject/poco.git
synced 2025-01-06 00:31:10 +01:00
f02088d218
buildwin.ps1 failed to build x64 #3740 If build x64 the scripts looks for the _x64.vcproj Files which no longer exists. By removing this the Build is possible. If only the Build Tools for Visual Studio are available the script does not run because those are not recognized by the Select-VSSetupInstance Script. Adding the parameter `-product *` also recognizes the Build Tools. * Removed unused Parameter `platformName` * Added New CI targets for building poco with the buildwin.ps1 script Co-authored-by: Jan Kevin Dick <Jan.Dick@de.bosch.com> Co-authored-by: Aleksandar Fabijanic <aleks-f@users.noreply.github.com>
515 lines
14 KiB
PowerShell
515 lines
14 KiB
PowerShell
#
|
|
# POCO build script
|
|
#
|
|
# Usage:
|
|
# ------
|
|
# buildwin.ps1 [-poco_base dir]
|
|
# [-vs 140 | 150 | 160| 170]
|
|
# [-action build | rebuild | clean]
|
|
# [-linkmode shared | static_mt | static_md | all]
|
|
# [-config release | debug | both]
|
|
# [-platform Win32 | x64 | WinCE | WEC2013]
|
|
# [-samples]
|
|
# [-tests]
|
|
# [-omit "Lib1X,LibY,LibZ,..."]
|
|
# [-tool msbuild | devenv]
|
|
# [-useenv env | noenv]
|
|
# [-verbosity m[inimal] | q[uiet] | n[ormal] | d[etailed] | diag[nostic]]
|
|
# [-openssl_base dir]
|
|
# [-mysql_base dir]
|
|
|
|
[CmdletBinding()]
|
|
Param
|
|
(
|
|
[Parameter()]
|
|
[string] $poco_base,
|
|
|
|
[Parameter()]
|
|
[ValidateSet(140, 150, 160, 170)]
|
|
[int] $vs = 140,
|
|
|
|
[Parameter()]
|
|
[ValidateSet('build', 'rebuild', 'clean')]
|
|
[string] $action = 'build',
|
|
|
|
[Parameter()]
|
|
[ValidateSet('shared', 'static_mt', 'static_md', 'all')]
|
|
[string] $linkmode = 'shared',
|
|
|
|
[Parameter()]
|
|
[ValidateSet('release', 'debug', 'both')]
|
|
[string] $config = 'release',
|
|
|
|
[Parameter()]
|
|
[ValidateSet('Win32', 'x64', 'WinCE', 'WEC2013')]
|
|
[string] $platform = 'x64',
|
|
|
|
[switch] $tests = $false,
|
|
[switch] $samples = $false,
|
|
[string] $omit,
|
|
|
|
[Parameter()]
|
|
[ValidateSet('msbuild', 'devenv')]
|
|
[string] $tool = 'msbuild',
|
|
|
|
[Parameter()]
|
|
[ValidateSet('env', 'noenv')]
|
|
[string] $useenv = 'env',
|
|
|
|
[Parameter()]
|
|
[ValidateSet('quiet', 'm[inimal]', 'n[ormal]', 'd[etailed]', 'diag[nostic]')]
|
|
[string] $verbosity = 'minimal',
|
|
|
|
[Parameter()]
|
|
[string] $openssl_base,
|
|
|
|
[Parameter()]
|
|
[string] $mysql_base,
|
|
|
|
[switch] $help
|
|
)
|
|
|
|
function Add-VSCOMNTOOLS([int] $vsver)
|
|
{
|
|
if ($vsver -ge 150)
|
|
{
|
|
$vssetup= $([Environment]::GetFolderPath("MyDocuments"))
|
|
$vssetup= Join-Path $vssetup "WindowsPowerShell"
|
|
$vssetup= Join-Path $vssetup "Modules"
|
|
$vssetup= Join-Path $vssetup "VSSetup"
|
|
if (-not (Test-Path $vssetup))
|
|
{
|
|
Install-Module VSSetup -Scope CurrentUser -Force
|
|
}
|
|
if ($vsver -eq 150)
|
|
{
|
|
$range='[15.0,16.0)'
|
|
}
|
|
if ($vsver -eq 160)
|
|
{
|
|
$range='[16.0,17.0)'
|
|
}
|
|
if ($vsver -eq 170)
|
|
{
|
|
$range='[17.0,18.0)'
|
|
}
|
|
|
|
$installationPath = Get-VSSetupInstance | Select-VSSetupInstance -Version $range -product * -Latest -Require Microsoft.VisualStudio.Component.VC.Tools.x86.x64 | select InstallationPath
|
|
$vscomntools = $installationPath.psobject.properties.Value;
|
|
if ($vsver -eq 150)
|
|
{
|
|
set-item -force -path "ENV:VS150COMNTOOLS" -value "$vscomntools\Common7\Tools\"
|
|
Write-Host "`nVS150COMNTOOLS=$env:VS150COMNTOOLS" -ForegroundColor Yellow
|
|
}
|
|
if ($vsver -eq 160)
|
|
{
|
|
set-item -force -path "ENV:VS160COMNTOOLS" -value "$vscomntools\Common7\Tools\"
|
|
Write-Host "`nVS160COMNTOOLS=$env:VS160COMNTOOLS" -ForegroundColor Yellow
|
|
}
|
|
if ($vsver -eq 170)
|
|
{
|
|
set-item -force -path "ENV:VS170COMNTOOLS" -value "$vscomntools\Common7\Tools\"
|
|
Write-Host "`nVS170COMNTOOLS=$env:VS170COMNTOOLS" -ForegroundColor Yellow
|
|
}
|
|
}
|
|
}
|
|
|
|
function Add-Env-Var([string] $lib, [string] $var)
|
|
{
|
|
if ((${Env:$var} -eq $null) -or (-not ${Env:$var}.Contains(${Env:$lib_$var"})))
|
|
{
|
|
$libvar = "$lib" + "_" + "$var"
|
|
$envvar = [Environment]::GetEnvironmentVariable($var, "Process")
|
|
$envvar = $envvar + ';' + [Environment]::GetEnvironmentVariable($libvar, "Process")
|
|
[Environment]::SetEnvironmentVariable($var, $envvar, "Process")
|
|
}
|
|
}
|
|
|
|
|
|
function Set-Environment
|
|
{
|
|
if ($poco_base -eq '') { $script:poco_base = Get-Location }
|
|
|
|
switch ( $vs )
|
|
{
|
|
140 { }
|
|
default { Add-VSCOMNTOOLS $vs }
|
|
}
|
|
|
|
if (-Not $Env:PATH.Contains("$Env:POCO_BASE\bin64;$Env:POCO_BASE\bin;"))
|
|
{ $Env:PATH = "$Env:POCO_BASE\bin64;$Env:POCO_BASE\bin;$Env:PATH" }
|
|
|
|
if ($openssl_base -eq '')
|
|
{
|
|
$script:openssl_base = '$poco_base\openssl'
|
|
}
|
|
|
|
$Env:OPENSSL_DIR = "$openssl_base"
|
|
$Env:OPENSSL_INCLUDE = "$Env:OPENSSL_DIR\include"
|
|
$Env:OPENSSL_LIB = "$Env:OPENSSL_DIR\lib;$Env:OPENSSL_DIR\lib\VC"
|
|
Add-Env-Var "OPENSSL" "INCLUDE"
|
|
Add-Env-Var "OPENSSL" "LIB"
|
|
|
|
if ($mysql_base -ne '')
|
|
{
|
|
$Env:MYSQL_DIR = "$mysql_base"
|
|
$Env:MYSQL_INCLUDE = "$Env:MYSQL_DIR\include"
|
|
$Env:MYSQL_LIB = "$Env:MYSQL_DIR\lib"
|
|
Add-Env-Var "MYSQL" "INCLUDE"
|
|
Add-Env-Var "MYSQL" "LIB"
|
|
}
|
|
|
|
$vsct = "VS$($vs)COMNTOOLS"
|
|
$vsdir = ''
|
|
$vsdir = (Get-Item Env:$vsct).Value
|
|
$Command = ''
|
|
$CommandArg = ''
|
|
if ($platform -eq 'x64') { $CommandArg = "amd64" }
|
|
else { $CommandArg = "x86" }
|
|
if ($vs -eq 150)
|
|
{
|
|
$Command = Resolve-Path "$($vsdir)\..\..\VC\Auxiliary\Build\vcvarsall.bat"
|
|
$script:msbuild_exe = Resolve-Path "$($vsdir)\..\..\MSBuild\15.0\Bin\MSBuild.exe"
|
|
} else {
|
|
if ($vs -eq 160)
|
|
{
|
|
$Command = Resolve-Path "$($vsdir)\..\..\VC\Auxiliary\Build\vcvarsall.bat"
|
|
$script:msbuild_exe = Resolve-Path "$($vsdir)\..\..\MSBuild\Current\Bin\MSBuild.exe"
|
|
}
|
|
else
|
|
{
|
|
if ($vs -eq 170)
|
|
{
|
|
$Command = Resolve-Path "$($vsdir)\..\..\VC\Auxiliary\Build\vcvarsall.bat"
|
|
$script:msbuild_exe = Resolve-Path "$($vsdir)\..\..\MSBuild\Current\Bin\MSBuild.exe"
|
|
}
|
|
else
|
|
{
|
|
$Command = Resolve-Path "$($vsdir)\..\..\VC\vcvarsall.bat"
|
|
$script:msbuild_exe = "MSBuild.exe"
|
|
}
|
|
}}
|
|
|
|
$tempFile = [IO.Path]::GetTempFileName()
|
|
cmd /c " `"$Command`" $CommandArg && set > `"$tempFile`" "
|
|
Get-Content $tempFile | Foreach-Object {
|
|
if($_ -match "^(.*?)=(.*)$")
|
|
{
|
|
Set-Content "Env:$($matches[1])" $matches[2]
|
|
}
|
|
}
|
|
Remove-Item $tempFile
|
|
}
|
|
|
|
|
|
function Process-Input
|
|
{
|
|
if ($help -eq $true)
|
|
{
|
|
Write-Host 'Usage:'
|
|
Write-Host '------'
|
|
Write-Host 'buildwin.ps1 [-poco_base <dir>]'
|
|
Write-Host ' [-vs 140 | 150 | 160 | 170]'
|
|
Write-Host ' [-action build | rebuild | clean]'
|
|
Write-Host ' [-linkmode shared | static_mt | static_md | all]'
|
|
Write-Host ' [-config release | debug | both]'
|
|
Write-Host ' [-platform Win32 | x64 | WinCE | WEC2013]'
|
|
Write-Host ' [-samples]'
|
|
Write-Host ' [-tests]'
|
|
Write-Host ' [-omit "Lib1X,LibY,LibZ,..."]'
|
|
Write-Host ' [-tool msbuild | devenv]'
|
|
Write-Host ' [-useenv env | noenv]'
|
|
Write-Host ' [-verbosity minimal | quiet | normal | detailed | diagnostic'
|
|
Write-Host ' [-openssl_base <dir>]'
|
|
Write-Host ' [-mysql_base <dir>]'
|
|
|
|
Exit
|
|
}
|
|
else
|
|
{
|
|
Set-Environment
|
|
|
|
Write-Host "Build configuration:"
|
|
Write-Host "--------------------"
|
|
Write-Host "Poco Base: $poco_base"
|
|
Write-Host "Version: $vs"
|
|
Write-Host "Action: $action"
|
|
Write-Host "Link Mode: $linkmode"
|
|
Write-Host "Configuration: $config"
|
|
Write-Host "Platform: $platform"
|
|
Write-Host "Tests: $tests"
|
|
Write-Host "Samples: $samples"
|
|
Write-Host "Build Tool: $tool"
|
|
|
|
if ($omit -ne '')
|
|
{
|
|
Write-Host "Omit: $omit"
|
|
}
|
|
|
|
if ($openssl_base -ne '')
|
|
{
|
|
Write-Host "OpenSSL: $openssl_base"
|
|
}
|
|
|
|
if ($mysql_base -ne '')
|
|
{
|
|
Write-Host "MySQL: $mysql_base"
|
|
}
|
|
|
|
# NB: this won't work in PowerShell ISE
|
|
#Write-Host "Press Ctrl-C to exit or any other key to continue ..."
|
|
#$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp")
|
|
}
|
|
}
|
|
|
|
|
|
function Exec-MSBuild([string] $vsProject, [string] $projectConfig)
|
|
{
|
|
if (!(Test-Path -Path $vsProject -PathType leaf)) {
|
|
Write-Host "Project $vsProject not found, skipping."
|
|
return
|
|
}
|
|
|
|
$cmd = "&`"$script:msbuild_exe`" $vsProject /nologo /m /t:$action /p:Configuration=$projectConfig /p:BuildProjectReferences=false /p:Platform=$platform /p:useenv=$useenv /v:$verbosity"
|
|
Write-Host $cmd
|
|
Invoke-Expression $cmd
|
|
if ($LastExitCode -ne 0) { Exit $LastExitCode }
|
|
}
|
|
|
|
|
|
function Build-MSBuild([string] $vsProject, [switch] $skipStatic)
|
|
{
|
|
if ($linkmode -contains "static" -and $skipStatic) { Return }
|
|
|
|
if ($linkmode -eq 'all')
|
|
{
|
|
$linkModeArr = @('shared')
|
|
if (-not $skipStatic)
|
|
{
|
|
$linkModeArr += 'static_mt', 'static_md'
|
|
}
|
|
|
|
foreach ($mode in $linkModeArr)
|
|
{
|
|
if ($config -eq 'both')
|
|
{
|
|
$configArr = 'release', 'debug'
|
|
foreach ($cfg in $configArr)
|
|
{
|
|
Exec-MSBuild $vsProject "$($cfg)_$($mode)"
|
|
}
|
|
}
|
|
else #config
|
|
{
|
|
Exec-MSBuild $vsProject "$($config)_$($mode)"
|
|
}
|
|
}
|
|
}
|
|
else #linkmode
|
|
{
|
|
if ($config -eq 'both')
|
|
{
|
|
$configArr = 'release', 'debug'
|
|
foreach ($cfg in $configArr)
|
|
{
|
|
Exec-MSBuild $vsProject "$($cfg)_$($linkmode)"
|
|
}
|
|
}
|
|
else #config
|
|
{
|
|
Exec-MSBuild $vsProject "$($config)_$($linkmode)"
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function Exec-Devenv([string] $projectConfig, [string] $vsProject)
|
|
{
|
|
$cmd = "devenv /useenv /$action $projectConfig $vsProject"
|
|
Write-Host $cmd
|
|
Invoke-Expression $cmd
|
|
}
|
|
|
|
|
|
function Build-Devenv([string] $vsProject, [switch] $skipStatic)
|
|
{
|
|
if ($linkmode -contains "static" -and $skipStatic) { Return }
|
|
|
|
if ($linkmode -eq 'all')
|
|
{
|
|
$linkModeArr = @('shared')
|
|
if (-not $skipStatic)
|
|
{
|
|
$linkModeArr += 'static_mt', 'static_md'
|
|
}
|
|
|
|
foreach ($mode in $linkModeArr)
|
|
{
|
|
if ($config -eq 'both')
|
|
{
|
|
$configArr = 'release', 'debug'
|
|
foreach ($cfg in $configArr)
|
|
{
|
|
Exec-Devenv "$($cfg)_$($mode)" $vsProject
|
|
}
|
|
}
|
|
else #config
|
|
{
|
|
Exec-Devenv "$($config)_$($mode)" $vsProject
|
|
}
|
|
}
|
|
}
|
|
else #linkmode
|
|
{
|
|
if ($config -eq 'both')
|
|
{
|
|
$configArr = 'release', 'debug'
|
|
foreach ($cfg in $configArr)
|
|
{
|
|
Exec-Devenv "$($cfg)_$($linkmode)" $vsProject
|
|
}
|
|
}
|
|
else #config
|
|
{
|
|
Exec-Devenv "$($config)_$($linkmode)" $vsProject
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function Build-samples
|
|
{
|
|
process {
|
|
$sampleName = $_.BaseName.split("_")[0]
|
|
$sampleProjName = "$($poco_base)\$($componentDir)\samples\$($sampleName)\$($_)"
|
|
if ($tool -eq 'devenv') { Build-Devenv $sampleProjName }
|
|
elseif ($tool -eq 'msbuild') { Build-MSBuild $sampleProjName }
|
|
else{ Write-Host "Tool not supported: $tool" }
|
|
}
|
|
}
|
|
|
|
|
|
function Build-Exec([string] $tool, [string] $vsProject, [switch] $skipStatic)
|
|
{
|
|
if (!(Test-Path -Path $vsProject)) # not found
|
|
{
|
|
Write-Host "+------------------------------------------------------------------"
|
|
Write-Host "| VS project $vsProject not found, skipping."
|
|
Write-Host "+------------------------------------------------------------------"
|
|
Return
|
|
}
|
|
if ($tool -eq 'devenv') { Build-Devenv $vsProject -skipStatic:$skipStatic }
|
|
elseif ($tool -eq 'msbuild') { Build-MSBuild $vsProject -skipStatic:$skipStatic }
|
|
else
|
|
{
|
|
Write-Host "Build tool $tool not supported. Exiting."
|
|
Exit -1
|
|
}
|
|
}
|
|
|
|
|
|
function Build-Components([string] $extension, [string] $type)
|
|
{
|
|
Get-Content "$poco_base\components" | Foreach-Object {
|
|
|
|
$component = $_
|
|
$componentDir = $_.Replace("/", "\")
|
|
$componentArr = $_.split('/')
|
|
$componentName = $componentArr[$componentArr.Length - 1]
|
|
$suffix = "_vs$vs"
|
|
|
|
$omitArray = @()
|
|
$omit.Split(',') | ForEach {
|
|
$omitArray += $_.Trim()
|
|
}
|
|
|
|
if ($omitArray -NotContains $component)
|
|
{
|
|
$vsProject = "$poco_base\$componentDir\$componentName$($suffix).$($extension)"
|
|
|
|
if (!(Test-Path -Path $vsProject)) # when VS project name is not same as directory name
|
|
{
|
|
$vsProject = "$poco_base\$componentDir$($suffix).$($extension)"
|
|
if (!(Test-Path -Path $vsProject)) # not found
|
|
{
|
|
Write-Host "+------------------------------------------------------------------"
|
|
Write-Host "| VS project $vsProject not found, skipping."
|
|
Write-Host "+------------------------------------------------------------------"
|
|
Return # since Foreach-Object is a function, this is actually loop "continue"
|
|
}
|
|
}
|
|
|
|
Write-Host "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
|
|
Write-Host "| Building $vsProject"
|
|
Write-Host "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
|
|
|
|
if ($type -eq "lib")
|
|
{
|
|
Build-Exec $tool $vsProject
|
|
}
|
|
ElseIf ($tests -and ($type -eq "test"))
|
|
{
|
|
$vsTestProject = "$poco_base\$componentDir\testsuite\TestSuite$($suffix).$($extension)"
|
|
Write-Host "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
|
|
Write-Host "| Building $vsTestProject"
|
|
Write-Host "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
|
|
Build-Exec $tool $vsTestProject
|
|
|
|
if ($component -eq "Foundation") # special case for Foundation, which needs test app and dll
|
|
{
|
|
$vsTestProject = "$poco_base\$componentDir\testsuite\TestApp$($suffix).$($extension)"
|
|
Write-Host "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
|
|
Write-Host "| Building $vsTestProject"
|
|
Write-Host "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
|
|
Build-Exec $tool $vsTestProject
|
|
|
|
$vsTestProject = "$poco_base\$componentDir\testsuite\TestLibrary$($suffix).$($extension)"
|
|
Write-Host "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
|
|
Write-Host "| Building $vsTestProject"
|
|
Write-Host "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
|
|
Build-Exec $tool $vsTestProject -skipStatic
|
|
}
|
|
}
|
|
ElseIf ($samples -and ($type -eq "sample"))
|
|
{
|
|
if ($platform -eq 'x64')
|
|
{
|
|
Get-Childitem "$poco_base\$($componentDir)" -Recurse |`
|
|
Where {$_.Extension -Match $extension -And $_.DirectoryName -Like "*samples*" -And $_.BaseName -Like "*$($suffix)" } `
|
|
| Build-samples "$_"
|
|
}
|
|
else
|
|
{
|
|
Get-Childitem "$poco_base\$($componentDir)" -Recurse |`
|
|
Where {$_.Extension -Match $extension -And $_.DirectoryName -Like "*samples*" -And $_.BaseName -Like "*$($suffix)" -And $_.BaseName -NotLike "*_x64_*" } `
|
|
| Build-samples "$_"
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Write-Host "-------------------------------"
|
|
Write-Host "# Skipping $componentDir"
|
|
Write-Host "-------------------------------"
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
function Build
|
|
{
|
|
Process-Input
|
|
|
|
if ($vs -lt 100) { $extension = 'vcproj' }
|
|
else { $extension = 'vcxproj' }
|
|
|
|
|
|
|
|
Build-Components $extension "lib"
|
|
Build-Components $extension "test"
|
|
Build-Components $extension "sample"
|
|
}
|
|
|
|
|
|
Build
|