summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt39
-rw-r--r--cmake/modules/FindPowerShell.cmake5
-rw-r--r--docbook/wsdg_src/WSDG_chapter_quick_setup.asciidoc8
-rw-r--r--docbook/wsdg_src/WSDG_chapter_tools.asciidoc12
-rw-r--r--tools/win-setup.ps1279
5 files changed, 323 insertions, 20 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fd3fe77cf6..780d1d7ca7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,11 +32,16 @@ cmake_policy(SET CMP0011 OLD)
# Policy since 2.8.1
cmake_policy(SET CMP0015 NEW)
+#Where to find local cmake scripts
+set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
+
# If our target platform is enforced by our generator, set
# WIRESHARK_TARGET_PLATFORM accordingly. Otherwise use
# %WIRESHARK_TARGET_PLATFORM%.
if(WIN32)
+ find_package(PowerShell REQUIRED)
+
if("${CMAKE_GENERATOR}" MATCHES "Win64")
set(WIRESHARK_TARGET_PLATFORM win64)
set(PROCESSOR_ARCHITECTURE amd64)
@@ -49,6 +54,7 @@ if(WIN32)
set(WIRESHARK_TARGET_PLATFORM $ENV{WIRESHARK_TARGET_PLATFORM})
endif()
+ # Sanity check
if(DEFINED ENV{PLATFORM})
string(TOLOWER $ENV{PLATFORM} _vs_platform)
else()
@@ -62,10 +68,30 @@ if(WIN32)
message(FATAL_ERROR "The PLATFORM environment variable (${_vs_platform})"
" doesn't match the generator platform (${WIRESHARK_TARGET_PLATFORM})")
endif()
-endif(WIN32)
-#Where to find local cmake scripts
-set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
+ # Download third-party libraries
+ file (TO_NATIVE_PATH ${CMAKE_SOURCE_DIR}/tools/win-setup.ps1 _win_setup)
+ file (TO_NATIVE_PATH "$ENV{WIRESHARK_BASE_DIR}/wireshark-${WIRESHARK_TARGET_PLATFORM}-libs" _ws_lib_dir)
+ if(MSVC12)
+ set(_vsversion_args "-VSVersion 12")
+ elseif(MSVC11)
+ set(_vsversion_args "-VSVersion 11")
+ elseif(MSVC10)
+ set(_vsversion_args "-VSVersion 10")
+ endif()
+ # Is it possible to have a one-time, non-cached option in CMake? If
+ # so, we could add a "-DFORCE_WIN_SETUP" which passes -Force to
+ # win-setup.ps1.
+ execute_process(
+ COMMAND ${POWERSHELL_COMMAND} "${_win_setup}" -Destination "${_ws_lib_dir}" -Platform ${WIRESHARK_TARGET_PLATFORM} ${_vsversion_args}
+ RESULT_VARIABLE _win_setup_failed
+ )
+ if (${_win_setup_failed})
+ message(FATAL_ERROR "Windows setup (win-setup.ps1) failed.")
+ endif()
+
+ # XXX Add a dependency on ${_ws_lib_dir}/current_tag.txt?
+endif(WIN32)
include(UseCustomIncludes)
ADD_CUSTOM_CMAKE_INCLUDE()
@@ -542,10 +568,7 @@ set(PythonInterp_FIND_VERSION 2)
set(Python_ADDITIONAL_VERSIONS 3)
set(YACC_REQUIRED TRUE)
-if (WIN32)
- set(PACKAGELIST ${PACKAGELIST} PowerShell)
- set(PowerShell_REQUIRED TRUE)
-else()
+if (NOT WIN32)
set(M_REQUIRED TRUE)
endif()
@@ -711,8 +734,6 @@ foreach(PACKAGE ${PACKAGELIST})
set(PACKAGE_VAR "HTML_VIEWER")
elseif(${PACKAGE} STREQUAL "Perl")
set(PACKAGE_VAR "PERL")
- elseif(${PACKAGE} STREQUAL "PowerShell")
- set(PACKAGE_VAR "POWERSHELL")
else()
set(PACKAGE_VAR ${PACKAGE})
endif()
diff --git a/cmake/modules/FindPowerShell.cmake b/cmake/modules/FindPowerShell.cmake
index a84039da3d..9e751545d7 100644
--- a/cmake/modules/FindPowerShell.cmake
+++ b/cmake/modules/FindPowerShell.cmake
@@ -18,7 +18,10 @@ find_package_handle_standard_args(POWERSHELL DEFAULT_MSG POWERSHELL_EXECUTABLE)
set(_powershell_command "POWERSHELL_COMMAND-NOTFOUND")
if(POWERSHELL_FOUND)
- set(_powershell_command "${POWERSHELL_EXECUTABLE}" -NoProfile -NonInteractive -executionpolicy bypass -File)
+ # Calling a script using "-File" doesn't properly return exit codes.
+ # Use dot sourcing instead
+ # https://connect.microsoft.com/PowerShell/feedback/details/777375/powershell-exe-does-not-set-an-exit-code-when-file-is-used
+ set(_powershell_command "${POWERSHELL_EXECUTABLE}" -NoProfile -NonInteractive -executionpolicy bypass .)
endif()
set(POWERSHELL_COMMAND ${_powershell_command}
CACHE STRING "Command suitable for running PowerShell scripts."
diff --git a/docbook/wsdg_src/WSDG_chapter_quick_setup.asciidoc b/docbook/wsdg_src/WSDG_chapter_quick_setup.asciidoc
index 14333b43f0..456a607ecc 100644
--- a/docbook/wsdg_src/WSDG_chapter_quick_setup.asciidoc
+++ b/docbook/wsdg_src/WSDG_chapter_quick_setup.asciidoc
@@ -197,8 +197,7 @@ Navigate to the required Category/Package row and, if the package
has a "Skip" item in the "New" column, click on the "Skip" item
so it shows a version number for:
-// Only used by win-setup.sh
-* Archive/unzip
+* Archive/unzip (not needed if using CMake)
* Devel/bison (or install Win flex-bison - see Chocolatey below)
@@ -210,8 +209,7 @@ so it shows a version number for:
* Utils/patch (only if needed) (may be Devel/patch instead)
-// Only used by win-setup.sh
-* Web/wget
+* Web/wget (not needed if using CMake)
* asciidoc
@@ -237,7 +235,7 @@ Alternatively you can install Cygwin and its packages using Chocolatey:
----
PS$>choco install cygwin
PS$>choco install cyg-get
-PS$>choco install unzip wget asciidoc [...] -source cygwin
+PS$>choco install sed asciidoc [...] -source cygwin
----
Chocolatey installs Cygwin in 'C:\tools\cygwin' by default.
diff --git a/docbook/wsdg_src/WSDG_chapter_tools.asciidoc b/docbook/wsdg_src/WSDG_chapter_tools.asciidoc
index f3baa93580..1af6f42ff0 100644
--- a/docbook/wsdg_src/WSDG_chapter_tools.asciidoc
+++ b/docbook/wsdg_src/WSDG_chapter_tools.asciidoc
@@ -176,7 +176,7 @@ Chocolatey installs Cygwin in 'C:\tools\cygwin' by default.
One or more Cygwin packages can be installed using "-source cygwin":
----
-PS$>choco install unzip wget asciidoc -source cygwin
+PS$>choco install sed asciidoc -source cygwin
----
[[ChToolsGNUChain]]
@@ -1149,7 +1149,8 @@ installation should be straightforward.
=== Windows: GNU wget (optional)
-GNU wget is used to download files from the internet using the command line.
+GNU wget is used by the Nmake toolchain to download files from the internet
+using the command line. It is not needed when building with CMake.
GNU wget is available for most of the UNIX-like platforms and as the wget
package from the <<ChToolsCygwin,Cygwin setup>> and also using Chocolatey.
@@ -1161,7 +1162,7 @@ PS$> choco install wget -source cygwin
----
You will only need wget if you want to use the Windows automated library
-download, see <<ChLibsSetup>>for details.
+download. See <<ChLibsSetup>>for details.
If GNU wget isn't already installed or available as a package for your platform
(well, for Windows it is available as a Cygwin package), you can get it at
@@ -1186,12 +1187,13 @@ If you are unsure about the settings, you might ask your system administrator.
=== Windows: GNU unzip (optional)
GNU unzip is used to, well, unzip the zip files downloaded using the wget tool.
+As with wget it is not needed when building with CMake.
GNU unzip is available for most of the UNIX-like platforms and as the unzip
package from the <<ChToolsCygwin,Cygwin setup>>.
-You will only need unzip, if you want to use the Windows automated library
-download, see <<ChLibsSetup>>for details.
+You will only need unzip if you want to use the Windows automated library
+download. See <<ChLibsSetup>>for details.
If GNU unzip isn't already installed or available as a package for your platform
(well, for Windows it is available as a Cygwin package), you can get it at
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