winbuild/BuildAll.ps1 (213 lines of code) (raw):
<#
.SYNOPSIS
Build all dlls of psqlodbc project using MSbuild.
.DESCRIPTION
Build awspsqlodbcw.dll, awspsqlodbca.dll, pgenlist.dll, pgenlista.dll
and pgxalib.dll for both x86 and x64 platforms.
.PARAMETER Target
Specify the target of MSBuild. "Build"(default), "Rebuild" or
"Clean" is available.
.PARAMETER VCVersion
Visual Studio version is determined automatically unless this
option is specified.
.PARAMETER Platform
Specify build platforms, "both"(default), "Win32" or "x64" is
available.
.PARAMETER AlongWithInstallers
Specify when you'd like to build installers after building drivers.
.PARAMETER Toolset
MSBuild PlatformToolset is determined automatically unless this
option is specified. Currently "v90", "v100", "Windows7.1SDK",
"v110", "v110_xp", "v120", "v120_xp", "v140" , "v140_xp", "v141",
"v141_xp" or "v142" is available.
.PARAMETER MSToolsVersion
This option is deprecated. MSBuild ToolsVersion is detemrined
automatically unless this option is specified. Currently "4.0",
"12.0", "14.0" OR "17.0" is available.
.PARAMETER Configuration
Specify "Release"(default) or "Debug".
.PARAMETER BuildConfigPath
Specify the configuration xml file name if you want to use
the configuration file other than standard one.
The relative path is relative to the current directory.
.PARAMETER UseMimalloc
Specify whether to use the mimalloc allocator for improved performance.
Requires a toolset of v141, v142 or later.
.EXAMPLE
> .\BuildAll
Build with default or automatically selected parameters.
.EXAMPLE
> .\BuildAll Clean
Clean all generated files.
.EXAMPLE
> .\BuildAll -V(CVersion) 11.0
Build using Visual Studio 11.0 environment.
.EXAMPLE
> .\BuildAll -P(latform) x64
Build only 64bit dlls.
.EXAMPLE
> .\BuildAll -A(longWithInstallers)
Build installers as well after building drivers.
.NOTES
Author: Hiroshi Inoue
Date: Febrary 1, 2014
#>
#
# build 32bit & 64bit dlls for VC10 or later
#
Param(
[ValidateSet("Build", "Rebuild", "Clean", "info")]
[string]$Target="Build",
[string]$VCVersion,
[ValidateSet("Win32", "x64", "both")]
[string]$Platform="both",
[string]$Toolset,
[ValidateSet("", "4.0", "12.0", "14.0", "17.0")]
[string]$MSToolsVersion,
[ValidateSet("Debug", "Release")]
[String]$Configuration="Release",
[string]$BuildConfigPath,
[switch]$AlongWithInstallers,
[switch]$UseMimalloc
)
function buildPlatform([xml]$configInfo, [string]$Platform)
{
if ($Platform -ieq "x64") {
$platinfo=$configInfo.Configuration.x64
} else {
$platinfo=$configInfo.Configuration.x86
}
$BUILD_MACROS=$platinfo.build_macros
$PG_INC=getPGDir $configInfo $Platform "include"
$PG_LIB=getPGDir $configInfo $Platform "lib"
$PG_BIN=getPGDir $configInfo $Platform "bin"
Write-Host "USE LIBPQ : ($PG_INC $PG_LIB $PG_BIN)"
if (-not (Test-Path $PG_INC)) {
throw("`n!!!! include directory $PG_INC does not exist`nplease specify the correct folder name using editConfiguration")
}
if (-not (Test-Path $PG_LIB)) {
throw("`n!!!! lib directory $PG_LIB does not exist`nplease specify the correct folder name using editConfiguration")
}
if (-not (Test-Path $PG_BIN)) {
throw("`n!!!! bin directory $PG_BIN does not exist`nplease specify the correct folder name using editConfiguration")
}
$useSplit=$true
if ($useSplit) {
$macroList = -split $BUILD_MACROS
} else {
$BUILD_MACROS = $BUILD_MACROS -replace ';', '`;'
$BUILD_MACROS = $BUILD_MACROS -replace '"', '`"'
$macroList = iex "write-output $BUILD_MACROS"
}
if ($UseMimalloc) {
$mimallocProperty = "yes"
switch ($VCVersion) {
"10.0" { $mimallocIdeDir = "vs2017" }
"11.0" { $mimallocIdeDir = "vs2017" }
"12.0" { $mimallocIdeDir = "vs2017" }
"14.0" { $mimallocIdeDir = "vs2017" }
"15.0" { $mimallocIdeDir = "vs2017" }
"16.0" { $mimallocIdeDir = "vs2019" }
"17.0" { $mimallocIdeDir = "vs2022" }
default { throw "Unable to resolve mimalloc IDE directory for VC ${VCVersion}."}
}
# build mimalloc dependency
& ${msbuildexe} ..\libs\mimalloc\ide\$mimallocIdeDir\mimalloc.vcxproj /tv:$MSToolsV "/p:Platform=$Platform;Configuration=$Configuration;PlatformToolset=${Toolset}" /t:$target /p:VisualStudioVersion=${VCVersion}
}
# build psqlodbc
& ${msbuildexe} ./platformbuild.vcxproj /tv:$MSToolsV "/p:Platform=$Platform;Configuration=$Configuration;PlatformToolset=${Toolset}" /t:$target /p:VisualStudioVersion=${VCVersion} /p:DRIVERVERSION=$DRIVERVERSION /p:PG_INC=$PG_INC /p:PG_LIB=$PG_LIB /p:PG_BIN=$PG_BIN /p:MIMALLOC=$mimallocProperty $macroList
}
$scriptPath = (Split-Path $MyInvocation.MyCommand.Path)
Import-Module ${scriptPath}\Psqlodbc-config.psm1
$configInfo = LoadConfiguration $BuildConfigPath $scriptPath
$DRIVERVERSION=$configInfo.Configuration.version
pushd $scriptPath
$path_save = ${env:PATH}
Import-Module ${scriptPath}\MSProgram-Get.psm1
try {
$rtnArray=Find-MSBuild ([ref]$VCVersion) ($MSToolsVersion) ([ref]$Toolset) $configInfo
$msbuildexe=$rtnArray[0]
$MSToolsV=$rtnArray[1]
} catch [Exception] {
if ("$_.Exception.Message" -ne "") {
Write-Host $_.Exception.Message -ForegroundColor Red
} else {
echo $_.Exception | Format-List -Force
}
popd
Remove-Module Psqlodbc-config
return
} finally {
Remove-Module MSProgram-Get
}
$recordResult = $true
if ($Target -ne "info") {
$configInfo.Configuration.BuildResult.Date=""
$configInfo.Configuration.BuildResult.VisualStudioVersion=""
$configInfo.Configuration.BuildResult.PlatformToolset=""
$configInfo.Configuration.BuildResult.ToolsVersion=""
$configInfo.Configuration.BuildResult.Platform=""
}
try {
#
# build 32bit dlls
#
if ($Platform -ieq "Win32" -or $Platform -ieq "both") {
buildPlatform $configInfo "Win32"
if ($LastExitCode -ne 0) {
$recordResult = $false
}
}
#
# build 64bit dlls
#
if ($recordResult -and ($Platform -ieq "x64" -or $Platform -ieq "both")) {
buildPlatform $configInfo "x64"
if ($LastExitCode -ne 0) {
$recordResult = $false
}
}
#
# Write the result to configuration xml
#
$resultText="successful"
if ($recordResult) {
if ($Target -ne "Clean") {
$configInfo.Configuration.BuildResult.Date=[string](Get-Date)
$configInfo.Configuration.BuildResult.VisualStudioVersion=$VCVersion
$configInfo.Configuration.BuildResult.PlatformToolset=$Toolset
$configInfo.Configuration.BuildResult.ToolsVersion=$MSToolsV
$configInfo.Configuration.BuildResult.Platform=$Platform
}
} else {
$resultText="failed"
}
SaveConfiguration $configInfo
Write-Host "VisualStudioVersion=$VCVersion(ToolsVersion=$MSToolsV) PlatformToolset=$Toolset Platform=$Platform $resultText`n"
#
# build installers as well
#
if ($AlongWithInstallers) {
if (-not $recordResult) {
throw("compilation failed")
}
$cpu = $Platform
if ($Platform -eq "win32") {
$cpu = "x86"
}
..\installer\buildInstallers.ps1 -cpu $cpu -BuildConfigPath $BuildConfigPath
if ($LASTEXITCODE -ne 0) {
throw "Failed to build installers"
}
}
} catch [Exception] {
if ("$_.Exception.Message" -ne "") {
Write-Host $_.Exception.Message -ForegroundColor Red
} else {
echo $_.Exception | Format-List -Force
}
} finally {
$env:PATH = $path_save
popd
Remove-Module Psqlodbc-config
}