Use Qt 5.6 and msvc2015 (#197)
[quassel.git] / scripts / build / appveyorHelp.psm1
diff --git a/scripts/build/appveyorHelp.psm1 b/scripts/build/appveyorHelp.psm1
new file mode 100644 (file)
index 0000000..5c9cbfc
--- /dev/null
@@ -0,0 +1,360 @@
+$ErrorActionPreference="Stop"
+
+$script:INSTALL_DIR="$env:APPVEYOR_BUILD_FOLDER\work\install"
+$CMAKE_INSTALL_ROOT="`"$INSTALL_DIR`"" -replace "\\", "/"
+$env:PATH="$env:PATH;$script:INSTALL_DIR"
+
+if(!$env:CI -eq "true")
+{
+    function Push-AppveyorArtifact()
+    {
+        Write-Host "Push-AppveyorArtifact $ARGS"
+    }
+    function Start-FileDownload([string] $url, [string] $out)
+    {
+        if(!$out)
+        {
+            $out = $url.SubString($url.LastIndexOf("/"))
+        }
+        wget $url -Outfile $out
+    }
+}
+
+function LogExec()
+{
+    $OldErrorActionPreference=$ErrorActionPreference
+    $ErrorActionPreference="Continue"
+    $LastExitCode = 0
+    Write-Host $Args[0], $Args[1..(($Args.Count)-1)]
+    & $Args[0] $Args[1..(($Args.Count)-1)]
+    if(!$LastExitCode -eq 0)
+    {
+        exit $LastExitCode
+    }
+    $ErrorActionPreference=$OldErrorActionPreference
+}
+
+#Set environment variables for Visual Studio Command Prompt
+#http://stackoverflow.com/questions/2124753/how-i-can-use-powershell-with-the-visual-studio-command-prompt
+function BAT-CALL([string] $path, [string] $arg)
+{
+    Write-Host "Calling `"$path`" `"$arg`""
+    cmd /c  "$path" "$arg" `&`& set `|`| exit 1|
+    foreach {
+      if ($_ -match "=") {
+        $v = $_.split("=")
+        #Write-Host "ENV:\$($v[0])=$($v[1])"
+        set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"
+      }
+    }
+    if($LastExitCode -eq 1) {
+        Write-Error "$path not found."
+    }
+}
+
+function Get-QtDir()
+{
+    $ver = 5.5
+    if($env:QT_VER)
+    {
+        $ver = $env:QT_VER
+    }
+    return "C:\Qt\$ver\$env:COMPILER\"
+}
+
+function SETUP-QT()
+{
+    [string] $compiler=$env:COMPILER
+    $qtDir = Get-QtDir
+    $script:QT_BINARY_DIRS = @($qtDir)
+
+    BAT-CALL  "$qtDir\bin\qtenv2.bat"
+    if ($compiler.StartsWith("mingw49"))
+    {
+        #remove sh.exe from path
+        $env:PATH=$env:PATH -replace "C:\\Program Files \(x86\)\\Git\\bin", ""
+        $script:MAKE="mingw32-make"
+        $script:CMAKE_GENERATOR="MinGW Makefiles"
+        $script:STRIP=@("strip", "-s")
+        $script:QT_BINARY_DIRS += (Resolve-Path "$qtDir\..\..\Tools\mingw492_32\opt\")
+    }
+    elseif ($compiler.StartsWith("msvc"))
+    {
+        $arch = "x86"
+        if($compiler.EndsWith("64"))
+        {
+            $arch = "amd64"
+        }
+        $compilerDirs = @{
+                "msvc2010" = "VS100COMNTOOLS";
+                "msvc2012" = "VS110COMNTOOLS";
+                "msvc2013" = "VS120COMNTOOLS";
+                "msvc2015" = "VS140COMNTOOLS"
+            }
+
+        $compilerVar = $compilerDirs[$compiler.Split("_")[0]]
+        $compilerDir = (get-item -path "env:\$($compilerVar)").Value
+        BAT-CALL "$compilerDir\..\..\VC\vcvarsall.bat" $arch
+        $script:MAKE="nmake"
+        $script:CMAKE_GENERATOR="NMake Makefiles"
+        if($arch -eq "x86")
+        {
+            $script:QT_BINARY_DIRS += ("C:\OpenSSL-Win32")
+        }
+        else
+        {
+            $script:QT_BINARY_DIRS += ("C:\OpenSSL-Win64")
+        }
+    }
+}
+
+function Install-ChocolatelyModule([string] $module, [string[]] $myargs)
+{
+    Write-Host "Install chocolately package $module"
+    LogExec cinst $module @myargs -y
+}
+
+function Install-CmakeGitModule([string] $url, [hashtable] $arguments)
+{
+    $module = $url.SubString($url.LastIndexOf("/")+1)
+    $module = $module.Substring(0,$module.Length - 4)
+    if(!$arguments.Contains("branch"))
+    {
+        $arguments["branch"] = "master"
+    }
+    if(!$arguments.Contains("buildType"))
+    {
+        $arguments["buildType"] = "Release"
+    }
+    mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\build\$module
+    pushd $env:APPVEYOR_BUILD_FOLDER\work\git
+    LogExec git clone -q --depth 1 --branch ([string]$arguments["branch"]) $url $module
+    popd
+    pushd  $env:APPVEYOR_BUILD_FOLDER\work\build\$module
+    LogExec cmake -G $script:CMAKE_GENERATOR  ("-DCMAKE_BUILD_TYPE=`"{0}`"" -f [string]$arguments["buildType"]) $env:APPVEYOR_BUILD_FOLDER\work\git\$module -DCMAKE_INSTALL_PREFIX="$CMAKE_INSTALL_ROOT" $arguments["options"]
+    LogExec  $script:MAKE install
+    popd
+}
+
+function Init([string[]] $chocoDeps, [System.Collections.Specialized.OrderedDictionary] $cmakeModules)
+{
+    $script:MAKE=""
+    $script:CMAKE_GENERATOR=""
+    $script:STRIP=$null
+
+    mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\image | Out-Null
+    mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\build | Out-Null
+
+    SETUP-QT
+
+    if($chocoDeps -contains "ninja") {
+        $script:CMAKE_GENERATOR="Ninja"
+        $script:MAKE="ninja"
+    }
+
+    if ( !(Test-Path "$env:APPVEYOR_BUILD_FOLDER\work\install" ) )
+    {
+        mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\install | Out-Null
+        mkdir -Force $env:APPVEYOR_BUILD_FOLDER\work\git | Out-Null
+
+        foreach($module in $chocoDeps) {
+            if($module -eq "nsis")
+            {
+                Install-ChocolatelyModule "nsis.portable" @("-pre")
+                continue
+            }
+            Install-ChocolatelyModule $module
+        }
+
+        foreach($key in $cmakeModules.Keys) {
+            Install-CmakeGitModule $key $cmakeModules[$key]
+        }
+
+        [string] $compiler=$env:COMPILER
+        if($compiler.StartsWith("msvc"))
+        {
+            Write-Host "Downloading vcredist.exe"
+            if ($compiler.StartsWith("msvc2015"))
+            {
+                if($compiler.EndsWith("64"))
+                {
+                    Start-FileDownload https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe $env:APPVEYOR_BUILD_FOLDER\work\install\vcredist.exe
+                }
+                else
+                {
+                    Start-FileDownload https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x86.exe $env:APPVEYOR_BUILD_FOLDER\work\install\vcredist.exe
+                }
+            }
+            else
+            {
+                if($compiler.EndsWith("64"))
+                {
+                    Start-FileDownload http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe $env:APPVEYOR_BUILD_FOLDER\work\install\vcredist.exe
+                }
+                else
+                {
+                    Start-FileDownload http://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe $env:APPVEYOR_BUILD_FOLDER\work\install\vcredist.exe
+                }
+            }
+        }
+    }
+}
+
+function relativePath([string] $root, [string] $path)
+{
+    pushd $root
+    $out = Resolve-Path -Relative $path
+    popd
+    return $out
+}
+
+function StripFile([string] $name)
+{
+    if($script:STRIP) {
+        if( $name.EndsWith(".dll") -or $name.EndsWith(".exe"))
+        {
+            Write-Host "strip file $name"
+            LogExec @script:STRIP $name
+        }
+    }
+}
+
+function Get-DeployImageName()
+{
+    $version = Get-Version
+    if($env:APPVEYOR_REPO_TAG -eq "true") {
+        return "$env:APPVEYOR_PROJECT_NAME`_$version`_Qt$env:QT_VER`_$env:COMPILER"
+    }else{
+        return "$env:APPVEYOR_PROJECT_NAME`_$env:APPVEYOR_REPO_BRANCH`_$version`_Qt$env:QT_VER`_$env:COMPILER"
+    }
+}
+
+function Get-Version()
+{
+    if($env:APPVEYOR_REPO_TAG -eq "true") {
+        return $env:APPVEYOR_REPO_TAG_NAME
+    }else{
+        $commit = ([string]$env:APPVEYOR_REPO_COMMIT).SubString(0,6)
+        return $commit
+    }
+}
+
+function CmakeImageInstall()
+{
+    $imageName = Get-DeployImageName
+    $destDir = "$env:APPVEYOR_BUILD_FOLDER\work\cmakeDeployImage\$imageName"
+    $env:DESTDIR = $destDir
+    LogExec $script:MAKE install
+    $env:DESTDIR = $null
+    if(!$LastExitCode -eq 0)
+    {
+        Write-Error "Build Failed"
+    }
+    $env:DESTDIR=$null
+    $prefix=$script:INSTALL_DIR
+    if( $prefix.substring(1,1) -eq ":")
+    {
+        $prefix=$prefix.substring(3)
+    }
+    Write-Host "move $destDir\$prefix to $destDir"
+    mv -Force "$destDir\$prefix\*" "$destDir"
+    $rootLeftOver = $prefix.substring(0, $prefix.indexOf("\"))
+    rm -Recurse "$destDir\$rootLeftOver"
+}
+
+function CreateDeployImage([string[]] $whiteList, [string[]] $blackList)
+{
+    $imageName = Get-DeployImageName
+    $deployPath = "$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName"
+
+    function copyWithWhitelist([string] $root)
+    {
+        $files = ls $root -Recurse
+        foreach($fileName in $files.FullName)
+        {
+            $relPath = (relativePath $root $fileName).SubString(2)
+            if($whiteList | Where {$relPath -match $_})
+            {
+                if($blackList | Where {$relPath -match $_})
+                {
+                    continue
+                }
+                if(!(Test-Path $deployPath\$relPath))
+                {
+                    Write-Host "copy $fileName to $deployPath\$relPath"
+                    mkdir -Force (Split-Path -Parent $deployPath\$relPath) | Out-Null
+                    cp -Force $fileName $deployPath\$relPath
+                    StripFile $deployPath\$relPath
+                }
+            }
+        }
+    }
+    Write-Host "CreateDeployImage $imageName"
+    mkdir $deployPath | Out-Null
+
+    copyWithWhitelist "$env:APPVEYOR_BUILD_FOLDER\work\cmakeDeployImage\$imageName"
+    copyWithWhitelist "$env:APPVEYOR_BUILD_FOLDER\work\install\"
+    foreach($folder in $script:QT_BINARY_DIRS)
+    {
+        copyWithWhitelist $folder
+    }
+    Write-Host "Deploy path $deployPath"
+    return $deployPath
+}
+
+function 7ZipDeployImage()
+{
+    $imageName = Get-DeployImageName
+    LogExec 7za a "$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName.7z" "$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName"
+    Push-AppveyorArtifact "$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName.7z"
+}
+
+function NsisDeployImage([string] $scriptName)
+{
+    $imageName = Get-DeployImageName
+    $installerName = "$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName.exe"
+    $version = Get-Version
+    if(([string]$env:COMPILER).StartsWith("msvc"))
+    {
+        $redist = "$env:APPVEYOR_BUILD_FOLDER\work\install\vcredist.exe"
+    }else{
+        $redist = "none"
+    }
+    if($env:COMPILER.EndsWith("64"))
+    {
+        $defaultinstdir = "`$PROGRAMFILES64"
+    }else{
+        $defaultinstdir = "`$PROGRAMFILES"
+    }
+    LogExec makensis.exe /DgitDir=$env:APPVEYOR_BUILD_FOLDER /Dsetupname=$installerName /Dcaption=$imageName /Dversion=$version /Dcompiler=$env:COMPILER /Dvcredist=$redist /Ddefaultinstdir=$defaultinstdir /Dsrcdir=$env:APPVEYOR_BUILD_FOLDER\work\deployImage\$imageName $scriptName
+    Push-AppveyorArtifact $installerName
+}
+
+# based on http://thesurlyadmin.com/2013/01/07/remove-empty-directories-recursively/
+function DeleteEmptyFodlers([string] $root)
+{
+    $Folders = @()
+    foreach($Folder in (Get-ChildItem -Path $root -Recurse -Directory))
+       {
+            $Folders += New-Object PSObject -Property @{
+                Object = $Folder
+                Depth = ($Folder.FullName.Split("\")).Count
+            }
+    }
+    $Folders = $Folders | Sort Depth -Descending
+
+    foreach($Folder in $Folders)
+    {
+       If ($Folder.Object.GetFileSystemInfos().Count -eq 0)
+       {
+            Write-Host "Delete empty dir:" $Folder.Object.FullName
+            Remove-Item -Path $Folder.Object.FullName -Force
+       }
+    }
+
+}
+
+Write-Host "CMAKE_INSTALL_ROOT: $CMAKE_INSTALL_ROOT"
+Write-Host "Image-Name: ", (Get-DeployImageName)
+
+Export-ModuleMember -Function @("Init","CmakeImageInstall", "CreateDeployImage", "LogExec", "7ZipDeployImage", "NsisDeployImage", "DeleteEmptyFodlers") -Variable @("CMAKE_INSTALL_ROOT")