Compile sshdump and ciscodump for Windows
[metze/wireshark/wip.git] / CMakeLists.txt
1 # CMakeLists.txt
2 #
3 # Wireshark - Network traffic analyzer
4 # By Gerald Combs <gerald@wireshark.org>
5 # Copyright 1998 Gerald Combs
6 #
7 # This program is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU General Public License
9 # as published by the Free Software Foundation; either version 2
10 # of the License, or (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #
21
22 project(Wireshark C CXX)
23
24 message(STATUS "Generating build using CMake ${CMAKE_VERSION}")
25 if(WIN32)
26         # Needed for proper Qt linking. See
27         # http://www.cmake.org/cmake/help/v3.0/policy/CMP0020.html
28         # 3.1.3 is the currently supported version
29         cmake_minimum_required(VERSION 3.1.3)
30 else()
31         cmake_minimum_required(VERSION 2.8.8)
32 endif()
33
34 # Needs to be set after cmake_minimum_required or cmake_policy(VERSION)
35 # Policy since 2.6.1
36 cmake_policy(SET CMP0008 NEW)
37 # Policy since 2.6.3
38 # Backward compatibility for versions < 2.6.3
39 cmake_policy(SET CMP0011 OLD)
40 # Policy since 2.8.1
41 cmake_policy(SET CMP0015 NEW)
42
43 #Where to find local cmake scripts
44 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
45
46 # Set old behaviour for LOCATION property
47 if (POLICY CMP0026)
48         cmake_policy(SET CMP0026 OLD)
49 endif()
50
51 # Set old behaviour for variable quoting
52 if (POLICY CMP0054)
53         cmake_policy(SET CMP0054 OLD)
54 endif()
55
56 # Set old behaviour for MACOSX_RPATH
57 if (POLICY CMP0042)
58         cmake_policy(SET CMP0042 OLD)
59 endif()
60
61 # If our target platform is enforced by our generator, set
62 # WIRESHARK_TARGET_PLATFORM accordingly. Otherwise use
63 # %WIRESHARK_TARGET_PLATFORM%.
64
65 if(WIN32)
66         find_package(PowerShell REQUIRED)
67
68         if(${CMAKE_CL_64} OR "${CMAKE_GENERATOR}" MATCHES "Win64")
69                 set(WIRESHARK_TARGET_PLATFORM win64)
70         elseif("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
71                 set(WIRESHARK_TARGET_PLATFORM win32)
72         else()
73                 set(WIRESHARK_TARGET_PLATFORM $ENV{WIRESHARK_TARGET_PLATFORM})
74         endif()
75
76         if ("${WIRESHARK_TARGET_PLATFORM}" MATCHES "win64")
77                 set(PROCESSOR_ARCHITECTURE amd64)
78         else()
79                 set(PROCESSOR_ARCHITECTURE x86)
80         endif()
81
82         # Sanity check
83         if(DEFINED ENV{PLATFORM})
84                 string(TOLOWER $ENV{PLATFORM} _vs_platform)
85         else()
86                 set(_vs_platform "[undefined]") # x86
87         endif()
88         if(
89                 (_vs_platform STREQUAL "x64" AND NOT WIRESHARK_TARGET_PLATFORM STREQUAL "win64")
90                 OR
91                 (_vs_platform STREQUAL "[undefined]" AND NOT WIRESHARK_TARGET_PLATFORM STREQUAL "win32")
92         )
93                 message(FATAL_ERROR "The PLATFORM environment variable (${_vs_platform})"
94                         " doesn't match the generator platform (${WIRESHARK_TARGET_PLATFORM})")
95         endif()
96         message(STATUS "Building for ${WIRESHARK_TARGET_PLATFORM} using ${CMAKE_GENERATOR}")
97
98         # Determine where the 3rd party libraries will be
99         if( DEFINED ENV{WIRESHARK_LIB_DIR} )
100                 # The buildbots set WIRESHARK_LIB_DIR but not WIRESHARK_BASE_DIR.
101                 file( TO_CMAKE_PATH "$ENV{WIRESHARK_LIB_DIR}" _PROJECT_LIB_DIR )
102         elseif( DEFINED ENV{WIRESHARK_BASE_DIR} )
103                 file( TO_CMAKE_PATH "$ENV{WIRESHARK_BASE_DIR}" _WS_BASE_DIR )
104                 set( _PROJECT_LIB_DIR "${_WS_BASE_DIR}/wireshark-${WIRESHARK_TARGET_PLATFORM}-libs" )
105         else()
106                 # Don't know what to do
107                 message(FATAL_ERROR "Neither WIRESHARK_BASE_DIR or WIRESHARK_LIB_DIR are defined")
108         endif()
109
110         # Download third-party libraries
111         file (TO_NATIVE_PATH ${CMAKE_SOURCE_DIR}/tools/win-setup.ps1 _win_setup)
112         file (TO_NATIVE_PATH ${_PROJECT_LIB_DIR} _ws_lib_dir)
113         if(MSVC14)
114                 set(_vsversion_args "14")
115         elseif(MSVC12)
116                 set(_vsversion_args "12")
117         elseif(MSVC11)
118                 set(_vsversion_args "11")
119         elseif(MSVC10)
120                 set(_vsversion_args "10")
121         else()
122                 message(FATAL_ERROR "Unsupported compiler ${CMAKE_C_COMPILER}")
123         endif()
124
125         # Is it possible to have a one-time, non-cached option in CMake? If
126         # so, we could add a "-DFORCE_WIN_SETUP" which passes -Force to
127         # win-setup.ps1.
128         execute_process(
129                 COMMAND ${POWERSHELL_COMMAND} "\"${_win_setup}\"" -Destination "${_ws_lib_dir}" -Platform ${WIRESHARK_TARGET_PLATFORM} -VSVersion ${_vsversion_args}
130                 RESULT_VARIABLE _win_setup_failed
131         )
132         if (${_win_setup_failed})
133                 message(FATAL_ERROR "Windows setup (win-setup.ps1) failed.")
134         endif()
135
136         # XXX Add a dependency on ${_ws_lib_dir}/current_tag.txt?
137
138         # Head off any attempts to use Cygwin's Python.
139         include(LocatePythonExecutable)
140 endif(WIN32)
141
142 include(UseCustomIncludes)
143 ADD_CUSTOM_CMAKE_INCLUDE()
144
145 # This cannot be implemented via option(...)
146 if( NOT CMAKE_BUILD_TYPE )
147         set( CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
148                 "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
149                 FORCE)
150 endif()
151 message(STATUS "Configuration types: ${CMAKE_CONFIGURATION_TYPES}")
152 string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type)
153 message(STATUS "CMAKE_C_FLAGS_${_build_type}: ${CMAKE_C_FLAGS_${_build_type}}")
154 message(STATUS "CMAKE_CXX_FLAGS_${_build_type}: ${CMAKE_CXX_FLAGS_${_build_type}}")
155
156 # Where to put executables and libraries in the build tree
157 # Note: Executables and libraries might end end up in a configuration
158 # subdirectory, e.g. run/Debug or run/Release. We try to set DATAFILE_DIR
159 # to a corresponding value below.
160 if(NOT ARCHIVE_OUTPUT_PATH)
161         set(ARCHIVE_OUTPUT_PATH ${Wireshark_BINARY_DIR}/run CACHE INTERNAL
162                    "Single output directory for building all archives.")
163 endif()
164 if(NOT EXECUTABLE_OUTPUT_PATH)
165         set(EXECUTABLE_OUTPUT_PATH ${Wireshark_BINARY_DIR}/run CACHE INTERNAL
166                    "Single output directory for building all executables.")
167 endif()
168 if(NOT LIBRARY_OUTPUT_PATH)
169         set(LIBRARY_OUTPUT_PATH ${Wireshark_BINARY_DIR}/run CACHE INTERNAL
170                    "Single output directory for building all libraries.")
171 endif()
172
173 # Under linux the release mode (CMAKE_BUILD_TYPE=release) defines NDEBUG
174 #Defines CMAKE_INSTALL_BINDIR, CMAKE_INSTALL_DATADIR, etc ...
175 include(CMakeInstallDirs)
176
177 # Updated by make-version.pl
178 set(GIT_REVISION 0)
179 set(PROJECT_MAJOR_VERSION 2)
180 set(PROJECT_MINOR_VERSION 1)
181 set(PROJECT_PATCH_VERSION 0)
182 set(PROJECT_BUILD_VERSION ${GIT_REVISION})
183 # Updated by make-version.pl
184 set(PROJECT_VERSION_EXTENSION)
185 if(NOT DEFINED PROJECT_VERSION_EXTENSION)
186         if (DEFINED ENV{WIRESHARK_VERSION_EXTRA})
187                 set(PROJECT_VERSION_EXTENSION "$ENV{WIRESHARK_VERSION_EXTRA}")
188         else()
189                 set(PROJECT_VERSION_EXTENSION "-git")
190         endif()
191 endif()
192
193 set(PROJECT_VERSION "${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}.${PROJECT_PATCH_VERSION}${PROJECT_VERSION_EXTENSION}")
194
195 # Banner shown at top right of Qt welcome screen.
196 if(DEFINED ENV{WIRESHARK_VERSION_FLAVOR})
197         set(VERSION_FLAVOR "$ENV{WIRESHARK_VERSION_FLAVOR}")
198 else()
199         set(VERSION_FLAVOR "Development Build")
200 endif()
201
202 # These are required in .rc files and manifests
203 set(VERSION_MAJOR ${PROJECT_MAJOR_VERSION})
204 set(VERSION_MINOR ${PROJECT_MINOR_VERSION})
205 set(VERSION_MICRO ${PROJECT_PATCH_VERSION})
206 set(VERSION_BUILD ${PROJECT_BUILD_VERSION})
207 set(RC_VERSION ${PROJECT_MAJOR_VERSION},${PROJECT_MINOR_VERSION},${PROJECT_PATCH_VERSION},${PROJECT_BUILD_VERSION})
208
209 message(STATUS "V: ${PROJECT_VERSION}, MaV: ${PROJECT_MAJOR_VERSION}, MiV: ${PROJECT_MINOR_VERSION}, PL: ${PROJECT_PATCH_VERSION}, EV: ${PROJECT_VERSION_EXTENSION}.")
210
211 include(UseLemon)
212 include(UseMakeDissectorReg)
213 include(UseMakeTapReg)
214 include(UseAsn2Wrs)
215
216 include_directories(
217         ${CMAKE_BINARY_DIR}
218         ${CMAKE_SOURCE_DIR}
219         ${CMAKE_SOURCE_DIR}/epan
220         ${CMAKE_SOURCE_DIR}/tools/lemon
221 )
222
223 include( CMakeOptions.txt )
224 if( DUMPCAP_INSTALL_OPTION STREQUAL "suid" )
225         set( DUMPCAP_SETUID "SETUID" )
226 else()
227         set( DUMPCAP_SETUID )
228 endif()
229 if( NOT CMAKE_SYSTEM_NAME STREQUAL "Linux" AND
230         DUMPCAP_INSTALL_OPTION STREQUAL "capabilities" )
231         message( WARNING "Capabilities are only supported on Linux" )
232         set( DUMPCAP_INSTALL_OPTION )
233 endif()
234
235 # Always enable position-independent code when compiling, even for
236 # executables, so you can build position-independent executables.
237 # -pie is added below for non-MSVC.
238 # Needed when either:
239 # - Qt5_POSITION_INDEPENDENT_CODE is set and CMake < 2.8.11
240 # - PIE is wanted (-pie) and you want to add -fPIC/-fPIE automatically.
241 # This option only has an effect on CMake >= 2.8.9
242 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
243
244 if( CMAKE_C_COMPILER_ID MATCHES "MSVC")
245         if (MSVC10)
246                 set(MSC_VER_REQUIRED 1600)
247         elseif(MSVC11)
248                 set(MSC_VER_REQUIRED 1700)
249         elseif(MSVC12)
250                 set(MSC_VER_REQUIRED 1800)
251         elseif(MSVC14)
252                 set(MSC_VER_REQUIRED 1900)
253         else()
254                 message(FATAL_ERROR "You are using an unsupported version of MSVC")
255         endif()
256
257         add_definitions(
258                 /DWIN32_LEAN_AND_MEAN
259                 "/DMSC_VER_REQUIRED=${MSC_VER_REQUIRED}"
260                 /D_CRT_SECURE_NO_DEPRECATE
261                 # NOMINMAX keeps windows.h from defining "min" and "max" via windef.h.
262                 # This avoids conflicts with the C++ standard library.
263                 /DNOMINMAX
264                 # -DPSAPI_VERSION=1                 Programs that must run on earlier versions of Windows as well as Windows 7 and later
265                 #                                   versions should always call this function as GetProcessMemoryInfo. To ensure correct
266                 #                                   resolution of symbols, add Psapi.lib to the TARGETLIBS macro and compile the program
267                 #                                   with -DPSAPI_VERSION=1.To use run-time dynamic linking, load Psapi.dll.
268                 #                                   http://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx
269                 # -DBUILD_WINDOWS                   Starting from VS2013, GetVersionEx is deprecated and we are recommended to use
270                 #                                   VerifyVersionInfo instead
271                 #                                   http://msdn.microsoft.com/en-us/library/windows/desktop/ms724429(v=vs.85).aspx
272                 #                                   http://msdn.microsoft.com/en-us/library/windows/desktop/ms725491(v=vs.85).aspx
273                 #                                   To continue to use GetVersionEx, we can define BUILD_WINDOWS
274                 # -D_ALLOW_KEYWORD_MACROS           For VS2012 onwards the, C++ STL does not permit macro redefinitions of keywords
275                 #                                   (see http://msdn.microsoft.com/en-us/library/bb531344(v=vs.110).aspx)
276                 #                                   This definition prevents the complaint about the redefinition of inline by WinPCap
277                 #                                   in pcap-stdinc.h when compiling C++ files, e.g. the Qt UI
278                 /DPSAPI_VERSION=1
279                 /DBUILD_WINDOWS
280                 /D_ALLOW_KEYWORD_MACROS
281         )
282
283         if(NOT "${WIRESHARK_TARGET_PLATFORM}" STREQUAL "win64")
284                 add_definitions("/D_BIND_TO_CURRENT_CRT_VERSION=1")
285         endif()
286
287         # FIXME: WINPCAP_VERSION cannot be determined from source or executable.
288         set(WINPCAP_VERSION "4_1_3")
289         add_definitions("/DWINPCAP_VERSION=${WINPCAP_VERSION}")
290
291         set(LOCAL_CFLAGS
292                 /MP
293         )
294
295         if(MSVC12)
296                 # /Zo                               Enhanced debugging of optimised code for VS2013 Update 3 and beyond,
297                 #                                   Assume all VS2013 builds are at least Update 3.
298                 #                                   See http://msdn.microsoft.com/en-us/library/dn785163.aspx
299                 set(LOCAL_CFLAGS ${LOCAL_CFLAGS} "/Zo")
300         elseif(MSVC14)
301                 # /Zo                               Enhanced debugging of optimised code
302                 #                                   VS2015(MSVC14): On by default when /Zi or /Z7 used.
303                 set(LOCAL_CFLAGS ${LOCAL_CFLAGS} "/Zo")
304         endif()
305
306         if(ENABLE_CODE_ANALYSIS)
307                 set(LOCAL_CFLAGS ${LOCAL_CFLAGS} "/analyze:WX-")
308         endif()
309
310         # Additional compiler warnings to be treated as "Level 3"
311         #  when compiling Wireshark sources. (Selected from "level 4" warnings).
312         ## 4295: array is too small to include a terminating null character
313         ## 4189: local variable is initialized but not referenced
314         set(WARNINGS_CFLAGS "/w34295 /w34189")
315
316         set(WIRESHARK_COMMON_FLAGS
317                 ${LOCAL_CFLAGS}
318                 ${WARNINGS_CFLAGS}
319         )
320
321         # Set in Makefile.nmake
322         set(WS_LINK_FLAGS "/LARGEADDRESSAWARE /MANIFEST:NO /INCREMENTAL:NO /RELEASE")
323
324 else()
325         if(CMAKE_OSX_DEPLOYMENT_TARGET)
326                 if(APPLE)
327                         if(${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.0")
328                                 message(FATAL_ERROR "We don't support building for OS X 10.0")
329                         elseif(${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.1")
330                                 message(FATAL_ERROR "We don't support building for OS X 10.1")
331                         elseif(${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.2")
332                                 message(FATAL_ERROR "We don't support building for OS X 10.2")
333                         elseif(${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.4" OR ${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.5")
334                                 #
335                                 # Only 32-bit builds are supported.  10.5
336                                 # (and 10.4?) had a bug that causes some BPF
337                                 # functions not to work with 64-bit userland
338                                 # code, so capturing won't work.
339                                 #
340                                 set(CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}")
341                                 set(CMAKE_CXX_FLAGS "-m32 ${CMAKE_CXX_FLAGS}")
342                                 set(WS_LINK_FLAGS "-m32 ${WS_LINK_FLAGS}")
343                         endif()
344                         message(STATUS "Building for OS X ${CMAKE_OSX_DEPLOYMENT_TARGET}")
345                 else()
346                         message(FATAL_ERROR "CMAKE_OSX_DEPLOYMENT_TARGET only applies when building for OS X")
347                 endif()
348         endif()
349
350         set(WIRESHARK_COMMON_FLAGS
351                 # The following are for C and C++
352                 # -O<X> and -g get set by the CMAKE_BUILD_TYPE
353                 -Wall
354                 -Wextra
355                 -Wendif-labels
356                 -Wpointer-arith
357                 -Wformat-security
358                 -fwrapv
359                 -fno-strict-overflow
360                 -Wvla
361                 -Waddress
362                 -Wattributes
363                 -Wdiv-by-zero
364                 -Wignored-qualifiers
365                 -Wpragmas
366                 -Wno-overlength-strings
367                 -Wno-long-long
368                 -Wheader-guard
369                 -Wunused-const-variable
370         )
371
372         set(WIRESHARK_C_ONLY_FLAGS
373                 # The following are C only, not C++
374                 -Wc++-compat
375                 -Wdeclaration-after-statement
376                 -Wshadow
377                 -Wno-pointer-sign
378                 -Wold-style-definition
379                 -Wstrict-prototypes
380                 -Wlogical-op
381                 -Wjump-misses-init
382                 # The Qt headers generate a ton of shortening errors on 64-bit systems
383                 # so only enable this for C for now.
384                 -Wshorten-64-to-32
385         )
386
387         set(WIRESHARK_CXX_ONLY_FLAGS
388         )
389
390         set(WIRESHARK_EXTRA_COMPILER_COMMON_FLAGS
391                 # The following are for C and C++
392                 -Wpedantic
393                 #
394                 # As we use variadic macros, we don't want warnings
395                 # about them, even with -Wpedantic.
396                 #
397                 -Wno-variadic-macros
398                 #
399                 # Various code blocks this one.
400                 #
401                 -Woverflow
402                 -fstrict-overflow -Wstrict-overflow=4
403                 #
404                 # Due to various places where APIs we don't control
405                 # require us to cast away constness, we can probably
406                 # never enable this one with -Werror.
407                 #
408                 -Wcast-qual
409                 #
410                 # Some generated ASN.1 dissectors block this one;
411                 # multiple function declarations for the same
412                 # function are being generated.
413                 #
414                 -Wredundant-decls
415                 #
416                 # Some loops are safe, but it's hard to convince the
417                 # compiler of that.
418                 #
419                 -Wunsafe-loop-optimizations
420                 #
421                 # All the registration functions block these for now.
422                 #
423                 -Wmissing-prototypes
424                 -Wmissing-declarations
425                 #
426                 # A bunch of "that might not work on SPARC" code blocks
427                 # this one for now.
428                 #
429                 -Wcast-align
430                 #
431                 # Works only with Clang
432                 #
433                 -Wunreachable-code
434                 #
435                 # Works only with Clang but generates a lot of warnings
436                 # (about glib library not using Doxygen)
437                 #
438                 -Wdocumentation
439                 #
440                 # No longer supported by El Capitan clang on C++
441                 #
442                 -fno-delete-null-pointer-checks
443         )
444
445         set(WIRESHARK_EXTRA_COMPILER_C_ONLY_FLAGS
446                 # The following are C only, not C++
447                 #
448                 # Due to various places where APIs we don't control
449                 # require us to cast away constness, we can probably
450                 # never enable this one with -Werror.
451                 #
452                 -Wbad-function-cast
453         )
454
455         set(WIRESHARK_EXTRA_COMPILER_CXX_ONLY_FLAGS
456         )
457
458         if(CMAKE_C_COMPILER_ID MATCHES "Clang")
459                 set(WIRESHARK_COMMON_FLAGS ${WIRESHARK_COMMON_FLAGS}
460                         # avoid "argument unused during compilation" warnings
461                         # (for example, when getting the -gsplit-dwarf option or
462                         # when combining -fwrapv with -fno-strict-overflow)
463                         -Qunused-arguments
464                 )
465
466                 set(WIRESHARK_CXX_ONLY_FLAGS ${WIRESHARK_CXX_ONLY_FLAGS}
467                 )
468         else()
469                 set(WIRESHARK_COMMON_FLAGS ${WIRESHARK_COMMON_FLAGS}
470                         -fexcess-precision=fast
471                 )
472
473                 set(WIRESHARK_C_ONLY_FLAGS ${WIRESHARK_C_ONLY_FLAGS}
474                 )
475         endif()
476
477         set(WIRESHARK_ASAN_FLAGS
478                 # With Clang >= 3.5 Leak detection is enable by default
479                 # and no yet all leak is fixed...
480                 # use ASAN_OPTIONS=detect_leaks=0 to disable detect_leaks
481                 -fsanitize=address
482                 -fsanitize=undefined # compile and runtime checks
483                 # -fsanitize=float-divide-by-zero
484                 # -fsanitize=float-cast-overflow
485                 # -fno-sanitize-recover # Abort during runtime
486         )
487
488         if(ENABLE_ASAN)
489                 set(WIRESHARK_COMMON_FLAGS ${WIRESHARK_COMMON_FLAGS} ${WIRESHARK_ASAN_FLAGS})
490         endif()
491
492         if(ENABLE_EXTRA_COMPILER_WARNINGS)   # This overrides -Werror
493                 set(WIRESHARK_COMMON_FLAGS ${WIRESHARK_COMMON_FLAGS} ${WIRESHARK_EXTRA_COMPILER_COMMON_FLAGS})
494                 set(WIRESHARK_C_ONLY_FLAGS ${WIRESHARK_C_ONLY_FLAGS} ${WIRESHARK_EXTRA_COMPILER_C_ONLY_FLAGS})
495                 set(WIRESHARK_CXX_ONLY_FLAGS ${WIRESHARK_CXX_ONLY_FLAGS} ${WIRESHARK_EXTRA_COMPILER_CXX_ONLY_FLAGS})
496         endif()
497
498         add_definitions(
499                 -DG_DISABLE_DEPRECATED
500                 -DG_DISABLE_SINGLE_INCLUDES
501         )
502 endif()
503
504 set( C_FLAG_TESTS ${WIRESHARK_COMMON_FLAGS} ${WIRESHARK_C_ONLY_FLAGS} )
505 set( CXX_FLAG_TESTS ${WIRESHARK_COMMON_FLAGS} ${WIRESHARK_CXX_ONLY_FLAGS} )
506
507 # Counterhack to work around some cache magic in CHECK_C_SOURCE_COMPILES
508 include(CheckCCompilerFlag)
509 include(CheckCXXCompilerFlag)
510
511 if(ENABLE_STATIC)
512         set(BUILD_SHARED_LIBS 0)
513         set(LINK_MODE_LIB STATIC)
514         set(LINK_MODE_MODULE STATIC)
515 else()
516         set(BUILD_SHARED_LIBS 1)
517         set(LINK_MODE_LIB SHARED)
518         set(LINK_MODE_MODULE MODULE)
519 endif()
520
521 # Sigh: Have to use THIS_FLAG instead of ${F} for some reason
522 foreach(THIS_FLAG ${C_FLAG_TESTS})
523         string( REGEX REPLACE "[^a-zA-Z0-9_]+" "_" F ${THIS_FLAG} )
524         set(${F} ${THIS_FLAG})
525         set(V C_${F}_VALID)
526         message(STATUS "Checking for c-compiler flag: ${THIS_FLAG}")
527         check_c_compiler_flag("${ADDED_CMAKE_C_FLAGS} ${${F}}" ${V})
528         if (${${V}})
529                 set(ADDED_CMAKE_C_FLAGS "${ADDED_CMAKE_C_FLAGS} ${${F}}")
530         endif()
531 endforeach()
532 set(CMAKE_C_FLAGS "${ADDED_CMAKE_C_FLAGS} ${CMAKE_C_FLAGS}")
533
534 foreach(THIS_FLAG ${CXX_FLAG_TESTS})
535         string( REGEX REPLACE "[^a-zA-Z0-9_]+" "_" F ${THIS_FLAG} )
536         set(${F} ${THIS_FLAG})
537         set(V CXX_${F}_VALID)
538         message(STATUS "Checking for c++-compiler flag: ${THIS_FLAG}")
539         check_cxx_compiler_flag("${ADDED_CMAKE_CXX_FLAGS} ${${F}}" ${V})
540         if (${${V}})
541                 set(ADDED_CMAKE_CXX_FLAGS "${ADDED_CMAKE_CXX_FLAGS} ${${F}}")
542         endif()
543 endforeach()
544 set(CMAKE_CXX_FLAGS "${ADDED_CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
545
546 if(NOT DISABLE_WERROR AND NOT ENABLE_EXTRA_COMPILER_WARNINGS)
547         if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
548                 set(WERROR_COMMON_FLAGS "/WX")
549                 set(NO_ERROR_DEPRECATED_DECLARATIONS_COMPILE_FLAGS)
550         else()
551                 check_c_compiler_flag(-Werror WERROR)
552                 if (WERROR)
553                         set(WERROR_COMMON_FLAGS "-Werror")
554                         set(NO_ERROR_DEPRECATED_DECLARATIONS_COMPILE_FLAGS "-Wno-error=deprecated-declarations")
555                 endif()
556         endif()
557 else()
558         set(WERROR_COMMON_FLAGS FALSE)
559 endif()
560
561 #
562 # Try to have the compiler default to hiding symbols, so that only
563 # symbols explicitly exported with WS_DLL_PUBLIC will be visible
564 # outside (shared) libraries; that way, more UN*X builds will catch
565 # failures to export symbols, rather than having that fail only on
566 # Windows.
567 #
568 # We don't need that with MSVC, as that's the default.
569 #
570 if( NOT CMAKE_C_COMPILER_ID MATCHES "MSVC")
571         #
572         # Try the GCC-and-compatible -fvisibility-hidden first.
573         #
574         check_c_compiler_flag(-fvisibility=hidden FVHIDDEN)
575         if(FVHIDDEN)
576                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
577         else()
578                 #
579                 # OK, try the Sun^WOracle C -xldscope=hidden
580                 #
581                 check_c_compiler_flag(-xldscope=hidden XLDSCOPEHIDDEN)
582                 if(XLDSCOPEHIDDEN)
583                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -xldscope=hidden")
584                 else()
585                         #
586                         # Anything else?
587                         # If there is anything else, we might want to
588                         # make a list of options to try, and try them
589                         # in a loop.
590                         #
591                         message(WARNING "Hiding shared library symbols is not supported by the compiler."
592                                 " All shared library symbols will be exported.")
593                 endif()
594         endif()
595 endif()
596
597 if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
598         set (C_UNUSED       "__attribute__((unused))" )
599         set (WS_NORETURN    "__attribute__((noreturn))")
600 elseif(MSVC)
601         set (C_UNUSED       "")
602         set (WS_NORETURN    "__declspec(noreturn)")
603 else()
604         set (C_UNUSED       "")
605         set (WS_NORETURN    "")
606 endif()
607
608 set(WIRESHARK_LD_FLAGS
609         -Wl,--as-needed
610         # -flto
611         # -fwhopr
612         # -fwhole-program
613 )
614 # CMAKE_POSITION_INDEPENDENT_CODE is only supported starting with CMake
615 # 2.8.9. Do not add -pie automatically for older versions.
616 #
617 # XXX - are there other compilers that don't support -pie?  It's
618 # not as if the only platforms we support are Windows and Linux....
619 #
620 if(NOT CMAKE_VERSION VERSION_LESS "2.8.9")
621         set(WIRESHARK_LD_FLAGS ${WIRESHARK_LD_FLAGS}
622                 -pie
623         )
624 endif()
625
626 include(CheckCLinkerFlag)
627 set(_C 0)
628 # Sigh: Have to use THIS_FLAG instead of ${F} for some reason
629 foreach(THIS_FLAG ${WIRESHARK_LD_FLAGS})
630         set(F WS_LD_FLAG_${_C})
631         set(${F} ${THIS_FLAG})
632         set(V WS_LD_FLAG_VALID${_C})
633         check_c_linker_flag(${${F}} ${V})
634         if (${${V}})
635                 set(WS_LINK_FLAGS "${WS_LINK_FLAGS} ${${F}}")
636         endif()
637         math(EXPR _C "${_C} + 1")
638 endforeach()
639
640 if(APPLE AND EXISTS /usr/local/opt/gettext)
641         # GLib on OS X requires libintl. Homebrew installs gettext (and
642         # libintl) in /usr/local/opt/gettext
643         include_directories(/usr/local/opt/gettext/include)
644         link_directories(/usr/local/opt/gettext/lib)
645 endif()
646
647 # The packagelist is doing some magic:  If we add XXX to the packagelist, we
648 # - may optionally set XXX_OPTIONS to pass to the find_package command
649 # - will call FindXXX.cmake
650 # - return found libraries in XXX_LIBRARIES
651 # - return found include in XXX_INCLUDE_DIRS
652 # - set HAVE_XXX
653
654 #The minimum package list
655 set(PACKAGELIST Gettext M Git GLIB2 GMODULE2 GTHREAD2 LEX YACC Perl SED SH PythonInterp)
656 set(LEX_REQUIRED TRUE)
657 set(GLIB2_REQUIRED TRUE)
658 set(GLIB2_FIND_REQUIRED TRUE)
659 set(GLIB2_MIN_VERSION 2.14.0)
660 set(GTHREAD2_REQUIRED TRUE)
661 set(PythonInterp_FIND_VERSION 2)
662 set(Python_ADDITIONAL_VERSIONS 3)
663 set(YACC_REQUIRED TRUE)
664
665 if (NOT WIN32)
666         set(M_REQUIRED TRUE)
667 endif()
668
669 set(PACKAGELIST ${PACKAGELIST} LIBSSH)
670 set(LIBSSH_OPTIONS "0.6")
671
672 if(ENABLE_PCAP)
673         set(PACKAGELIST ${PACKAGELIST} PCAP)
674 endif()
675
676 if(ENABLE_AIRPCAP)
677         set(PACKAGELIST ${PACKAGELIST} AIRPCAP)
678 endif()
679
680 # Build the GTK-GUI?
681 if(BUILD_wireshark_gtk)
682         if(ENABLE_GTK3)
683                 set(PACKAGELIST ${PACKAGELIST} GTK3)
684         else()
685                 set(PACKAGELIST ${PACKAGELIST} GTK2)
686                 set(GTK2_OPTIONS COMPONENTS gtk)
687                 set(GTK2_FIND_VERSION 2.12)
688                 set(GTK2_DEBUG false)
689         endif()
690 endif()
691
692 # Build the Qt GUI?
693 if(BUILD_wireshark)
694         if(ENABLE_QT5)
695                 # Untested, may not work if CMAKE_PREFIX_PATH gets overwritten
696                 # somewhere. The if WIN32 in this place is annoying as well.
697                 if( WIN32 )
698                         set( QT5_BASE_PATH "$ENV{QT5_BASE_DIR}" )
699                         set( CMAKE_PREFIX_PATH "${QT5_BASE_PATH}" )
700                 endif()
701                 set(PACKAGELIST ${PACKAGELIST}
702                         Qt5Core
703                         Qt5LinguistTools
704                         Qt5Multimedia
705                         Qt5PrintSupport
706                         Qt5Svg
707                         Qt5Widgets
708                 )
709                 if (APPLE)
710                         set(PACKAGELIST ${PACKAGELIST} Qt5MacExtras)
711                 endif()
712                 if( WIN32 )
713                         set(PACKAGELIST ${PACKAGELIST} Qt5WinExtras)
714                 endif()
715                 set(QT_VERSION 5)
716         else()
717                 set(PACKAGELIST ${PACKAGELIST} Qt4)
718                 set(Qt4_OPTIONS 4.7.1 REQUIRED QtCore QtGui)
719                 set(QT_VERSION 4)
720         endif()
721 endif()
722
723 # SMI SNMP
724 if(ENABLE_SMI)
725         set(PACKAGELIST ${PACKAGELIST} SMI)
726 endif()
727
728 # GNU crypto
729 if(ENABLE_GCRYPT)
730         set(PACKAGELIST ${PACKAGELIST} GCRYPT)
731         # Minimum version needed.
732         set(GCRYPT_OPTIONS "1.4.2")
733 endif()
734
735 # GNU SSL/TLS support
736 if(ENABLE_GNUTLS)
737         set(PACKAGELIST ${PACKAGELIST} GNUTLS)
738         # Minimum version needed.
739         set(GNUTLS_OPTIONS "2.12.0")
740 endif()
741
742 # Kerberos
743 if(ENABLE_KERBEROS)
744         set(PACKAGELIST ${PACKAGELIST} KERBEROS)
745 endif()
746
747 # Portable audio (GTK+ only)
748 if(ENABLE_PORTAUDIO AND BUILD_wireshark_gtk)
749         set(PACKAGELIST ${PACKAGELIST} PORTAUDIO)
750 endif()
751
752
753 # C Asynchronous resolver
754 if(ENABLE_CARES)
755         set(PACKAGELIST ${PACKAGELIST} CARES)
756 endif()
757
758 # Zlib compression
759 if(ENABLE_ZLIB)
760         if (WIN32)
761                 # On Windows we build our own version of zlib, so add the paths
762                 set(ZLIB_SRC_DIR "${_PROJECT_LIB_DIR}/zlib-1.2.8-ws")
763                 set(SKIP_INSTALL_ALL True) # We copy the DLL ourselves.
764                 add_subdirectory("${ZLIB_SRC_DIR}" "${CMAKE_BINARY_DIR}/zlib")
765                 unset(SKIP_INSTALL_ALL)
766                 set(ZLIB_INCLUDE_DIR  "${ZLIB_SRC_DIR}" "${CMAKE_BINARY_DIR}/zlib")
767                 set(ZLIB_LIBRARY zlib)
768                 set(ZLIB_DLL "zlib1.dll")
769                 set_target_properties(zlib PROPERTIES FOLDER "Libs/zlib")
770                 # Annoyingly zlib also builds some other stuff we aren't interested in
771                 set_target_properties(zlibstatic PROPERTIES FOLDER "Libs/zlib")
772         endif()
773         set(PACKAGELIST ${PACKAGELIST} ZLIB)
774 endif()
775
776 # Embedded Lua interpreter
777 if(ENABLE_LUA)
778         set(PACKAGELIST ${PACKAGELIST} LUA)
779 endif()
780
781 # GeoIP address resolving
782 if(ENABLE_GEOIP)
783         set(PACKAGELIST ${PACKAGELIST} GEOIP)
784 endif()
785
786 if(ENABLE_NETLINK)
787         set(PACKAGELIST ${PACKAGELIST} NL)
788 endif()
789
790 if(ENABLE_SBC)
791         set(PACKAGELIST ${PACKAGELIST} SBC)
792 endif()
793
794 # Capabilities
795 if(ENABLE_CAP)
796         set(PACKAGELIST ${PACKAGELIST} CAP SETCAP)
797 endif()
798
799 # Windows version updates
800 if(ENABLE_WINSPARKLE)
801         set(PACKAGELIST ${PACKAGELIST} WINSPARKLE)
802 endif()
803
804 set(PACKAGELIST ${PACKAGELIST} YAPP)
805
806 set(PACKAGELIST ${PACKAGELIST} POD)
807
808 if(ENABLE_HTML_GUIDES)
809         set(PACKAGELIST ${PACKAGELIST} DOXYGEN)
810 endif()
811
812 set(PROGLIST)
813
814 # Sort the package list
815 list(SORT PACKAGELIST)
816 message(STATUS "Packagelist: ${PACKAGELIST}")
817 # Let's loop the package list
818 foreach(PACKAGE ${PACKAGELIST})
819         if(${PACKAGE} STREQUAL "Qt4")
820                 set(PACKAGE_VAR "QT")
821         elseif(${PACKAGE} STREQUAL "PythonInterp")
822                 set(PACKAGE_VAR "PYTHONINTERP")
823         elseif(${PACKAGE} STREQUAL "Gettext")
824                 set(PACKAGE_VAR "GETTEXT")
825         elseif(${PACKAGE} STREQUAL "Perl")
826                 set(PACKAGE_VAR "PERL")
827         else()
828                 set(PACKAGE_VAR ${PACKAGE})
829         endif()
830         if(${PACKAGE}_OPTIONS)
831                 find_package(${PACKAGE} ${${PACKAGE}_OPTIONS})
832         elseif(${PACKAGE}_REQUIRED)
833                 find_package(${PACKAGE} REQUIRED)
834         else()
835                 find_package(${PACKAGE})
836         endif()
837         if (${PACKAGE_VAR}_FOUND)
838                 message(STATUS "${PACKAGE_VAR} FOUND")
839                 set(HAVE_LIB${PACKAGE_VAR} 1)
840                 include_directories(SYSTEM ${${PACKAGE_VAR}_INCLUDE_DIRS})
841                 set(WS_ALL_LIBS ${WS_ALL_LIBS} ${${PACKAGE_VAR}_LIBRARIES})
842                 message(STATUS "${PACKAGE} includes: ${${PACKAGE_VAR}_INCLUDE_DIRS}")
843                 message(STATUS "${PACKAGE} libs: ${${PACKAGE_VAR}_LIBRARIES}")
844                 if (${PACKAGE}_DEFINITIONS)
845                         message(STATUS "${PACKAGE} definitions: ${${PACKAGE_VAR}_DEFINITIONS}")
846                 endif()
847                 if (${PACKAGE_VAR}_EXECUTABLE)
848                         message(STATUS "${PACKAGE} executable: ${${PACKAGE_VAR}_EXECUTABLE}")
849                 endif()
850         else()
851                 #
852                 # Not finding a package is only a fatal error if the
853                 # package is required; if it's required, then its
854                 # XXX_REQUIRED variable is set to TRUE, and the above
855                 # code will pass REQUIRED to find_package, and the
856                 # configure will fail if the package isn't found.
857                 #
858                 # Do *NOT* report this as an error!
859                 #
860                 message(STATUS "${PACKAGE_VAR} NOT FOUND")
861         endif()
862 endforeach()
863
864 # Provide Windows system lib names
865 include( UseWinLibs )
866
867 #packaging
868 include(CPackConfig.txt)
869
870 if(HAVE_LIBAIRPCAP)
871         set(HAVE_AIRPCAP 1)
872 endif()
873 if(HAVE_LIBLUA)
874         set(HAVE_LUA_H 1)
875         set(HAVE_LUA 1)
876 endif()
877 if(HAVE_LIBKERBEROS)
878         set(HAVE_KERBEROS 1)
879 endif()
880 if(HAVE_LIBGEOIP)
881         set(HAVE_GEOIP 1)
882 endif()
883 if(LIBSSH_FOUND)
884         set(HAVE_LIBSSH 1)
885 endif()
886 if(HAVE_LIBCARES)
887         set(HAVE_C_ARES 1)
888 endif()
889 if(NOT HAVE_LIBCARES)
890         message(WARNING "Not using c-ares.")
891         message(WARNING "DNS name resolution for captures will be disabled.")
892 endif()
893 if(HAVE_LIBNL AND HAVE_AIRPCAP)
894         message(ERROR "Airpcap and Libnl support are mutually exclusive")
895 endif()
896 if(HAVE_LIBSBC)
897         set(HAVE_SBC 1)
898 endif()
899 if(EXTCAP_ANDROIDDUMP_LIBPCAP)
900         set(ANDROIDDUMP_USE_LIBPCAP 1)
901 endif()
902
903 if (HAVE_LIBWINSPARKLE)
904         set(HAVE_SOFTWARE_UPDATE 1)
905 endif()
906
907 # No matter which version of GTK is present
908 if(GTK2_FOUND OR GTK3_FOUND)
909         set(GTK_FOUND ON)
910 endif()
911
912 if(HAVE_LIBZLIB)
913         set(HAVE_ZLIB 1)
914         # Always include the "true" zlib includes first. This works around a
915         # bug in the Windows setup of GTK[23] which has a faulty zconf.h.
916         include_directories(BEFORE ${ZLIB_INCLUDE_DIRS})
917 endif()
918 if (Qt5Widgets_FOUND)
919         #
920         # Qt5CoreConfigExtras.cmake in Qt 5.5.0 sets -fPIC unconditionally:
921         #
922         #    https://bugreports.qt.io/browse/QTBUG-47942
923         #
924         # There's a fix in Gerrit for that:
925         #
926         #     https://codereview.qt-project.org/#/c/139645/
927         #
928         # Do the same check as that fix does and, if the check says we
929         # should *not* add -fPIC, remove it.
930         #
931         # XXX - if that check gets changed in the future, we'll have to
932         # detect that and change it.
933         #
934         if (CMAKE_VERSION VERSION_LESS 2.8.12
935             AND (CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\"
936             AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0))
937                 #
938                 # Yes, it should have been; leave it there.
939                 #
940         else()
941                 #
942                 # No, it shouldn't have been; remove it.
943                 #
944                 list(REMOVE_ITEM Qt5Widgets_EXECUTABLE_COMPILE_FLAGS "-fPIC")
945         endif()
946         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
947         set (QT_FOUND ON)
948         set (QT_LIBRARIES ${Qt5Widgets_LIBRARIES} ${Qt5PrintSupport_LIBRARIES})
949         if(Qt5Multimedia_FOUND)
950                 set (QT_LIBRARIES ${QT_LIBRARIES} ${Qt5Multimedia_LIBRARIES})
951                 # That's the name autofoo uses
952                 set(QT_MULTIMEDIA_LIB 1)
953         endif()
954         if(Qt5Svg_FOUND)
955                 set (QT_LIBRARIES ${QT_LIBRARIES} ${Qt5Svg_LIBRARIES})
956                 # That's the name autofoo uses
957                 set(QT_SVG_LIB 1)
958         endif()
959         if(Qt5MacExtras_FOUND)
960                 set (QT_LIBRARIES ${QT_LIBRARIES} ${Qt5MacExtras_LIBRARIES})
961                 # That's the name autofoo uses
962                 set(QT_MACEXTRAS_LIB 1)
963         endif()
964         if(Qt5WinExtras_FOUND)
965                 set (QT_LIBRARIES ${QT_LIBRARIES} ${Qt5WinExtras_LIBRARIES})
966                 # set(QT_WINEXTRAS_LIB 1) # Not needed?
967         endif()
968         if(NOT DEFINED MOC_OPTIONS)
969                 # Squelch moc verbose "nothing to do" output
970                 set(MOC_OPTIONS -nn)
971         endif()
972 # If Qt4: QT_LIBRARIES and QT_INCLUDES are not set above. They require extra magic
973 elseif(QT_FOUND)
974         include(${QT_USE_FILE})
975         include_directories(${QT_INCLUDE_DIR})
976         message(STATUS "Qt includes: ${QT_INCLUDE_DIR}")
977         message(STATUS "Qt libs: ${QT_LIBRARIES}")
978         if(QT_QTMULTIMEDIA_FOUND)
979                 include_directories(${QT_QTMULTIMEDIA_INCLUDE_DIR})
980                 message(STATUS "QtMultimedia includes: ${QT_INCLUDE_DIR}")
981                 set (QT_LIBRARIES ${QT_LIBRARIES} ${QT_QTMULTIMEDIA_LIBRARY})
982                 message(STATUS "QtMultimedia libs: ${QT_QTMULTIMEDIA_LIBRARY}")
983                 # That's the name autofoo uses
984                 set(QT_MULTIMEDIA_LIB 1)
985         endif()
986         if(NOT DEFINED MOC_OPTIONS)
987                 if(QT_VERSION_MAJOR EQUAL 4 AND QT_VERSION_MINOR GREATER 7)
988                         set(MOC_OPTIONS -nn)
989                 endif()
990         endif()
991 endif()
992
993 if(ENABLE_CHECKHF_CONFLICT)
994         set(ENABLE_CHECK_FILTER 1)
995 endif()
996
997 message(STATUS "C-Flags: ${CMAKE_C_FLAGS}")
998 message(STATUS "CXX-Flags: ${CMAKE_CXX_FLAGS}")
999 message(STATUS "Warnings as errors: ${WERROR_COMMON_FLAGS}")
1000
1001 if(APPLE)
1002         #
1003         # We assume that APPLE means OS X so that we have the OS X
1004         # frameworks.
1005         #
1006         set(HAVE_OS_X_FRAMEWORKS 1)
1007         FIND_LIBRARY (APPLE_APPLICATION_SERVICES_LIBRARY ApplicationServices)
1008         FIND_LIBRARY (APPLE_CORE_FOUNDATION_LIBRARY CoreFoundation)
1009         FIND_LIBRARY (APPLE_SYSTEM_CONFIGURATION_LIBRARY SystemConfiguration)
1010 endif()
1011
1012 include(ConfigureChecks.cmake)
1013
1014 #Big or little endian ?
1015 include(TestBigEndian)
1016 test_big_endian(WORDS_BIGENDIAN)
1017
1018 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
1019
1020 add_subdirectory( capchild )
1021 add_subdirectory( caputils )
1022 add_subdirectory( codecs )
1023 add_subdirectory( doc )
1024 add_subdirectory( docbook )
1025 add_subdirectory( epan )
1026 add_subdirectory( randpkt_core )
1027 add_subdirectory( tools/lemon )
1028 add_subdirectory( ui )
1029 add_subdirectory( wiretap )
1030 add_subdirectory( writecap )
1031 add_subdirectory( wsutil )
1032
1033 if(NOT WIN32)
1034         add_custom_target(dumpabi DEPENDS dumpabi-libwireshark dumpabi-libwiretap dumpabi-libwsutil)
1035 endif()
1036
1037 if(ENABLE_ECHLD)
1038         add_subdirectory( echld )
1039 endif()
1040
1041 if(BUILD_wireshark_gtk AND GTK_FOUND)
1042         add_subdirectory( ui/gtk )
1043 endif()
1044
1045 if(BUILD_wireshark AND QT_FOUND)
1046         add_subdirectory( ui/qt )
1047 endif()
1048
1049 # Location of our data files. This should be set to a value that allows
1050 # running from the build directory on Windows, on OS X when building an
1051 # application bundle, and on UNIX if WIRESHARK_RUN_FROM_BUILD_DIRECTORY
1052 # is set.
1053 if(ENABLE_APPLICATION_BUNDLE)
1054         set(_datafile_dir "${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/Resources/share/wireshark")
1055 else()
1056         get_target_property(_libwireshark_location epan LOCATION)
1057         get_filename_component(_datafile_dir "${_libwireshark_location}" PATH)
1058 endif()
1059
1060 set(DATAFILE_DIR ${_datafile_dir} CACHE INTERNAL "Build time data file location.")
1061
1062 if(ENABLE_EXTCAP)
1063         # Target platform locations
1064         # UNIX, Linux, non-bundled OS X: $DESTDIR/lib/wireshark/extcap
1065         # Windows: $DESTDIR/extcap
1066         # OS X app bundle: Wireshark.app/Contents/Resources/share/wireshark/extcap
1067         set(HAVE_EXTCAP 1)
1068         if (WIN32)
1069                 set(EXTCAP_DIR "extcap")
1070         else ()
1071                 set(EXTCAP_DIR "${CMAKE_INSTALL_LIBDIR}/${CPACK_PACKAGE_NAME}/extcap")
1072         endif()
1073 endif()
1074
1075 if(LIBSSH_FOUND)
1076         SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${LIBSSH_LIBRARIES})
1077         CHECK_FUNCTION_EXISTS(ssh_userauth_agent LIBSSH_USERAUTH_AGENT_FOUND)
1078         if(LIBSSH_USERAUTH_AGENT_FOUND)
1079                 set(HAVE_SSH_USERAUTH_AGENT 1)
1080         endif()
1081 endif()
1082
1083 # Location of our plugins. PLUGIN_DIRECTORY should allow running
1084 # from the build directory similar to DATAFILE_DIR above.
1085 if(ENABLE_PLUGINS)
1086         # Target platform locations
1087         # UNIX, Linux, non-bundled OS X: $DESTDIR/lib/wireshark/plugins/$VERSION
1088         # Windows: $DESTDIR/wireshark/plubins/$VERSION
1089         # OS X app bundle: Wireshark.app/Contents/PlugIns/wireshark
1090         set(HAVE_PLUGINS 1)
1091         add_custom_target(plugins)
1092         set_target_properties(plugins PROPERTIES FOLDER "Plugins")
1093         if (WIN32)
1094                 set(PLUGIN_INSTALL_DIR "plugins/${CPACK_PACKAGE_VERSION}")
1095         else ()
1096                 set(PLUGIN_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/${CPACK_PACKAGE_NAME}/plugins/${CPACK_PACKAGE_VERSION}")
1097         endif()
1098         set(PLUGIN_SRC_DIRS
1099                 plugins/docsis
1100                 plugins/ethercat
1101                 plugins/gryphon
1102                 plugins/irda
1103                 plugins/m2m
1104                 plugins/mate
1105                 plugins/opcua
1106                 plugins/profinet
1107                 plugins/stats_tree
1108                 plugins/unistim
1109                 plugins/wimax
1110                 plugins/wimaxasncp
1111                 plugins/wimaxmacphy
1112                 ${CUSTOM_PLUGIN_SRC_DIR}
1113         )
1114 # It seems this stuff doesn't build with autofoo either...
1115 #       if(YAPP_FOUND)
1116 #               set(PLUGIN_SRC_DIRS
1117 #                       ${PLUGIN_SRC_DIRS}
1118 #                       plugins/tpg
1119 #               )
1120 #       endif()
1121 else()
1122         set(PLUGIN_SRC_DIRS )
1123 endif()
1124
1125 if(ENABLE_APPLICATION_BUNDLE)
1126         set(_plugin_dir "${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/PlugIns/wireshark")
1127 else()
1128         get_target_property(_libwireshark_location epan LOCATION)
1129         get_filename_component(_plugin_dir "${_libwireshark_location}" PATH)
1130         set(_plugin_dir "${_plugin_dir}/plugins")
1131 endif()
1132 # XXX The NMake environment appends the version. Should we do so here?
1133 set (PLUGIN_DIR ${_plugin_dir} CACHE INTERNAL "Build time plugin location.")
1134
1135 foreach(_plugin_src_dir ${PLUGIN_SRC_DIRS})
1136         add_subdirectory( ${_plugin_src_dir} )
1137 endforeach()
1138
1139
1140 # Basedir where to install guides
1141 set(DOC_DIR "$ENV{docdir}" CACHE FILEPATH "Installation directory for ug and dg pdfs.")
1142 message(STATUS "docdir: ${DOC_DIR}")
1143
1144 if(ENABLE_PCAP_NG_DEFAULT)
1145         set(PCAP_NG_DEFAULT 1)
1146 endif()
1147
1148 # Large file support (e.g. make off_t 64 bit if supported)
1149 include(gmxTestLargeFiles)
1150 gmx_test_large_files(GMX_LARGEFILES)
1151
1152 add_definitions( -DTOP_SRCDIR=\"${CMAKE_SOURCE_DIR}\" )
1153
1154 if(WIN32)
1155         # Disable deprecation
1156         if(MSVC80 OR MSVC90)
1157                 add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
1158         endif()
1159 endif()
1160
1161 if (${GIT_EXECUTABLE})
1162         set(GIT_BIN_PARAM "--git-bin ${GIT_EXECUTABLE}")
1163 endif()
1164 set( VERSION ${PROJECT_VERSION} )
1165 add_custom_target(version
1166         COMMAND ${PERL_EXECUTABLE}
1167                 ${CMAKE_SOURCE_DIR}/make-version.pl
1168                 --set-vcs ${GIT_BIN_PARAM}
1169                 ${CMAKE_SOURCE_DIR}
1170 )
1171 set_target_properties(version PROPERTIES FOLDER "Auxiliary")
1172
1173 set( configure_input "Built with CMake ${CMAKE_VERSION}" )
1174 configure_file(${CMAKE_SOURCE_DIR}/cmakeconfig.h.in ${CMAKE_BINARY_DIR}/config.h)
1175
1176 set( prefix "${CMAKE_INSTALL_PREFIX}" )
1177 set( exec_prefix "\${prefix}" )
1178 set( libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}" )
1179 set( includedir  "\${prefix}/include" )
1180 set( plugindir "\${libdir}/wireshark/plugins/${CPACK_PACKAGE_VERSION}" )
1181
1182 set(ICON_PATH "${CMAKE_SOURCE_DIR}/image/")
1183 set( IN_FILES
1184         capchild/doxygen.cfg.in
1185         caputils/doxygen.cfg.in
1186         doxygen.cfg.in
1187         doxygen_global.cfg
1188         epan/doxygen.cfg.in
1189         image/libwireshark.rc.in
1190         image/text2pcap.rc.in
1191         image/capinfos.rc.in
1192         image/wireshark.rc.in
1193         image/mergecap.rc.in
1194         image/tshark.rc.in
1195         image/dumpcap.rc.in
1196         image/reordercap.rc.in
1197         image/rawshark.rc.in
1198         image/file_dlg_win32.rc
1199         image/tfshark.rc.in
1200         image/editcap.rc.in
1201         image/captype.rc.in
1202         image/libwscodecs.rc.in
1203         image/libwsutil.rc.in
1204         image/wiretap.rc.in
1205         image/wireshark.exe.manifest.in
1206         packaging/macosx/Info.plist.in
1207         packaging/macosx/osx-dmg.sh.in
1208         packaging/macosx/Wireshark_package.pmdoc/index.xml.in
1209         randpkt_core/doxygen.cfg.in
1210         ui/doxygen.cfg.in
1211         ui/gtk/doxygen.cfg.in
1212         ui/qt/doxygen.cfg.in
1213         wireshark.pc.in
1214         writecap/doxygen.cfg.in
1215 )
1216 foreach( _in_file ${IN_FILES} )
1217         get_filename_component( _path ${_in_file} PATH )
1218         string( REGEX REPLACE "(.*)\\.in" "\\1" _outfile ${_in_file}  )
1219         configure_file( ${CMAKE_SOURCE_DIR}/${_in_file} ${CMAKE_BINARY_DIR}/${_outfile} @ONLY )
1220 endforeach()
1221
1222 include(FeatureSummary)
1223 #SET_FEATURE_INFO(NAME DESCRIPTION [URL [COMMENT] ])
1224 SET_FEATURE_INFO(SBC "SBC Codec for Bluetooth A2DP stream playing" "www: http://git.kernel.org/cgit/bluetooth/sbc.git" )
1225 SET_FEATURE_INFO(LIBSSH "libssh is library for ssh connections and it is needed to build sshdump/ciscodump" "www: https://www.libssh.org/get-it/" )
1226
1227 FEATURE_SUMMARY(WHAT ALL)
1228
1229 link_directories(
1230         ${CMAKE_BINARY_DIR}/ui
1231         ${CMAKE_BINARY_DIR}/ui/gtk
1232         ${CMAKE_BINARY_DIR}/ui/qt
1233         ${CMAKE_BINARY_DIR}/capchild
1234         ${CMAKE_BINARY_DIR}/caputils
1235         ${CMAKE_BINARY_DIR}/codecs
1236         ${CMAKE_BINARY_DIR}/epan
1237         ${CMAKE_BINARY_DIR}/randpkt_core
1238         ${CMAKE_BINARY_DIR}/wiretap
1239         ${CMAKE_BINARY_DIR}/writecap
1240         ${CMAKE_BINARY_DIR}/wsutil
1241 )
1242
1243 if(WIN32)
1244         set(PLATFORM_UI_SRC
1245                 ui/win32/console_win32.c
1246                 ui/win32/file_dlg_win32.c
1247                 ui/win32/print_win32.c
1248         )
1249         set(PLATFORM_UI_RC_FILES
1250                 image/file_dlg_win32.rc
1251         )
1252 endif()
1253
1254 # sources common for wireshark, tshark, and rawshark
1255 set(SHARK_COMMON_SRC
1256         cfile.c
1257         frame_tvbuff.c
1258         sync_pipe_write.c
1259         ws_version_info.c
1260 )
1261
1262 # sources for external capture interfaces
1263 if(ENABLE_EXTCAP)
1264         set(SHARK_COMMON_SRC
1265                 ${SHARK_COMMON_SRC}
1266                 extcap.c
1267                 extcap_parser.c
1268         )
1269 endif()
1270
1271 set(TSHARK_TAP_SRC
1272         ui/cli/tap-camelsrt.c
1273         ui/cli/tap-comparestat.c
1274         ui/cli/tap-diameter-avp.c
1275         ui/cli/tap-expert.c
1276         ui/cli/tap-endpoints.c
1277         ui/cli/tap-follow.c
1278         ui/cli/tap-funnel.c
1279         ui/cli/tap-gsm_astat.c
1280         ui/cli/tap-hosts.c
1281         ui/cli/tap-httpstat.c
1282         ui/cli/tap-icmpstat.c
1283         ui/cli/tap-icmpv6stat.c
1284         ui/cli/tap-iostat.c
1285         ui/cli/tap-iousers.c
1286         ui/cli/tap-macltestat.c
1287         ui/cli/tap-protocolinfo.c
1288         ui/cli/tap-protohierstat.c
1289         ui/cli/tap-rlcltestat.c
1290         ui/cli/tap-rpcprogs.c
1291         ui/cli/tap-rtd.c
1292         ui/cli/tap-rtp.c
1293         ui/cli/tap-rtspstat.c
1294         ui/cli/tap-sctpchunkstat.c
1295         ui/cli/tap-simple_stattable.c
1296         ui/cli/tap-sipstat.c
1297         ui/cli/tap-smbsids.c
1298         ui/cli/tap-srt.c
1299         ui/cli/tap-stats_tree.c
1300         ui/cli/tap-sv.c
1301         ui/cli/tap-wspstat.c
1302 )
1303
1304 set(INSTALL_DIRS
1305         diameter
1306         dtds
1307         help
1308         radius
1309         tpncp
1310         wimaxasncp
1311 )
1312
1313 set(INSTALL_FILES
1314         cfilters
1315         colorfilters
1316         dfilters
1317         ipmap.html
1318         manuf
1319         pdml2html.xsl
1320         services
1321         smi_modules
1322         docbook/ws.css
1323         ${CMAKE_BINARY_DIR}/doc/AUTHORS-SHORT
1324         ${CMAKE_BINARY_DIR}/doc/asn2deb.html
1325         ${CMAKE_BINARY_DIR}/doc/androiddump.html
1326         ${CMAKE_BINARY_DIR}/doc/capinfos.html
1327         ${CMAKE_BINARY_DIR}/doc/captype.html
1328         ${CMAKE_BINARY_DIR}/doc/ciscodump.html
1329         ${CMAKE_BINARY_DIR}/doc/dftest.html
1330         ${CMAKE_BINARY_DIR}/doc/dumpcap.html
1331         ${CMAKE_BINARY_DIR}/doc/editcap.html
1332         ${CMAKE_BINARY_DIR}/doc/extcap.html
1333         ${CMAKE_BINARY_DIR}/doc/idl2deb.html
1334         ${CMAKE_BINARY_DIR}/doc/idl2wrs.html
1335         ${CMAKE_BINARY_DIR}/doc/mergecap.html
1336         ${CMAKE_BINARY_DIR}/doc/randpkt.html
1337         ${CMAKE_BINARY_DIR}/doc/randpktdump.html
1338         ${CMAKE_BINARY_DIR}/doc/rawshark.html
1339         ${CMAKE_BINARY_DIR}/doc/reordercap.html
1340         ${CMAKE_BINARY_DIR}/doc/sshdump.html
1341         ${CMAKE_BINARY_DIR}/doc/text2pcap.html
1342         ${CMAKE_BINARY_DIR}/doc/tshark.html
1343         ${CMAKE_BINARY_DIR}/doc/wireshark.html
1344         ${CMAKE_BINARY_DIR}/doc/wireshark-filter.html
1345 )
1346
1347 if(WIN32)
1348         set(TEXTIFY_FILES COPYING NEWS README README.windows)
1349         foreach(_text_file ${TEXTIFY_FILES})
1350                 set(INSTALL_FILES ${CMAKE_BINARY_DIR}/${_text_file}.txt ${INSTALL_FILES})
1351         endforeach()
1352 else()
1353         set(INSTALL_FILES COPYING ${INSTALL_FILES})
1354 endif()
1355
1356 set(LIBEPAN_LIBS
1357 #               @SSL_LIBS@      # -lcrypto
1358                 epan
1359 #               $(plugin_ldadd) # in case of static
1360                 ${AIRPCAP_LIBRARIES}
1361                 ${PCAP_LIBRARIES}
1362                 ${CARES_LIBRARIES}
1363                 ${KERBEROS_LIBRARIES}
1364                 ${LUA_LIBRARIES}
1365                 ${PYTHON_LIBRARIES}
1366                 ${GEOIP_LIBRARIES}
1367                 ${GCRYPT_LIBRARIES}
1368                 ${GNUTLS_LIBRARIES}
1369                 ${SMI_LIBRARIES}
1370                 ${ZLIB_LIBRARIES}
1371                 ${M_LIBRARIES}
1372                 ${WINSPARKLE_LIBRARIES}
1373 )
1374
1375 if(WIN32)
1376         # According to http://stackoverflow.com/questions/14474659/cmake-how-to-have-a-target-for-copying-files
1377         # we can't just use "set(_dll_output_dir "$<TARGET_FILE_DIR:epan>")"
1378         # DATAFILE_DIR is set using the same property. We could probably
1379         # get away with using it here.
1380         get_target_property(_libwireshark_location epan LOCATION)
1381         get_filename_component(_dll_output_dir "${_libwireshark_location}" PATH)
1382         add_custom_target(copy_cli_dlls)
1383         set_target_properties(copy_cli_dlls PROPERTIES FOLDER "Copy Tasks")
1384         add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1385                 COMMAND ${CMAKE_COMMAND} -E make_directory "${_dll_output_dir}"
1386         )
1387
1388         # XXX Can (and should) we iterate over these similar to the way
1389         # the top-level CMakeLists.txt iterates over the package list?
1390
1391         # Required DLLs.
1392         # The cairo, freetype, gio, gnutls, png, and other OBS-generated DLLs
1393         # depend on zlib1.dll. We compile zlib locally but the Debug
1394         # configuration (the default) creates zlibd1.dll.
1395         file (TO_NATIVE_PATH "${_dll_output_dir}" _dll_output_dir_win )
1396         foreach( _dll ${GLIB2_DLLS} $<$<CONFIG:Debug>:zlib1.dll> )
1397                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1398                         # It would be really handy if copy, xcopy, or "cmake
1399                         # -E copy_if_different" supported multiple files
1400                         # separated by whitespace, or if robocpy had a sane
1401                         # notion of exit codes.
1402                         COMMAND if exist \"${_dll}\" xcopy ${_dll} "${_dll_output_dir_win}" /D /Y
1403                         WORKING_DIRECTORY "${GLIB2_DLL_DIR}"
1404                 )
1405         endforeach(_dll)
1406
1407
1408         # Don't overwrite an exe if it's already there. We don't want to
1409         # clobber any previous code signing.
1410         file(GLOB _gspawn_helpers
1411                 RELATIVE "${GLIB2_DLL_DIR}"
1412                 "${GLIB2_DLL_DIR}/gspawn*.exe"
1413         )
1414         foreach(_gspawn_helper ${_gspawn_helpers})
1415                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1416                         COMMAND if not exist \"${_dll_output_dir_win}\\${_gspawn_helper}\" xcopy ${_gspawn_helper} "${_dll_output_dir_win}" /D /Y
1417                         WORKING_DIRECTORY "${GLIB2_DLL_DIR}"
1418                 )
1419         endforeach()
1420
1421         # Optional
1422         if (AIRPCAP_FOUND)
1423                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1424                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1425                                 "${AIRPCAP_DLL_DIR}/${AIRPCAP_DLL}"
1426                                 "${_dll_output_dir}"
1427                 )
1428         endif(AIRPCAP_FOUND)
1429         if (CARES_FOUND)
1430                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1431                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1432                                 "${CARES_DLL_DIR}/${CARES_DLL}"
1433                                 "${_dll_output_dir}"
1434                 )
1435         endif(CARES_FOUND)
1436         if (GEOIP_FOUND)
1437                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1438                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1439                                 "${GEOIP_DLL_DIR}/${GEOIP_DLL}"
1440                                 "${_dll_output_dir}"
1441                 )
1442         endif(GEOIP_FOUND)
1443         if (LIBSSH_FOUND)
1444                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1445                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1446                                 "${LIBSSH_DLL_DIR}/${LIBSSH_DLL}"
1447                                 "${_dll_output_dir}"
1448                 )
1449         endif(LIBSSH_FOUND)
1450         if(GCRYPT_FOUND)
1451                 foreach( _dll ${GCRYPT_DLLS} )
1452                         add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1453                                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
1454                                         "${GCRYPT_DLL_DIR}/${_dll}"
1455                                         "${_dll_output_dir}"
1456                         )
1457                 endforeach(_dll)
1458         endif(GCRYPT_FOUND)
1459         if(GNUTLS_FOUND)
1460                 foreach( _dll ${GNUTLS_DLLS} )
1461                         add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1462                                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
1463                                         "${GNUTLS_DLL_DIR}/${_dll}"
1464                                         "${_dll_output_dir}"
1465                         )
1466                 endforeach(_dll)
1467         endif(GNUTLS_FOUND)
1468         if(KERBEROS_FOUND)
1469                 foreach( _dll ${KERBEROS_DLLS} )
1470                         add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1471                                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
1472                                         "${KERBEROS_DLL_DIR}/${_dll}"
1473                                         "${_dll_output_dir}"
1474                         )
1475                 endforeach(_dll)
1476         endif(KERBEROS_FOUND)
1477         if (LUA_FOUND)
1478                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1479                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1480                                 "${LUA_DLL_DIR}/${LUA_DLL}"
1481                                 "${_dll_output_dir}"
1482                 )
1483         endif(LUA_FOUND)
1484         if (SMI_FOUND)
1485                 # Wireshark.nsi wants SMI_DIR which is the base SMI directory
1486                 get_filename_component(SMI_DIR ${SMI_DLL_DIR} DIRECTORY)
1487                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1488                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1489                                 "${SMI_DLL_DIR}/${SMI_DLL}"
1490                                 "${_dll_output_dir}"
1491                         COMMAND ${CMAKE_COMMAND} -E make_directory
1492                                 "${_dll_output_dir}/snmp"
1493                         COMMAND ${CMAKE_COMMAND} -E make_directory
1494                                 "${_dll_output_dir}/snmp/mibs"
1495                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1496                                 "${SMI_SHARE_DIR}/${SMI_DLL}/mibs/iana"
1497                                 "${_dll_output_dir}/snmp/mibs"
1498                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1499                                 "${SMI_SHARE_DIR}/${SMI_DLL}/mibs/ietf"
1500                                 "${_dll_output_dir}/snmp/mibs"
1501                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1502                                 "${SMI_SHARE_DIR}/${SMI_DLL}/mibs/irtf"
1503                                 "${_dll_output_dir}/snmp/mibs"
1504                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1505                                 "${SMI_SHARE_DIR}/${SMI_DLL}/mibs/site"
1506                                 "${_dll_output_dir}/snmp/mibs"
1507                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1508                                 "${SMI_SHARE_DIR}/${SMI_DLL}/mibs/tubs"
1509                                 "${_dll_output_dir}/snmp/mibs"
1510                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1511                                 "${SMI_SHARE_DIR}/${SMI_DLL}/pibs"
1512                                 "${_dll_output_dir}/snmp/mibs"
1513                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1514                                 "${SMI_SHARE_DIR}/${SMI_DLL}/yang"
1515                                 "${_dll_output_dir}/snmp/mibs"
1516                 )
1517         endif(SMI_FOUND)
1518         if (WINSPARKLE_FOUND)
1519                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1520                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1521                                 "${WINSPARKLE_DLL_DIR}/${WINSPARKLE_DLL}"
1522                                 "${_dll_output_dir}"
1523                 )
1524         endif(WINSPARKLE_FOUND)
1525
1526         add_dependencies(epan copy_cli_dlls)
1527
1528         # We have a lot of choices for creating zip archives:
1529         # - 7z, WinZip, etc., which require a separate download+install.
1530         # - Cygwin's zip, which requires Cygwin.
1531         # - "CMake -E tar cz", which creates a tar file.
1532         # - CPack, which requires a CPack configuration.
1533         # - PowerShell via PSCX or System.IO.Compression.FileSystem.
1534         # - Python via zipfile.
1535         # For now, just look for 7z. It's installed on the Windows builders,
1536         # which might be the only systems that use this target.
1537         find_program(ZIP_EXECUTABLE 7z
1538                 PATH "$ENV{PROGRAMFILES}/7-Zip" "$ENV{PROGRAMW6432}/7-Zip"
1539                 DOC "Path to the 7z utility."
1540         )
1541         # XXX "if(ZIP_EXECUTABLE)" doesn't work here. It looks like the
1542         # absence of "-NOTFOUND" doesn't equal "true".
1543         if (NOT "${ZIP_EXECUTABLE}" STREQUAL "ZIP_EXECUTABLE-NOTFOUND")
1544                 add_custom_target(pdb_zip_package)
1545                 set_target_properties(pdb_zip_package PROPERTIES FOLDER "Packaging")
1546                 set(_pdb_zip "${CMAKE_BINARY_DIR}/Wireshark-pdb-${WIRESHARK_TARGET_PLATFORM}-${VERSION}.zip")
1547                 file(TO_NATIVE_PATH "${_pdb_zip}" _pdb_zip_win)
1548                 add_custom_command(TARGET pdb_zip_package POST_BUILD
1549                         COMMAND ${CMAKE_COMMAND} -E remove -f "${_pdb_zip}"
1550                         COMMAND ${ZIP_EXECUTABLE} a -tzip -mmt=on "${_pdb_zip_win}" *.pdb *.lib
1551                         WORKING_DIRECTORY "${_dll_output_dir}"
1552                 )
1553                 add_dependencies(pdb_zip_package epan)
1554         endif()
1555 endif(WIN32)
1556
1557 # List of extra dependencies for the "copy_data_files" target
1558 set(copy_data_files_depends)
1559
1560 # glob patterns relative to the source directory that should be copied to
1561 # ${DATAFILE_DIR} (including directory prefixes)
1562 set(DATA_FILES_SRC
1563         "help/toc"
1564 )
1565
1566 if(WIN32)
1567         foreach(_text_file ${TEXTIFY_FILES})
1568                 add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${_text_file}.txt
1569                         COMMAND ${POWERSHELL_COMMAND} "${CMAKE_SOURCE_DIR}/tools/textify.ps1"
1570                                 -Destination ${CMAKE_BINARY_DIR}
1571                                 ${CMAKE_SOURCE_DIR}/${_text_file}
1572                         DEPENDS
1573                                 ${CMAKE_SOURCE_DIR}/${_text_file}
1574                 )
1575         endforeach()
1576 endif()
1577
1578 foreach(_install_file ${INSTALL_FILES})
1579         get_filename_component(_install_basename "${_install_file}" NAME)
1580         set(_output_file "${DATAFILE_DIR}/${_install_basename}")
1581         add_custom_command(OUTPUT "${_output_file}"
1582                 COMMAND ${CMAKE_COMMAND} -E copy
1583                         "${_install_file}"
1584                         "${_output_file}"
1585                 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
1586                 DEPENDS
1587                         docs
1588                         "${_install_file}"
1589         )
1590         list(APPEND copy_data_files_depends "${_output_file}")
1591 endforeach()
1592
1593 if(ENABLE_EXTCAP)
1594         # Ensure "run/extcap" exists
1595         add_custom_command(OUTPUT "${DATAFILE_DIR}/extcap"
1596                 COMMAND ${CMAKE_COMMAND} -E make_directory
1597                         "${DATAFILE_DIR}/extcap"
1598         )
1599         list(APPEND copy_data_files_depends "${DATAFILE_DIR}/extcap")
1600 endif()
1601 set(_help_files
1602         help/capture_filters.txt
1603         help/capturing.txt
1604         help/display_filters.txt
1605         help/getting_started.txt
1606         help/overview.txt
1607 )
1608 if(WIN32)
1609         file(TO_NATIVE_PATH "${DATAFILE_DIR}/help" _help_dest_dir)
1610         foreach(_help_file IN LISTS _help_files)
1611                 add_custom_command(OUTPUT "${DATAFILE_DIR}/${_help_file}"
1612                         COMMAND ${CMAKE_COMMAND} -E make_directory "${DATAFILE_DIR}/help"
1613                         COMMAND ${POWERSHELL_COMMAND} "${CMAKE_SOURCE_DIR}/tools/textify.ps1"
1614                                 -Destination "${_help_dest_dir}"
1615                                 "${CMAKE_SOURCE_DIR}/${_help_file}"
1616                         DEPENDS
1617                                 "${CMAKE_SOURCE_DIR}/${_help_file}"
1618                 )
1619                 list(APPEND copy_data_files_depends "${DATAFILE_DIR}/${_help_file}")
1620         endforeach()
1621 else()
1622         list(APPEND DATA_FILES_SRC ${_help_files})
1623 endif(WIN32)
1624
1625 # Create help/faq.txt when missing
1626 add_custom_command(OUTPUT "${DATAFILE_DIR}/help/faq.txt"
1627         COMMAND ${CMAKE_COMMAND} -E make_directory "${DATAFILE_DIR}/help"
1628         COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/help/faq.py -b > faq.tmp.html
1629         COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/html2text.py
1630                 faq.tmp.html > "${DATAFILE_DIR}/help/faq.txt"
1631         COMMAND ${CMAKE_COMMAND} -E remove faq.tmp.html
1632         DEPENDS
1633                 "${CMAKE_SOURCE_DIR}/help/faq.py"
1634                 "${CMAKE_SOURCE_DIR}/tools/html2text.py"
1635 )
1636 list(APPEND copy_data_files_depends "${DATAFILE_DIR}/help/faq.txt")
1637
1638 # Install LUA files in staging directory such that LUA can used when Wireshark
1639 # is ran from the build directory. For install targets, see
1640 # epan/wslua/CMakeLists.txt
1641 if(LUA_FOUND AND ENABLE_LUA)
1642         set(_lua_files
1643                 "${CMAKE_BINARY_DIR}/epan/wslua/init.lua"
1644                 "${CMAKE_SOURCE_DIR}/epan/wslua/console.lua"
1645                 "${CMAKE_SOURCE_DIR}/epan/wslua/dtd_gen.lua"
1646         )
1647         foreach(_lua_file ${_lua_files})
1648                 get_filename_component(_lua_filename "${_lua_file}" NAME)
1649                 list(APPEND copy_data_files_depends
1650                         "${DATAFILE_DIR}/${_lua_filename}")
1651                 add_custom_command(OUTPUT "${DATAFILE_DIR}/${_lua_filename}"
1652                         COMMAND ${CMAKE_COMMAND} -E copy
1653                                 "${_lua_file}"
1654                                 "${DATAFILE_DIR}/${_lua_filename}"
1655                         DEPENDS
1656                                 wsluaauxiliary
1657                                 "${_lua_file}"
1658                 )
1659         endforeach()
1660 endif(LUA_FOUND AND ENABLE_LUA)
1661 # doc/*.html handled elsewhere.
1662
1663 # TODO shouldn't this use full (relative) paths instead of glob patterns?
1664 list(APPEND DATA_FILES_SRC
1665         "dtds/*.dtd"
1666
1667         "radius/README.radius_dictionary"
1668         "radius/custom.includes"
1669         "radius/dictionary"
1670         "radius/dictionary.*"
1671
1672         "diameter/*.dtd"
1673         "diameter/*.xml"
1674         "profiles/*/*"
1675         "tpncp/tpncp.dat"
1676         "wimaxasncp/*.dtd"
1677         "wimaxasncp/*.xml"
1678 )
1679
1680 # Copy all paths from the source tree to the data directory. Directories are
1681 # automatically created if missing as the filename is given.
1682 file(GLOB _data_files RELATIVE "${CMAKE_SOURCE_DIR}" ${DATA_FILES_SRC})
1683 foreach(_data_file ${_data_files})
1684         add_custom_command(OUTPUT "${DATAFILE_DIR}/${_data_file}"
1685                 COMMAND ${CMAKE_COMMAND} -E copy
1686                         "${CMAKE_SOURCE_DIR}/${_data_file}"
1687                         "${DATAFILE_DIR}/${_data_file}"
1688                 DEPENDS
1689                         "${CMAKE_SOURCE_DIR}/${_data_file}"
1690         )
1691         list(APPEND copy_data_files_depends "${DATAFILE_DIR}/${_data_file}")
1692 endforeach()
1693
1694 # Copy files including ${INSTALL_FILES} and ${INSTALL_DIRS} to ${DATAFILE_DIR}
1695 add_custom_target(copy_data_files ALL DEPENDS ${copy_data_files_depends})
1696 set_target_properties(copy_data_files PROPERTIES FOLDER "Copy Tasks")
1697
1698 if( (BUILD_wireshark AND QT_FOUND) OR (BUILD_wireshark_gtk AND GTK_FOUND) )
1699         set(WIRESHARK_SRC
1700                 capture_info.c
1701                 capture_opts.c
1702                 file.c
1703                 fileset.c
1704                 filter_files.c
1705                 summary.c
1706                 ${SHARK_COMMON_SRC}
1707                 ${PLATFORM_UI_SRC}
1708         )
1709         set(wireshark_FILES
1710                 ${WIRESHARK_SRC}
1711                 ${CMAKE_BINARY_DIR}/image/wireshark.rc
1712                 ${PLATFORM_UI_RC_FILES}
1713         )
1714 endif()
1715
1716 if(ENABLE_APPLICATION_BUNDLE)
1717         #
1718         # Add -Wl,-single_module to the LDFLAGS used with shared
1719         # libraries, to fix some error that show up in some cases;
1720         # some Apple documentation recommends it for most shared
1721         # libraries.
1722         #
1723         set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-single_module ${CMAKE_SHARED_LINKER_FLAGS}" )
1724         #
1725         # Add -Wl,-headerpad_max_install_names to the LDFLAGS, as
1726         # code-signing issues is running out of padding space.
1727         #
1728         # Add -Wl,-search_paths_first to make sure that if we search
1729         # directories A and B, in that order, for a given library, a
1730         # non-shared version in directory A, rather than a shared
1731         # version in directory B, is chosen (so we can use
1732         # --with-pcap=/usr/local to force all programs to be linked
1733         # with a static version installed in /usr/local/lib rather than
1734         # the system version in /usr/lib).
1735         #
1736
1737         set(CMAKE_EXE_LINKER_FLAGS
1738         "-Wl,-headerpad_max_install_names -Wl,-search_paths_first ${CMAKE_EXE_LINKER_FLAGS}"
1739         )
1740
1741         # Add files to the app bundle
1742         # Wireshark.app/Contents
1743         file(WRITE ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo "APPLWshk\n")
1744         set(BUNDLE_CONTENTS_FILES
1745                 ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo
1746         )
1747         set_source_files_properties(${BUNDLE_CONTENTS_FILES} PROPERTIES
1748                 MACOSX_PACKAGE_LOCATION .
1749         )
1750
1751         # Wireshark.app/Contents/Resources
1752         set(BUNDLE_RESOURCE_FILES
1753                 ${CMAKE_SOURCE_DIR}/packaging/macosx/Wireshark.icns
1754                 ${CMAKE_SOURCE_DIR}/packaging/macosx/Wiresharkdoc.icns
1755         )
1756         set_source_files_properties(${BUNDLE_RESOURCE_FILES} PROPERTIES
1757                 MACOSX_PACKAGE_LOCATION Resources
1758         )
1759
1760         # Wireshark.app/Contents/Resources/share/man/man1
1761         set(BUNDLE_RESOURCE_SHARE_MAN1_FILES ${MAN1_FILES})
1762         set_source_files_properties(${BUNDLE_RESOURCE_SHARE_MAN1_FILES} PROPERTIES
1763                 MACOSX_PACKAGE_LOCATION Resources/share/man/man1
1764         )
1765
1766         # Wireshark.app/Contents/Resources/share/man/man1
1767         set(BUNDLE_RESOURCE_SHARE_MAN4_FILES ${MAN4_FILES})
1768         set_source_files_properties(${BUNDLE_RESOURCE_SHARE_MAN4_FILES} PROPERTIES
1769                 MACOSX_PACKAGE_LOCATION Resources/share/man/man4
1770         )
1771
1772         # INSTALL_FILES and INSTALL_DIRS are handled by copy_data_files
1773
1774         set(EXTRA_BUNDLE_FILES
1775                 ${BUNDLE_CONTENTS_FILES}
1776                 ${BUNDLE_RESOURCE_FILES}
1777                 ${BUNDLE_RESOURCE_SHARE_MAN1_FILES}
1778                 ${BUNDLE_RESOURCE_SHARE_MAN4_FILES}
1779         )
1780 else()
1781         set(EXTRA_BUNDLE_FILES)
1782 endif()
1783
1784 if(BUILD_wireshark AND QT_FOUND)
1785         set(wireshark_LIBS
1786                 qtui
1787                 ui
1788                 capchild
1789                 caputils
1790                 ${QT_LIBRARIES}
1791                 ${GTHREAD2_LIBRARIES}
1792                 wscodecs
1793                 ${LIBEPAN_LIBS}
1794                 ${APPLE_APPLICATION_SERVICES_LIBRARY}
1795                 ${APPLE_CORE_FOUNDATION_LIBRARY}
1796                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
1797                 ${NL_LIBRARIES}
1798         )
1799
1800         # Policy since 2.8.11
1801         if (POLICY CMP0020)
1802                 cmake_policy(SET CMP0020 NEW)
1803         endif()
1804
1805         add_executable(wireshark WIN32 MACOSX_BUNDLE wireshark-qt.cpp ${wireshark_FILES} ${EXTRA_BUNDLE_FILES})
1806         add_dependencies(wireshark version)
1807         set(PROGLIST ${PROGLIST} wireshark)
1808         set_target_properties(wireshark PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
1809         set_target_properties(wireshark PROPERTIES FOLDER "Executables")
1810         if(ENABLE_APPLICATION_BUNDLE OR WIN32)
1811                 set_target_properties(wireshark PROPERTIES OUTPUT_NAME Wireshark)
1812         endif()
1813
1814         if(ENABLE_APPLICATION_BUNDLE)
1815                 set_target_properties(
1816                         wireshark PROPERTIES
1817                                 MACOSX_BUNDLE_INFO_PLIST ${CMAKE_BINARY_DIR}/packaging/macosx/Info.plist
1818                 )
1819                 # Add a wrapper script which opens the bundle. This adds
1820                 # convenience but makes debugging more difficult.
1821                 file(REMOVE ${CMAKE_BINARY_DIR}/run/wireshark)
1822                 file(WRITE ${CMAKE_BINARY_DIR}/run/wireshark "#!/bin/sh\n")
1823                 file(APPEND ${CMAKE_BINARY_DIR}/run/wireshark "open ${CMAKE_BINARY_DIR}/run/Wireshark.app --args \"\$\@\"\n")
1824                 execute_process(COMMAND chmod a+x ${CMAKE_BINARY_DIR}/run/wireshark)
1825         endif()
1826
1827         target_link_libraries(wireshark ${wireshark_LIBS})
1828         install(
1829                 TARGETS wireshark
1830                 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1831                 BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}
1832         )
1833
1834         if(NOT ENABLE_APPLICATION_BUNDLE)
1835                 # Map for endpoints dialog
1836                 ADD_CUSTOM_COMMAND(
1837                         TARGET wireshark
1838                         POST_BUILD
1839                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1840                                 "${PROJECT_SOURCE_DIR}/ipmap.html"
1841                                 $<TARGET_FILE_DIR:wireshark>
1842                 )
1843         endif()
1844
1845         if(WIN32 AND Qt5Core_FOUND)
1846                 # Use windeployqt to copy our required DLLs to the run path.
1847                 # Ideally one of the modules in ${QTDIR}/lib/cmake would expose
1848                 # the path to windeployqt. For that matter having a reliable
1849                 # path to qmake would be *amazingly convenient*. We don't have
1850                 # either of those so we try to discover the path via Qt5Core.
1851                 # http://stackoverflow.com/questions/24650936/qt5-with-cmake-how-to-find-qt-translations-dir
1852
1853                 get_target_property(_qmake_location Qt5::qmake IMPORTED_LOCATION)
1854                 get_filename_component(_qt_bin_path "${_qmake_location}" DIRECTORY)
1855                 find_program(QT_WINDEPLOYQT_EXECUTABLE windeployqt
1856                         HINTS "${_qmake_location}"
1857                         DOC "Path to the windeployqt utility."
1858                 )
1859                 if (NOT "${QT_WINDEPLOYQT_EXECUTABLE}" STREQUAL "QT_WINDEPLOYQT_EXECUTABLE-NOTFOUND")
1860                         set(QT_BIN_PATH "${_qt_bin_path}" CACHE INTERNAL
1861                                 "Path to qmake, windeployqt, and other Qt utilities."
1862                         )
1863                         add_custom_target(copy_qt_dlls ALL)
1864                         set_target_properties(copy_qt_dlls PROPERTIES FOLDER "Copy Tasks")
1865                         # Will we ever need to use --debug? Windeployqt seems to
1866                         # be smart enough to copy debug DLLs when needed.
1867                         add_custom_command(TARGET copy_qt_dlls
1868                                 POST_BUILD
1869                                 COMMAND set "PATH=%PATH%;${QT_BIN_PATH}"
1870                                 COMMAND "${QT_WINDEPLOYQT_EXECUTABLE}"
1871                                         $<$<CONFIG:Debug>:--debug>
1872                                         $<$<NOT:$<CONFIG:Debug>>:--release>
1873                                         --no-compiler-runtime
1874                                         --verbose 10
1875                                         "$<TARGET_FILE:wireshark>"
1876                         )
1877                         add_dependencies(copy_qt_dlls wireshark)
1878                 endif()
1879         endif(WIN32 AND Qt5Core_FOUND)
1880 endif()
1881
1882 # Common properties for CLI executables
1883 macro(set_extra_executable_properties _executable _folder)
1884         set_target_properties(${_executable} PROPERTIES
1885                 LINK_FLAGS "${WS_LINK_FLAGS}"
1886                 FOLDER ${_folder}
1887         )
1888
1889         set(PROGLIST ${PROGLIST} ${_executable})
1890
1891         if(ENABLE_APPLICATION_BUNDLE)
1892                 set_target_properties(${_executable} PROPERTIES
1893                         RUNTIME_OUTPUT_DIRECTORY run/Wireshark.app/Contents/MacOS
1894                 )
1895                 # Add a wrapper script which runs each executable from the
1896                 # correct location. This adds convenience but makes debugging
1897                 # more difficult.
1898                 file(REMOVE ${CMAKE_BINARY_DIR}/run/${_executable})
1899                 file(WRITE ${CMAKE_BINARY_DIR}/run/${_executable} "#!/bin/sh\n")
1900                 file(APPEND ${CMAKE_BINARY_DIR}/run/${_executable} "exec ${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/MacOS/${_executable} \"\$\@\"\n")
1901                 execute_process(COMMAND chmod a+x ${CMAKE_BINARY_DIR}/run/${_executable})
1902         endif()
1903 endmacro()
1904
1905 macro(set_extcap_executable_properties _executable)
1906         set_target_properties(${_executable} PROPERTIES FOLDER "Executables/Extcaps")
1907
1908         set(PROGLIST ${PROGLIST} ${_executable})
1909
1910         if(WIN32)
1911                 set_target_properties(${_executable} PROPERTIES
1912                         LINK_FLAGS "${WS_LINK_FLAGS}"
1913                         RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/run/extcap
1914                         RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/run/Debug/extcap
1915                         RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/run/Release/extcap
1916                         RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR}/run/MinSizeRel/extcap
1917                         RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/run/RelWithDebInfo/extcap
1918                 )
1919         else()
1920                 set_target_properties(${_executable} PROPERTIES
1921                         LINK_FLAGS "${WS_LINK_FLAGS}"
1922                         RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/run/extcap
1923                 )
1924                 if(ENABLE_APPLICATION_BUNDLE)
1925                         set_target_properties(${_executable} PROPERTIES
1926                                 RUNTIME_OUTPUT_DIRECTORY run/Wireshark.app/Contents/MacOS/extcap
1927                         )
1928                         # Add a wrapper script which runs each executable from the
1929                         # correct location. This adds convenience but makes debugging
1930                         # more difficult.
1931                         file(REMOVE ${CMAKE_BINARY_DIR}/run/${_executable})
1932                         file(WRITE ${CMAKE_BINARY_DIR}/run/${_executable} "#!/bin/sh\n")
1933                         file(APPEND ${CMAKE_BINARY_DIR}/run/${_executable} "exec ${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/MacOS/extcap/${_executable} \"\$\@\"\n")
1934                         execute_process(COMMAND chmod a+x ${CMAKE_BINARY_DIR}/run/${_executable})
1935                 endif()
1936         endif()
1937 endmacro()
1938
1939 if(BUILD_wireshark_gtk AND GTK_FOUND)
1940         set(wireshark_gtk_LIBS
1941                 gtkui
1942                 ui
1943                 capchild
1944                 caputils
1945                 ${GTK2_LIBRARIES}
1946                 ${GTK3_LIBRARIES}
1947                 ${GTHREAD2_LIBRARIES}
1948                 wscodecs
1949                 ${PORTAUDIO_LIBRARIES}
1950                 ${LIBEPAN_LIBS}
1951                 ${APPLE_APPLICATION_SERVICES_LIBRARY}
1952                 ${APPLE_CORE_SERVICES_LIBRARY}
1953                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
1954                 ${NL_LIBRARIES}
1955                 ${WIN_COMCTL32_LIBRARY}
1956         )
1957         # wireshark and wireshark-gtk share wireshark_FILES
1958
1959         add_executable(wireshark-gtk WIN32 ${wireshark_FILES})
1960         add_dependencies(wireshark-gtk version)
1961         set(PROGLIST ${PROGLIST} wireshark-gtk)
1962         set_target_properties(wireshark-gtk PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
1963         set_target_properties(wireshark-gtk PROPERTIES FOLDER "Executables")
1964         target_link_libraries(wireshark-gtk ${wireshark_gtk_LIBS})
1965         install(TARGETS wireshark-gtk RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1966
1967         # Map for endpoints dialog
1968         ADD_CUSTOM_COMMAND(
1969                 TARGET wireshark-gtk
1970                 POST_BUILD
1971                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
1972                         "${PROJECT_SOURCE_DIR}/ipmap.html"
1973                         $<TARGET_FILE_DIR:wireshark-gtk>
1974         )
1975
1976         if(WIN32)
1977                 get_target_property(_wsgtk_location wireshark-gtk LOCATION)
1978                 get_filename_component(_dll_output_dir "${_wsgtk_location}" PATH)
1979                 add_custom_target(copy_gtk_dlls)
1980                 set_target_properties(copy_gtk_dlls PROPERTIES FOLDER "Copy Tasks")
1981                 add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
1982                         COMMAND ${CMAKE_COMMAND} -E make_directory "${_dll_output_dir}"
1983                 )
1984
1985                 if(GTK2_FOUND)
1986                         set(_gtk_dll_dir "${GTK2_DLL_DIR}")
1987                         set(_gtk_etc_dir "${GTK2_ETC_DIR}")
1988                         set(_gtk_dlls "${GTK2_DLLS}")
1989                         set(_gtk_etc_dir "${GTK2_ETC_DIR}")
1990                 else()
1991                         set(_gtk_dll_dir "${GTK3_DLL_DIR}")
1992                         set(_gtk_dlls "${GTK3_DLLS}")
1993                         set(_gtk_etc_dir "${GTK3_ETC_DIR}")
1994                 endif()
1995
1996                 foreach(_dll ${_gtk_dlls})
1997                         add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
1998                                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
1999                                         "${_gtk_dll_dir}/${_dll}" "${_dll_output_dir}"
2000                         )
2001                 endforeach(_dll)
2002
2003                 # /etc
2004                 add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2005                         COMMAND ${CMAKE_COMMAND} -E make_directory "${_dll_output_dir}/etc"
2006                 )
2007                 add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2008                         COMMAND ${CMAKE_COMMAND} -E copy_directory
2009                                 "${_gtk_etc_dir}" "${_dll_output_dir}/etc"
2010                 )
2011
2012                 # XXX - Omitting ${GTK2_LIB_DIR}\loaders copying from Makefile.nmake
2013                 if(GTK2_FOUND)
2014                         # Engines
2015                         set (_engines_output_dir "${_dll_output_dir}/lib/gtk-2.0/2.10.0/engines")
2016                         add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2017                                 COMMAND ${CMAKE_COMMAND} -E make_directory "${_engines_output_dir}"
2018                         )
2019                         foreach(_dll ${GTK2_ENGINES_DLLS})
2020                                 add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2021                                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
2022                                                 "${GTK2_ENGINES_DLL_DIR}/${_dll}" "${_engines_output_dir}"
2023                                 )
2024                         endforeach(_dll)
2025
2026                         # Themes
2027                         add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2028                                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2029                                         "${GTK2_THEMES_DIR}/gtkrc" "${_dll_output_dir}/etc/gtk-2.0"
2030                         )
2031
2032                         # Modules
2033                         add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2034                                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2035                                         "${GTK2_LIB_DIR}" "${_dll_output_dir}/lib/gtk-2.0"
2036                         )
2037                 else()
2038                         add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2039                                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2040                                         "${CMAKE_SOURCE_DIR}/ui/win32/settings.ini" "${_dll_output_dir}/etc"
2041                         )
2042                 endif()
2043
2044                 add_dependencies(wireshark-gtk copy_gtk_dlls copy_cli_dlls)
2045         endif(WIN32)
2046 endif()
2047
2048 register_tap_files(tshark-tap-register.c
2049         tshark-taps
2050         ${TSHARK_TAP_SRC}
2051 )
2052
2053 if(BUILD_tshark)
2054         set(tshark_LIBS
2055                 ui
2056                 capchild
2057                 caputils
2058                 ${LIBEPAN_LIBS}
2059                 ${APPLE_CORE_FOUNDATION_LIBRARY}
2060                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2061         )
2062         set(tshark_FILES
2063                 capture_opts.c
2064                 filter_files.c
2065                 tshark-tap-register.c
2066                 tshark.c
2067                 ${TSHARK_TAP_SRC}
2068                 ${SHARK_COMMON_SRC}
2069                 ${CMAKE_BINARY_DIR}/image/tshark.rc
2070         )
2071         add_executable(tshark ${tshark_FILES})
2072         add_dependencies(tshark version)
2073         set_extra_executable_properties(tshark "Executables")
2074         target_link_libraries(tshark ${tshark_LIBS})
2075         install(TARGETS tshark RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2076 endif()
2077
2078 if(BUILD_tfshark)
2079         set(tfshark_LIBS
2080                 ui
2081                 ${LIBEPAN_LIBS}
2082                 ${APPLE_CORE_FOUNDATION_LIBRARY}
2083                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2084         )
2085         set(tfshark_FILES
2086                 tfshark.c
2087                 ${TSHARK_TAP_SRC}
2088                 ${SHARK_COMMON_SRC}
2089                 ${CMAKE_BINARY_DIR}/image/tfshark.rc
2090         )
2091         add_executable(tfshark ${tfshark_FILES})
2092         add_dependencies(tfshark version)
2093         set_extra_executable_properties(tfshark "Executables")
2094         target_link_libraries(tfshark ${tfshark_LIBS})
2095         install(TARGETS tfshark RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2096 endif()
2097
2098 if(BUILD_rawshark AND PCAP_FOUND)
2099         set(rawshark_LIBS
2100                 caputils
2101                 ${LIBEPAN_LIBS}
2102                 ${APPLE_CORE_FOUNDATION_LIBRARY}
2103                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2104         )
2105         set(rawshark_FILES
2106                 ${SHARK_COMMON_SRC}
2107                 rawshark.c
2108                 ui/util.c
2109                 ${CMAKE_BINARY_DIR}/image/rawshark.rc
2110         )
2111         add_executable(rawshark ${rawshark_FILES})
2112         add_dependencies(rawshark version)
2113         set_extra_executable_properties(rawshark "Executables")
2114         target_link_libraries(rawshark ${rawshark_LIBS})
2115         install(TARGETS rawshark RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2116 endif()
2117
2118 if(BUILD_dftest)
2119         set(dftest_LIBS
2120                 ${LIBEPAN_LIBS}
2121         )
2122         set(dftest_FILES
2123                 dftest.c
2124                 ui/util.c
2125         )
2126         add_executable(dftest ${dftest_FILES})
2127         add_dependencies(dftest version)
2128         set_extra_executable_properties(dftest "Tests")
2129         target_link_libraries(dftest ${dftest_LIBS})
2130         install(TARGETS dftest RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2131 endif()
2132
2133 if(BUILD_randpkt)
2134         set(randpkt_LIBS
2135                 randpkt_core
2136                 wiretap
2137                 wsutil
2138                 ${M_LIBRARIES}
2139                 ${PCAP_LIBRARIES}
2140                 ${CARES_LIBRARIES}
2141                 ${ZLIB_LIBRARIES}
2142         )
2143         set(randpkt_FILES
2144                 randpkt.c
2145                 ws_version_info.c
2146         )
2147         add_executable(randpkt ${randpkt_FILES})
2148         add_dependencies(randpkt version)
2149         set_extra_executable_properties(randpkt "Executables")
2150         target_link_libraries(randpkt ${randpkt_LIBS})
2151         install(TARGETS randpkt RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2152 endif()
2153
2154 if(BUILD_text2pcap)
2155         set(text2pcap_LIBS
2156                 writecap
2157                 wsutil
2158                 ${M_LIBRARIES}
2159                 ${ZLIB_LIBRARIES}
2160         )
2161         set(text2pcap_CLEAN_FILES
2162                 text2pcap.c
2163                 ws_version_info.c
2164         )
2165         set(text2pcap_FILES
2166                 ${text2pcap_CLEAN_FILES}
2167                 ${CMAKE_BINARY_DIR}/image/text2pcap.rc
2168         )
2169         add_lex_files(text2pcap_FILES
2170                 text2pcap-scanner.l
2171         )
2172         add_executable(text2pcap ${text2pcap_FILES})
2173         add_dependencies(text2pcap version)
2174         set_extra_executable_properties(text2pcap "Executables")
2175         target_link_libraries(text2pcap ${text2pcap_LIBS})
2176         install(TARGETS text2pcap RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2177 endif()
2178
2179 if(BUILD_mergecap)
2180         set(mergecap_LIBS
2181                 wiretap
2182                 ${ZLIB_LIBRARIES}
2183                 ${CMAKE_DL_LIBS}
2184         )
2185         set(mergecap_FILES
2186                 mergecap.c
2187                 ws_version_info.c
2188                 ${CMAKE_BINARY_DIR}/image/mergecap.rc
2189         )
2190         add_executable(mergecap ${mergecap_FILES})
2191         add_dependencies(mergecap version)
2192         set_extra_executable_properties(mergecap "Executables")
2193         target_link_libraries(mergecap ${mergecap_LIBS})
2194         install(TARGETS mergecap RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2195 endif()
2196
2197 if(BUILD_reordercap)
2198         set(reordercap_LIBS
2199                 wiretap
2200                 ${ZLIB_LIBRARIES}
2201                 ${CMAKE_DL_LIBS}
2202         )
2203         set(reordercap_FILES
2204                 reordercap.c
2205                 ws_version_info.c
2206                 ${CMAKE_BINARY_DIR}/image/reordercap.rc
2207         )
2208         add_executable(reordercap ${reordercap_FILES})
2209         add_dependencies(reordercap version)
2210         set_extra_executable_properties(reordercap "Executables")
2211         target_link_libraries(reordercap ${reordercap_LIBS})
2212         install(TARGETS reordercap RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2213 endif()
2214
2215 if(BUILD_capinfos)
2216         set(capinfos_LIBS
2217                 wiretap
2218                 wsutil
2219                 ${ZLIB_LIBRARIES}
2220                 ${GCRYPT_LIBRARIES}
2221                 ${CMAKE_DL_LIBS}
2222         )
2223         set(capinfos_FILES
2224                 capinfos.c
2225                 ws_version_info.c
2226                 ${CMAKE_BINARY_DIR}/image/capinfos.rc
2227         )
2228         add_executable(capinfos ${capinfos_FILES})
2229         add_dependencies(capinfos version)
2230         set_extra_executable_properties(capinfos "Executables")
2231         target_link_libraries(capinfos ${capinfos_LIBS})
2232         install(TARGETS capinfos RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2233 endif()
2234
2235 if(BUILD_captype)
2236         set(captype_LIBS
2237                 wiretap
2238                 wsutil
2239                 ${ZLIB_LIBRARIES}
2240                 ${CMAKE_DL_LIBS}
2241         )
2242         set(captype_FILES
2243                 captype.c
2244                 ws_version_info.c
2245                 ${CMAKE_BINARY_DIR}/image/captype.rc
2246         )
2247         add_executable(captype ${captype_FILES})
2248         add_dependencies(captype version)
2249         set_extra_executable_properties(captype "Executables")
2250         target_link_libraries(captype ${captype_LIBS})
2251         install(TARGETS captype RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2252 endif()
2253
2254 if(BUILD_editcap)
2255         set(editcap_LIBS
2256                 wiretap
2257                 ${ZLIB_LIBRARIES}
2258                 ${CMAKE_DL_LIBS}
2259         )
2260         set(editcap_FILES
2261                 editcap.c
2262                 ws_version_info.c
2263                 ${CMAKE_BINARY_DIR}/image/editcap.rc
2264         )
2265         add_executable(editcap ${editcap_FILES})
2266         add_dependencies(editcap version)
2267         set_extra_executable_properties(editcap "Executables")
2268         target_link_libraries(editcap ${editcap_LIBS})
2269         install(TARGETS editcap RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2270 endif()
2271
2272 if(BUILD_dumpcap AND PCAP_FOUND)
2273         set(dumpcap_LIBS
2274                 writecap
2275                 wsutil
2276                 caputils
2277                 ${PCAP_LIBRARIES}
2278                 ${CAP_LIBRARIES}
2279                 ${GLIB2_LIBRARIES}
2280                 ${GTHREAD2_LIBRARIES}
2281                 ${ZLIB_LIBRARIES}
2282                 ${APPLE_CORE_FOUNDATION_LIBRARY}
2283                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2284                 ${NL_LIBRARIES}
2285         )
2286         set(dumpcap_FILES
2287                 capture_opts.c
2288                 capture_stop_conditions.c
2289                 conditions.c
2290                 dumpcap.c
2291                 filter_files.c
2292                 ringbuffer.c
2293                 sync_pipe_write.c
2294                 ws_version_info.c
2295                 ${CMAKE_BINARY_DIR}/image/dumpcap.rc
2296         )
2297         add_executable(dumpcap ${dumpcap_FILES})
2298         add_dependencies(dumpcap version)
2299         set_extra_executable_properties(dumpcap "Executables")
2300         target_link_libraries(dumpcap ${dumpcap_LIBS})
2301         install(TARGETS dumpcap
2302                         RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
2303                         PERMISSIONS ${DUMPCAP_SETUID}
2304                                 OWNER_READ OWNER_WRITE OWNER_EXECUTE
2305                                 GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
2306         )
2307         if(DUMPCAP_INSTALL_OPTION STREQUAL "capabilities")
2308                 install( CODE "execute_process(
2309                         COMMAND
2310                                 ${SETCAP_EXECUTABLE}
2311                                 cap_net_raw,cap_net_admin+ep
2312                                 ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/dumpcap${CMAKE_EXECUTABLE_SUFFIX}
2313                         RESULT_VARIABLE
2314                                 _SETCAP_RESULT
2315                         )
2316                         if( _SETCAP_RESULT )
2317                                 message( WARNING \"setcap failed (${_SETCAP_RESULT}).\")
2318                         endif()"
2319                 )
2320         endif()
2321 endif()
2322
2323 if (WIN32)
2324         find_package( MSVC_REDIST )
2325
2326         # Must come after executable targets are defined.
2327         find_package( NSIS )
2328
2329         if (NOT "${MAKENSIS_EXECUTABLE}" STREQUAL "MAKENSIS_EXECUTABLE-NOTFOUND")
2330                 add_subdirectory( packaging/nsis EXCLUDE_FROM_ALL )
2331                 ADD_NSIS_UNINSTALLER_TARGET()
2332                 ADD_NSIS_PACKAGE_TARGET()
2333         endif()
2334
2335         find_package( PortableApps )
2336         if (
2337                 NOT "${PORTABLEAPPS_LAUNCHER_GENERATOR_EXECUTABLE}" STREQUAL "PORTABLEAPPS_LAUNCHER_GENERATOR_EXECUTABLE-NOTFOUND"
2338                 AND
2339                 NOT "${PORTABLEAPPS_INSTALLER_EXECUTABLE}" STREQUAL "PORTABLEAPPS_INSTALLER_EXECUTABLE-NOTFOUND"
2340         )
2341                 add_subdirectory( packaging/portableapps EXCLUDE_FROM_ALL )
2342                 ADD_PORTABLEAPPS_PACKAGE_TARGET()
2343         endif()
2344 endif()
2345
2346 if(ENABLE_EXTCAP AND BUILD_androiddump)
2347         if(EXTCAP_ANDROIDDUMP_LIBPCAP)
2348                 if(HAVE_LIBPCAP)
2349                         set(androiddump_LIBS
2350                                 ${GLIB2_LIBRARIES}
2351                                 ${PCAP_LIBRARIES}
2352                         )
2353                 else()
2354                         message(FATAL_ERROR "You try to build androiddump with libpcap but do not have it")
2355                 endif()
2356         else()
2357                 set(androiddump_LIBS
2358                         wiretap
2359                         ${GLIB2_LIBRARIES}
2360                         ${CMAKE_DL_LIBS}
2361                 )
2362         endif()
2363         set(androiddump_FILES
2364                 extcap/androiddump.c
2365                 extcap/extcap-base.c
2366         )
2367
2368         add_executable(androiddump WIN32 ${androiddump_FILES})
2369         # XXX Shouldn't we add wsutil to androiddump_LIBS instead?
2370         set_extcap_executable_properties(androiddump)
2371         target_link_libraries(androiddump ${androiddump_LIBS})
2372         install(TARGETS androiddump RUNTIME DESTINATION ${EXTCAP_DIR})
2373 endif()
2374
2375 if(ENABLE_EXTCAP AND BUILD_sshdump AND LIBSSH_FOUND)
2376         set(sshdump_LIBS
2377                 wsutil
2378                 ${GLIB2_LIBRARIES}
2379                 ${CMAKE_DL_LIBS}
2380                 ${LIBSSH_LIBRARIES}
2381         )
2382         if (WIN32)
2383                 set(sshdump_LIBS wsutil ${sshdump_LIBS})
2384         endif()
2385         set(sshdump_FILES
2386                 extcap/sshdump.c
2387                 extcap/extcap-base.c
2388                 extcap/ssh-base.c
2389         )
2390
2391         add_executable(sshdump WIN32 ${sshdump_FILES})
2392         set_extcap_executable_properties(sshdump)
2393         target_link_libraries(sshdump ${sshdump_LIBS})
2394         target_include_directories(sshdump PUBLIC ${LIBSSH_INCLUDE_DIR})
2395         install(TARGETS sshdump RUNTIME DESTINATION ${EXTCAP_DIR})
2396 elseif (BUILD_sshdump)
2397         #message( WARNING "Cannot find libssh, cannot build sshdump" )
2398 endif()
2399
2400 if(ENABLE_EXTCAP AND BUILD_ciscodump AND LIBSSH_FOUND)
2401         set(ciscodump_LIBS
2402                 writecap
2403                 wsutil
2404                 ${GLIB2_LIBRARIES}
2405                 ${CMAKE_DL_LIBS}
2406                 ${LIBSSH_LIBRARIES}
2407         )
2408         if (WIN32)
2409                 set(ciscodump_LIBS wsutil ${ciscodump_LIBS})
2410         endif()
2411         set(ciscodump_FILES
2412                 extcap/ciscodump.c
2413                 extcap/extcap-base.c
2414                 extcap/ssh-base.c
2415         )
2416
2417         add_executable(ciscodump WIN32 ${ciscodump_FILES})
2418         set_extcap_executable_properties(ciscodump)
2419         target_link_libraries(ciscodump ${ciscodump_LIBS})
2420         target_include_directories(ciscodump PUBLIC ${LIBSSH_INCLUDE_DIR})
2421         install(TARGETS ciscodump RUNTIME DESTINATION ${EXTCAP_DIR})
2422 elseif (BUILD_ciscodump)
2423         #message( WARNING "Cannot find libssh, cannot build ciscodump" )
2424 endif()
2425
2426 if(ENABLE_EXTCAP AND BUILD_randpktdump)
2427         set(randpktdump_LIBS
2428                 randpkt_core
2429                 wiretap
2430                 ${GLIB2_LIBRARIES}
2431                 ${CMAKE_DL_LIBS}
2432         )
2433         set(randpktdump_FILES
2434                 extcap/extcap-base.c
2435                 extcap/randpktdump.c
2436         )
2437
2438         add_executable(randpktdump WIN32 ${randpktdump_FILES})
2439         # XXX Shouldn't we add wsutil to randpktdump_LIBS instead?
2440         set_extcap_executable_properties(randpktdump)
2441         target_link_libraries(randpktdump ${randpktdump_LIBS})
2442         install(TARGETS randpktdump RUNTIME DESTINATION ${EXTCAP_DIR})
2443 endif()
2444
2445 if(ENABLE_APPLICATION_BUNDLE)
2446         add_custom_target(app_bundle)
2447         set_target_properties(app_bundle PROPERTIES FOLDER "Copy Tasks")
2448         add_custom_command(TARGET app_bundle
2449                 POST_BUILD
2450                 COMMAND "${CMAKE_SOURCE_DIR}/packaging/macosx/osx-app.sh"
2451                 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/run"
2452         )
2453         add_dependencies(app_bundle ${PROGLIST})
2454
2455         add_custom_target(dmg_package_prep DEPENDS app_bundle)
2456
2457         ADD_CUSTOM_COMMAND(
2458                 OUTPUT ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo
2459                 COMMAND ${CMAKE_COMMAND} -E echo APPLWshk > ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo
2460         )
2461
2462         ADD_CUSTOM_TARGET( dmg_package
2463                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2464                                         "${PROJECT_SOURCE_DIR}/ipmap.html"
2465                                         $<TARGET_FILE_DIR:wireshark>
2466                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2467                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF
2468                                         ${CMAKE_BINARY_DIR}/run/ChmodBPF
2469                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2470                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/Resources
2471                                         ${CMAKE_BINARY_DIR}/run/Resources
2472                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2473                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/Scripts
2474                                         ${CMAKE_BINARY_DIR}/run/Scripts
2475                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2476                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/utility-launcher
2477                                         ${CMAKE_BINARY_DIR}/run/utility-launcher
2478                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2479                                         ${CMAKE_SOURCE_DIR}/COPYING
2480                                         ${CMAKE_BINARY_DIR}/run/COPYING.txt
2481                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2482                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/Wireshark_package.pmdoc
2483                                         ${CMAKE_BINARY_DIR}/run/Wireshark_package.pmdoc
2484                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2485                                         ${CMAKE_BINARY_DIR}/packaging/macosx/Wireshark_package.pmdoc/index.xml
2486                                         ${CMAKE_BINARY_DIR}/run/Wireshark_package.pmdoc/index.xml
2487                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2488                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/dmg_background.png
2489                                         ${CMAKE_BINARY_DIR}/run/dmg_background.png
2490                 COMMAND bash -x ${CMAKE_BINARY_DIR}/packaging/macosx/osx-dmg.sh
2491                         --source-directory ${CMAKE_SOURCE_DIR}/packaging/macosx
2492                 # Unlike nsis_package_prep + nsis_package, we can add a direct
2493                 # dependency here.
2494                 DEPENDS dmg_package_prep
2495                 # We create Wireshark.app in "run". Do our work there.
2496                 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/run
2497         )
2498
2499 endif()
2500
2501 set(CLEAN_FILES
2502         ${wireshark_FILES}
2503         ${tshark_FILES}
2504         ${rawshark_FILES}
2505         ${dftest_FILES}
2506         ${randpkt_FILES}
2507         ${randpktdump_FILES}
2508         ${text2pcap_CLEAN_FILES}
2509         ${mergecap_FILES}
2510         ${capinfos_FILES}
2511         ${captype_FILES}
2512         ${editcap_FILES}
2513         ${dumpcap_FILES}
2514         ${androiddump_FILES}
2515         ${sshdump_FILES}
2516         ${ciscodump_FILES}
2517 )
2518
2519 if (WERROR_COMMON_FLAGS)
2520         set_source_files_properties(
2521                 ${CLEAN_FILES}
2522                 PROPERTIES
2523                 COMPILE_FLAGS ${WERROR_COMMON_FLAGS}
2524         )
2525 endif()
2526
2527 install(
2528         FILES
2529                 ${INSTALL_FILES}
2530         DESTINATION
2531                 ${CMAKE_INSTALL_DATADIR}/${CPACK_PACKAGE_NAME}
2532 )
2533
2534 install(
2535         FILES
2536                 "${CMAKE_BINARY_DIR}/wireshark.pc"
2537         DESTINATION
2538                 ${CMAKE_INSTALL_LIBDIR}/pkgconfig
2539 )
2540
2541 install(
2542         DIRECTORY
2543                 ${INSTALL_DIRS}
2544         DIRECTORY_PERMISSIONS
2545                 OWNER_EXECUTE OWNER_WRITE OWNER_READ
2546                 GROUP_EXECUTE GROUP_READ
2547                 WORLD_EXECUTE WORLD_READ
2548         DESTINATION
2549                 ${CMAKE_INSTALL_DATADIR}/${CPACK_PACKAGE_NAME}
2550         PATTERN ".git" EXCLUDE
2551         PATTERN ".svn" EXCLUDE
2552         PATTERN "Makefile.*" EXCLUDE
2553         PATTERN "faq.py" EXCLUDE
2554 )
2555
2556 include( UseCheckAPI )
2557 CHECKAPI(
2558         ${TSHARK_TAP_SRC}
2559         ${WIRESHARK_SRC}
2560 )
2561
2562 set(CMAKE_INSTALL_MODULES_DIR ${CMAKE_INSTALL_LIBDIR}/${CPACK_PACKAGE_NAME})
2563 configure_file("${CMAKE_MODULE_PATH}/WiresharkConfig.cmake.in" "${CMAKE_BINARY_DIR}/WiresharkConfig.cmake" @ONLY)
2564 configure_file("${CMAKE_MODULE_PATH}/WiresharkConfigVersion.cmake.in" "${CMAKE_BINARY_DIR}/WiresharkConfigVersion.cmake" @ONLY)
2565 install(
2566         FILES
2567                 ${CMAKE_MODULE_PATH}/FindGLIB2.cmake
2568                 ${CMAKE_MODULE_PATH}/FindWireshark.cmake
2569                 ${CMAKE_MODULE_PATH}/FindWSWinLibs.cmake
2570                 ${CMAKE_MODULE_PATH}/UseAsn2Wrs.cmake
2571                 ${CMAKE_MODULE_PATH}/LocatePythonModule.cmake
2572                 ${CMAKE_MODULE_PATH}/UseMakeDissectorReg.cmake
2573                 ${CMAKE_BINARY_DIR}/WiresharkConfig.cmake
2574                 ${CMAKE_BINARY_DIR}/WiresharkConfigVersion.cmake
2575         DESTINATION
2576                 ${CMAKE_INSTALL_MODULES_DIR}
2577 )
2578
2579 if(DOC_DIR)
2580         message(STATUS "Docdir install: ${DOC_DIR}")
2581         INSTALL(
2582                 DIRECTORY
2583                         ${CMAKE_BINARY_DIR}/docbook/
2584                 DIRECTORY_PERMISSIONS
2585                         OWNER_EXECUTE OWNER_WRITE OWNER_READ
2586                         GROUP_EXECUTE GROUP_READ
2587                         WORLD_EXECUTE WORLD_READ
2588                 DESTINATION
2589                         ${DOC_DIR}/guides
2590                 FILES_MATCHING
2591                 PATTERN "*.pdf"
2592         )
2593 endif()
2594
2595 # Test suite wrapper
2596 if(ENABLE_APPLICATION_BUNDLE)
2597         set(TEST_SH_BIN_DIR ${CMAKE_BINARY_DIR}/run)
2598 else()
2599         set(TEST_SH_BIN_DIR $<TARGET_FILE_DIR:epan>)
2600 endif()
2601
2602 add_custom_target(test-sh
2603         COMMAND ${CMAKE_COMMAND}
2604                 -DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}
2605                 -DTEST_SH_BIN_DIR=${TEST_SH_BIN_DIR}
2606                 -DTEST_SH_SRC_DIR=${CMAKE_SOURCE_DIR}/test
2607                 -P ${CMAKE_SOURCE_DIR}/cmake/modules/GenerateTestSh.cmake
2608         DEPENDS ${CMAKE_SOURCE_DIR}/cmake/modules/GenerateTestSh.cmake
2609 )
2610 set_target_properties(test-sh PROPERTIES FOLDER "Tests")
2611
2612 if (GIT_EXECUTABLE)
2613         # Update AUTHORS file with entries from git shortlog
2614         add_custom_target(
2615                 gen-authors
2616                 COMMAND ${PERL_EXECUTABLE} tools/generate_authors.pl AUTHORS.src > AUTHORS
2617                 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
2618         )
2619 else (GIT_EXECUTABLE)
2620         add_custom_target( gen-authors COMMAND ${CMAKE_COMMAND} -E echo "Git not found." )
2621 endif (GIT_EXECUTABLE)
2622 set_target_properties(gen-authors PROPERTIES FOLDER "Docs")
2623
2624 add_custom_target(test-programs
2625         DEPENDS test-sh
2626                 exntest
2627                 oids_test
2628                 reassemble_test
2629                 tvbtest
2630                 wmem_test
2631         COMMENT "Building unit test programs and wrapper"
2632 )
2633 set_target_properties(test-programs PROPERTIES FOLDER "Tests")
2634
2635 if (WIN32)
2636         file (TO_NATIVE_PATH ${CMAKE_SOURCE_DIR}/tools/Get-HardenFlags.ps1 _win_harden_flags)
2637         add_custom_target(hardening-check
2638                 COMMAND ${POWERSHELL_COMMAND} "${_win_harden_flags}" "${_dll_output_dir_win}"
2639                 DEPENDS ${PROGLIST}
2640                 COMMENT "Checking binaries for security features"
2641         )
2642         set_target_properties(hardening-check PROPERTIES FOLDER "Tests")
2643 else ()
2644         find_program(HARDENING_CHECK_EXECUTABLE hardening-check
2645                 DOC "Path to the hardening-check utility."
2646         )
2647         if (NOT "${HARDENING_CHECK_EXECUTABLE}" STREQUAL "HARDENING_CHECK_EXECUTABLE-NOTFOUND")
2648                 foreach(_prog ${PROGLIST})
2649                         get_target_property(_prog_dir ${_prog} RUNTIME_OUTPUT_DIRECTORY)
2650                         if ("${_prog_dir}" STREQUAL "_prog_dir-NOTFOUND")
2651                                 set(_prog_dir "${CMAKE_BINARY_DIR}/run")
2652                         endif()
2653                         set(_prog_paths ${_prog_paths} "${_prog_dir}/${_prog}")
2654                 endforeach()
2655                 add_custom_target(hardening-check
2656                         COMMAND ${HARDENING_CHECK_EXECUTABLE} ${_prog_paths}
2657                         DEPENDS ${PROGLIST}
2658                         COMMENT "Checking binaries for security features"
2659                 )
2660         endif()
2661 endif()
2662
2663 #
2664 # Editor modelines  -  http://www.wireshark.org/tools/modelines.html
2665 #
2666 # Local variables:
2667 # c-basic-offset: 8
2668 # tab-width: 8
2669 # indent-tabs-mode: t
2670 # End:
2671 #
2672 # vi: set shiftwidth=8 tabstop=8 noexpandtab:
2673 # :indentSize=8:tabSize=8:noTabs=false:
2674 #