summaryrefslogtreecommitdiff
path: root/tools/win-setup.ps1
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2015-04-07 14:05:52 -0700
committerGerald Combs <gerald@wireshark.org>2015-04-14 19:09:30 +0000
commit1404605513cedd34070154aa355663b8e4734bc4 (patch)
treea01b87e146eb6a948c7177f197b43fba5add1e2c /tools/win-setup.ps1
parent311758aff7b21d877addac447d9216a22bc1af5e (diff)
downloadwireshark-1404605513cedd34070154aa355663b8e4734bc4.tar.gz
Start moving win-setup to PowerShell.
Add win-setup.ps1, which duplicates the following tasks performed by config.nmake + Makefile.nmake + win-setup.sh: - Create the windows library directory. - Download files. - Download and unpack zip files. - Check and set current-tag.txt Don't verify applications or libraries. CMakeLists.txt does that. Update the Developer's Guide. Have POWERSHELL_COMMAND use dot sourcing instead of "-File", which appears to be a synonym for "-IgnoreTheExitStatusReturnedByThisScript". This removes our dependencies on unzip and wget and reduces our dependency on bash. Change-Id: Ia9def24acbe183d81b9d477fa42e655e4a3a6614 Reviewed-on: https://code.wireshark.org/review/7990 Reviewed-by: Graham Bloice <graham.bloice@trihedral.com> Petri-Dish: Graham Bloice <graham.bloice@trihedral.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Gerald Combs <gerald@wireshark.org>
Diffstat (limited to 'tools/win-setup.ps1')
-rw-r--r--tools/win-setup.ps1279
1 files changed, 279 insertions, 0 deletions
diff --git a/tools/win-setup.ps1 b/tools/win-setup.ps1
new file mode 100644
index 0000000000..62485e63c8
--- /dev/null
+++ b/tools/win-setup.ps1
@@ -0,0 +1,279 @@
+#
+# win-setup - Prepare a Windows development environment for building Wireshark.
+#
+# Copyright 2015 Gerald Combs <gerald@wireshark.org>
+#
+# Wireshark - Network traffic analyzer
+# By Gerald Combs <gerald@wireshark.org>
+# Copyright 1998 Gerald Combs
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+#requires -version 2
+
+# Makefile.nmake + win-setup.sh does:
+# - verify_tools: Checks required executables. CMake does this.
+# - clean_setup: Removes current and past lib dirs.
+# - process_libs: calls libverify or download for each lib.
+
+# To do:
+# - Make this the source of truth. Keep the list of libs here.
+# - Download everything unconditionally, at least initially.
+# - Download the Lua package for our compiler? It might make more
+# sense to switch to Nuget instead.
+
+# Bugs:
+# - Unzipping from the shell seems to be slower than Cygwin's unzip or 7zip.
+
+<#
+.SYNOPSIS
+Prepare a Windows development environment for building Wireshark.
+
+.DESCRIPTION
+This script downloads and extracts third-party libraries required to compile
+Wireshark.
+
+.PARAMETER Destination
+Specifies the destination directory for the text files. The path must
+contain the pattern "wireshark-*-libs".
+
+.PARAMETER Platform
+Target platform. One of "win64" or "win32".
+
+.PARAMETER VSVersion
+Visual Studio version. Must be the numeric version (e.g. "12", "11"),
+not the year.
+
+.PARAMETER Force
+Download each library even if exists on the local system.
+
+.INPUTS
+-Destination Destination directory.
+-Platform Target platform.
+-VSVersion Visual Studio version.
+-Force Force fresh downloads.
+
+.OUTPUTS
+A set of libraries required to compile Wireshark on Windows, along with
+their compressed archives.
+A date stamp (current-tag.txt)
+
+.EXAMPLE
+C:\PS> .\tools\win-setup.ps1 -Destination C:\wireshark-master-64-libs -Platform win64
+#>
+
+Param(
+ [Parameter(Mandatory=$true, Position=0)]
+ [ValidateScript({$_ -like "*\wireshark-*-libs"})]
+ [String]
+ $Destination,
+
+ [Parameter(Mandatory=$true, Position=1)]
+ [ValidateSet("win32", "win64")]
+ [String]
+ $Platform,
+
+ [Parameter(Mandatory=$false, Position=2)]
+ [ValidateSet("12", "11", "10")]
+ [String]
+ $VSVersion,
+
+ [Parameter(Mandatory=$false)]
+ [Switch]
+ $Force
+)
+
+# Variables
+
+# We create and delete files and directories. Bail out at the first sign of
+# trouble instead of trying to catch exceptions everywhere.
+$ErrorActionPreference = "Stop"
+
+$Win64CurrentTag = "2015-04-06"
+$Win32CurrentTag = "2015-04-06"
+
+# Archive file / subdir.
+$Win64Archives = @{
+ "AirPcap_Devpack_4_1_0_1622.zip" = "AirPcap_Devpack_4_1_0_1622";
+ "c-ares-1.9.1-1-win64ws.zip" = "";
+ "GeoIP-1.5.1-2-win64ws.zip" = "GeoIP-1.5.1-2-win64ws";
+ "gnutls-3.2.15-2.9-win64ws.zip" = "";
+ "gtk+-bundle_2.24.23-3.39_win64ws.zip" = "gtk2";
+ "kfw-3-2-2-x64-ws.zip" = "";
+ "libsmi-svn-40773-win64ws.zip" = "";
+ "nasm-2.09.08-win32.zip" = "";
+ "portaudio_v19_2.zip" = "";
+ "upx303w.zip" = "";
+ "user-guide-g7ea0d6c.zip" = "user-guide";
+ "WinSparkle-0.3-44-g2c8d9d3-win64ws.zip" = "";
+ "WpdPack_4_1_2.zip" = "";
+ "zlib128.zip" = "";
+}
+
+$Win32Archives = @{
+ "AirPcap_Devpack_4_1_0_1622.zip" = "AirPcap_Devpack_4_1_0_1622";
+ "c-ares-1.9.1-1-win32ws.zip" = "";
+ "GeoIP-1.5.1-2-win32ws.zip" = "GeoIP-1.5.1-2-win32ws";
+ "gnutls-3.2.15-2.7-win32ws.zip" = "";
+ "gtk+-bundle_2.24.23-1.1_win32ws.zip" = "gtk2";
+ "kfw-3-2-2-i386-ws-vc6.zip" = "";
+ "libsmi-svn-40773-win32ws.zip" = "";
+ "nasm-2.09.08-win32.zip" = "";
+ "portaudio_v19_2.zip" = "";
+ "upx303w.zip" = "";
+ "user-guide-g7ea0d6c.zip" = "user-guide";
+ "WinSparkle-0.3-44-g2c8d9d3-win32ws.zip" = "";
+ "WpdPack_4_1_2.zip" = "";
+ "zlib128.zip" = "";
+}
+
+# Lua
+
+if ( @("12", "11", "10") -contains $VSVersion ) {
+ $Win64Archives["lua-5.2.3_Win64_dll$($VSVersion)_lib.zip"] = "lua5.2.3"
+ $Win32Archives["lua-5.2.3_Win32_dll$($VSVersion)_lib.zip"] = "lua5.2.3"
+}
+
+
+# Plain file downloads
+
+$Win32Files = @(
+ "WinPcap_4_1_3.exe";
+)
+
+$Win64Files = @(
+ "WinPcap_4_1_3.exe";
+)
+
+$Archives = $Win64Archives;
+$Files = $Win64Files;
+$CurrentTag = $Win64CurrentTag;
+
+if ($Platform -eq "win32") {
+ $Archives = $Win32Archives;
+ $Files = $Win32Files;
+ $CurrentTag = $Win32CurrentTag;
+}
+
+$CleanupItems = @(
+ "c-ares-1.9.1-1-win??ws"
+ "gnutls-3.1.22-*-win??ws"
+ "gnutls-3.2.15-*-win??ws"
+ "gtk2"
+ "gtk3"
+ "kfw-3-2-2-final"
+ "kfw-3-2-2-i386-ws-vc6"
+ "kfw-3-2-2-x64-ws"
+ "lua5.1.4"
+ "lua5.2.?"
+ "libsmi-0.4.8"
+ "libsmi-svn-40773-win??ws"
+ "nasm-2.09.08"
+ "portaudio_v19"
+ "portaudio_v19_2"
+ "upx301w"
+ "upx303w"
+ "user-guide"
+ "zlib-1.2.5"
+ "zlib-1.2.8"
+ "AirPcap_Devpack_4_1_0_1622"
+ "GeoIP-1.5.1-*-win??ws"
+ "WinSparkle-0.3-44-g2c8d9d3-win??ws"
+ "WpdPack"
+ "current-tag.txt"
+)
+
+[Uri] $DownloadPrefix = "https://anonsvn.wireshark.org/wireshark-$($Platform)-libs/tags/$($CurrentTag)/packages"
+
+# Functions
+
+function DownloadFile($fileName) {
+ [Uri] $fileUrl = "$DownloadPrefix/$fileName"
+ $destinationFile = "$fileName"
+ if ((Test-Path $destinationFile -PathType 'Leaf') -and -not ($Force)) {
+ Write-Output "$destinationFile already there; not retrieving."
+ return
+ }
+ Write-Output "Downloading $fileUrl into $Destination"
+ $webClient = New-Object System.Net.WebClient
+ $webClient.DownloadFile($fileUrl, "$Destination\$destinationFile")
+}
+
+# https://msdn.microsoft.com/en-us/library/windows/desktop/bb787866.aspx
+$CopyHereFlags = 4 + 16 + 512 + 1024
+
+function DownloadArchive($fileName, $subDir) {
+ DownloadFile $fileName
+ $shell = New-Object -com shell.application
+ $archiveFile = "$Destination\$fileName"
+ $archiveDir = "$Destination\$subDir"
+ if ($subDir -and -not (Test-Path $archiveDir -PathType 'Container')) {
+ New-Item -ItemType Directory -Path $archiveDir > $null
+ }
+ $activity = "Extracting $archiveFile into $($archiveDir)"
+ foreach ($item in $shell.NameSpace($archiveFile).items()) {
+ Write-Progress -Activity "$activity" -Status "Working on $($item.Name)"
+ # XXX Folder.CopyHere is really slow.
+ $shell.NameSpace($archiveDir).CopyHere($item, $CopyHereFlags)
+ }
+ Write-Progress -Activity "$activity" -Status "Done" -Completed
+}
+
+# On with the show
+
+# Make sure $Destination exists and do our work there.
+if ( -not (Test-Path $Destination -PathType 'Container') ) {
+ New-Item -ItemType 'Container' "$Destination" > $null
+}
+
+# CMake's file TO_NATIVE_PATH passive-aggressively omits the drive letter.
+Set-Location "$Destination"
+$Destination = $(Get-Item -Path ".\")
+Write-Output "Working in $Destination"
+
+# Check our last known state
+$destinationTag = "INVALID"
+$tagFile = "current_tag.txt"
+if ((Test-Path $tagFile -PathType 'Leaf') -and -not ($Force)) {
+ $destinationTag = Get-Content $tagFile
+}
+
+if ($destinationTag -ne $CurrentTag) {
+ Write-Output "Tag $CurrentTag not found. Refreshing."
+ $activity = "Removing directories"
+ foreach ($oldItem in $CleanupItems) {
+ if (Test-Path $oldItem) {
+ Write-Progress -Activity "$activity" -Status "Removing $oldItem"
+ Remove-Item -force -recurse $oldItem
+ }
+ }
+ Write-Progress -Activity "$activity" -Status "Done" -Completed
+} else {
+ Write-Output "Tag $CurrentTag found. Skipping."
+ exit 0
+}
+
+# Download files
+foreach ($item in $Files) {
+ DownloadFile $item
+}
+
+# Download and extract archives
+foreach ($item in $Archives.GetEnumerator() | Sort-Object -property key) {
+ DownloadArchive $item.Name $item.Value
+}
+
+# Save our last known state
+Set-Content -Path $tagFile -Value "$CurrentTag" \ No newline at end of file