CMake: Pretty print PACKAGELIST
[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 # Updated by make-version.pl
25 set(GIT_REVISION 0)
26 set(PROJECT_MAJOR_VERSION 2)
27 set(PROJECT_MINOR_VERSION 5)
28 set(PROJECT_PATCH_VERSION 0)
29 set(PROJECT_BUILD_VERSION ${GIT_REVISION})
30 set(PROJECT_VERSION_EXTENSION "")
31
32 if(DEFINED ENV{WIRESHARK_VERSION_EXTRA})
33         set(PROJECT_VERSION_EXTENSION "$ENV{WIRESHARK_VERSION_EXTRA}")
34 endif()
35
36 set(PROJECT_VERSION "${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}.${PROJECT_PATCH_VERSION}${PROJECT_VERSION_EXTENSION}")
37
38 # packaging information
39 if(WIN32)
40         set(CPACK_PACKAGE_NAME Wireshark)
41 else()
42         set(CPACK_PACKAGE_NAME wireshark)
43 endif()
44
45 set(CPACK_PACKAGE_VERSION "${PROJECT_VERSION}")
46
47 message(STATUS "Generating build using CMake ${CMAKE_VERSION}")
48 if(WIN32)
49         # Needed for GREATER_EQUAL operator
50         cmake_minimum_required(VERSION 3.7)
51 else()
52         cmake_minimum_required(VERSION 2.8.8)
53 endif()
54
55 # Needs to be set after cmake_minimum_required or cmake_policy(VERSION)
56 # Policy since 2.6.1
57 cmake_policy(SET CMP0008 NEW)
58 # Policy since 2.6.3
59 # Backward compatibility for versions < 2.6.3
60 cmake_policy(SET CMP0011 OLD)
61 # Policy since 2.8.1
62 cmake_policy(SET CMP0015 NEW)
63
64 #Where to find local cmake scripts
65 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
66
67 # Set old behaviour for LOCATION property
68 if (POLICY CMP0026)
69         cmake_policy(SET CMP0026 OLD)
70 endif()
71
72 # Set old behaviour for variable quoting
73 if (POLICY CMP0054)
74         cmake_policy(SET CMP0054 OLD)
75 endif()
76
77 # Set old behaviour for MACOSX_RPATH
78 if (POLICY CMP0042)
79         cmake_policy(SET CMP0042 OLD)
80 endif()
81
82 # If our target platform is enforced by our generator, set
83 # WIRESHARK_TARGET_PLATFORM accordingly. Otherwise use
84 # %WIRESHARK_TARGET_PLATFORM%.
85
86 if(WIN32)
87         find_package(PowerShell REQUIRED)
88
89         if(${CMAKE_CL_64} OR "${CMAKE_GENERATOR}" MATCHES "Win64")
90                 set(WIRESHARK_TARGET_PLATFORM win64)
91         elseif("${CMAKE_GENERATOR}" MATCHES "Visual Studio")
92                 set(WIRESHARK_TARGET_PLATFORM win32)
93         else()
94                 set(WIRESHARK_TARGET_PLATFORM $ENV{WIRESHARK_TARGET_PLATFORM})
95         endif()
96
97         if ("${WIRESHARK_TARGET_PLATFORM}" MATCHES "win64")
98                 set(PROCESSOR_ARCHITECTURE amd64)
99         else()
100                 set(PROCESSOR_ARCHITECTURE x86)
101         endif()
102
103         # Sanity check
104         if(DEFINED ENV{PLATFORM})
105                 string(TOLOWER $ENV{PLATFORM} _vs_platform)
106         else()
107                 set(_vs_platform "[undefined]") # x86
108         endif()
109         if(
110                 (_vs_platform STREQUAL "x64" AND NOT WIRESHARK_TARGET_PLATFORM STREQUAL "win64")
111                 OR
112                 (_vs_platform STREQUAL "[undefined]" AND NOT WIRESHARK_TARGET_PLATFORM STREQUAL "win32")
113         )
114                 message(FATAL_ERROR "The PLATFORM environment variable (${_vs_platform})"
115                         " doesn't match the generator platform (${WIRESHARK_TARGET_PLATFORM})")
116         endif()
117         message(STATUS "Building for ${WIRESHARK_TARGET_PLATFORM} using ${CMAKE_GENERATOR}")
118
119         # Determine where the 3rd party libraries will be
120         if( DEFINED ENV{WIRESHARK_LIB_DIR} )
121                 # The buildbots set WIRESHARK_LIB_DIR but not WIRESHARK_BASE_DIR.
122                 file( TO_CMAKE_PATH "$ENV{WIRESHARK_LIB_DIR}" _PROJECT_LIB_DIR )
123         elseif( DEFINED ENV{WIRESHARK_BASE_DIR} )
124                 file( TO_CMAKE_PATH "$ENV{WIRESHARK_BASE_DIR}" _WS_BASE_DIR )
125                 set( _PROJECT_LIB_DIR "${_WS_BASE_DIR}/wireshark-${WIRESHARK_TARGET_PLATFORM}-libs" )
126         else()
127                 # Don't know what to do
128                 message(FATAL_ERROR "Neither WIRESHARK_BASE_DIR or WIRESHARK_LIB_DIR are defined")
129         endif()
130
131         # Download third-party libraries
132         file (TO_NATIVE_PATH ${CMAKE_SOURCE_DIR}/tools/win-setup.ps1 _win_setup)
133         file (TO_NATIVE_PATH ${_PROJECT_LIB_DIR} _ws_lib_dir)
134         if(MSVC14)
135                 set(_vsversion_args "14")
136         elseif(MSVC12)
137                 set(_vsversion_args "12")
138         elseif(MSVC11)
139                 set(_vsversion_args "11")
140         elseif(MSVC10)
141                 set(_vsversion_args "10")
142         else()
143                 message(FATAL_ERROR "Unsupported compiler ${CMAKE_C_COMPILER}")
144         endif()
145
146         # Is it possible to have a one-time, non-cached option in CMake? If
147         # so, we could add a "-DFORCE_WIN_SETUP" which passes -Force to
148         # win-setup.ps1.
149         execute_process(
150                 COMMAND ${POWERSHELL_COMMAND} "\"${_win_setup}\"" -Destination "${_ws_lib_dir}" -Platform ${WIRESHARK_TARGET_PLATFORM} -VSVersion ${_vsversion_args}
151                 RESULT_VARIABLE _win_setup_failed
152         )
153         if (${_win_setup_failed})
154                 message(FATAL_ERROR "Windows setup (win-setup.ps1) failed.")
155         endif()
156
157         # XXX Add a dependency on ${_ws_lib_dir}/current_tag.txt?
158
159         # Head off any attempts to use Cygwin's Python.
160         include(LocatePythonExecutable)
161 endif(WIN32)
162
163 include(UseCustomIncludes)
164 ADD_CUSTOM_CMAKE_INCLUDE()
165
166 # This cannot be implemented via option(...)
167 if( NOT CMAKE_BUILD_TYPE )
168         set( CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
169                 "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
170                 FORCE)
171 endif()
172 message(STATUS "Configuration types: ${CMAKE_CONFIGURATION_TYPES}")
173 string(TOUPPER "${CMAKE_BUILD_TYPE}" _build_type)
174 message(STATUS "CMAKE_C_FLAGS_${_build_type}: ${CMAKE_C_FLAGS_${_build_type}}")
175 message(STATUS "CMAKE_CXX_FLAGS_${_build_type}: ${CMAKE_CXX_FLAGS_${_build_type}}")
176
177 # Where to put executables and libraries in the build tree
178 # Note: Executables and libraries might end end up in a configuration
179 # subdirectory, e.g. run/Debug or run/Release. We try to set DATAFILE_DIR
180 # to a corresponding value below.
181 if(NOT ARCHIVE_OUTPUT_PATH)
182         set(ARCHIVE_OUTPUT_PATH ${Wireshark_BINARY_DIR}/run CACHE INTERNAL
183                    "Single output directory for building all archives.")
184 endif()
185 if(NOT EXECUTABLE_OUTPUT_PATH)
186         set(EXECUTABLE_OUTPUT_PATH ${Wireshark_BINARY_DIR}/run CACHE INTERNAL
187                    "Single output directory for building all executables.")
188 endif()
189 if(NOT LIBRARY_OUTPUT_PATH)
190         set(LIBRARY_OUTPUT_PATH ${Wireshark_BINARY_DIR}/run CACHE INTERNAL
191                    "Single output directory for building all libraries.")
192 endif()
193
194 #
195 # The release mode (CMAKE_BUILD_TYPE=release) defines NDEBUG for
196 # the Unix Makefile generator.
197 #
198
199 #Defines CMAKE_INSTALL_BINDIR, CMAKE_INSTALL_DATADIR, etc ...
200 include(GNUInstallDirs)
201 # Make sure our executables can can load our libraries if we install into
202 # a non-default directory on Unix-like systems other than macOS.
203 # https://cmake.org/Wiki/CMake_RPATH_handling
204 if(NOT CMAKE_INSTALL_RPATH AND NOT (WIN32 OR APPLE))
205         LIST(FIND CMAKE_C_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_FULL_LIBDIR}" IS_SYSTEM_DIR)
206         if("${IS_SYSTEM_DIR}" STREQUAL "-1")
207                 SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}")
208                 SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
209         endif("${IS_SYSTEM_DIR}" STREQUAL "-1")
210 endif()
211
212 # Banner shown at top right of Qt welcome screen.
213 if(DEFINED ENV{WIRESHARK_VERSION_FLAVOR})
214         set(VERSION_FLAVOR "$ENV{WIRESHARK_VERSION_FLAVOR}")
215 else()
216         set(VERSION_FLAVOR "Development Build")
217 endif()
218
219 # These are required in .rc files and manifests
220 set(VERSION_MAJOR ${PROJECT_MAJOR_VERSION})
221 set(VERSION_MINOR ${PROJECT_MINOR_VERSION})
222 set(VERSION_MICRO ${PROJECT_PATCH_VERSION})
223 set(VERSION_BUILD ${PROJECT_BUILD_VERSION})
224 set(RC_VERSION ${PROJECT_MAJOR_VERSION},${PROJECT_MINOR_VERSION},${PROJECT_PATCH_VERSION},${PROJECT_BUILD_VERSION})
225
226 message(STATUS "V: ${PROJECT_VERSION}, MaV: ${PROJECT_MAJOR_VERSION}, MiV: ${PROJECT_MINOR_VERSION}, PL: ${PROJECT_PATCH_VERSION}, EV: ${PROJECT_VERSION_EXTENSION}.")
227
228 include(UseLemon)
229 include(UseMakeDissectorReg)
230 include(UseMakeTapReg)
231 include(UseAsn2Wrs)
232
233 # The following snippet has been taken from
234 # https://github.com/USESystemEngineeringBV/cmake-eclipse-helper/wiki/HowToWorkaroundIndexer
235 # The eclipse indexer otherwise assumes __cplusplus=199711L which will lead to broken
236 # lookup tables for the epan libraries
237 # Check if CXX flags have been set to c++11 -> Setup Eclipse Indexer correctly!
238 # Also setup the project slightly different
239 if (${CMAKE_EXTRA_GENERATOR} MATCHES "Eclipse CDT4" )
240         SET(CXX_ENABLED 0)
241         LIST(LENGTH CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS LIST_LEN)
242         if ( ${LIST_LEN} GREATER 0 )
243                 SET(CXX_ENABLED 1)
244         endif()
245         SET(C_ENABLED 0)
246         LIST(LENGTH CMAKE_EXTRA_GENERATOR_C_SYSTEM_DEFINED_MACROS LIST_LEN)
247         if ( ${LIST_LEN} GREATER 0)
248                 SET(C_ENABLED 1)
249         endif()
250         if (${C_ENABLED} EQUAL 1 AND ${CXX_ENABLED} EQUAL 1)
251                 # Combined project (C and CXX). This will confuse the indexer. For that reason
252                 # we unsert set the __cplusplus variable for the indexer
253                 list(FIND CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS "__cplusplus" GEN_MACRO_INDEX)
254                 if( ${GEN_MACRO_INDEX} GREATER -1 )
255                         list(REMOVE_AT CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS ${GEN_MACRO_INDEX})
256                         list(REMOVE_AT CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS ${GEN_MACRO_INDEX})
257                 endif()
258                 SET(CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS ${CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS} CACHE INTERNAL "")
259         elseif ( (${CXX_ENABLED} EQUAL 1) AND (${CMAKE_CXX_FLAGS} MATCHES ".*-std=c\\+\\+11.*"))
260                 #add_definitions (-D__cplusplus=201103L)
261                 # CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS
262                 list(FIND CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS "199711L" GEN_MACRO_INDEX)
263                 if( ${GEN_MACRO_INDEX} GREATER -1 )
264                         list(REMOVE_AT CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS ${GEN_MACRO_INDEX})
265                         list(INSERT CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS ${GEN_MACRO_INDEX} "201103L")
266                         SET(CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS ${CMAKE_EXTRA_GENERATOR_CXX_SYSTEM_DEFINED_MACROS} CACHE INTERNAL "")
267                 endif()
268         endif()
269 endif()
270
271 include_directories(
272         ${CMAKE_BINARY_DIR}
273         ${CMAKE_SOURCE_DIR}
274         ${CMAKE_SOURCE_DIR}/epan
275         ${CMAKE_SOURCE_DIR}/tools/lemon
276 )
277
278 include( CMakeOptions.txt )
279 if( DUMPCAP_INSTALL_OPTION STREQUAL "suid" )
280         set( DUMPCAP_SETUID "SETUID" )
281 else()
282         set( DUMPCAP_SETUID )
283 endif()
284 if( NOT CMAKE_SYSTEM_NAME STREQUAL "Linux" AND
285         DUMPCAP_INSTALL_OPTION STREQUAL "capabilities" )
286         message( WARNING "Capabilities are only supported on Linux" )
287         set( DUMPCAP_INSTALL_OPTION )
288 endif()
289
290 if(APPLE AND EXISTS /usr/local/opt/qt5)
291         # Homebrew installs Qt5 (up to at least 5.9.1) in
292         # /usr/local/qt5, ensure it can be found by CMake since
293         # it is not in the default /usr/local prefix.
294         list(APPEND CMAKE_PREFIX_PATH "/usr/local/opt/qt5")
295 endif()
296
297 # Always enable position-independent code when compiling, even for
298 # executables, so you can build position-independent executables.
299 # -pie is added below for non-MSVC.
300 # Needed when either:
301 # - Qt5_POSITION_INDEPENDENT_CODE is set and CMake < 2.8.11
302 # - PIE is wanted (-pie) and you want to add -fPIC/-fPIE automatically.
303 # This option only has an effect on CMake >= 2.8.9
304 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
305
306 if( CMAKE_C_COMPILER_ID MATCHES "MSVC")
307         if (MSVC10)
308                 set(MSC_VER_REQUIRED 1600)
309         elseif(MSVC11)
310                 set(MSC_VER_REQUIRED 1700)
311         elseif(MSVC12)
312                 set(MSC_VER_REQUIRED 1800)
313         elseif(MSVC14)
314                 set(MSC_VER_REQUIRED 1900)
315         else()
316                 message(FATAL_ERROR "You are using an unsupported version of MSVC")
317         endif()
318
319         add_definitions(
320                 /DWIN32_LEAN_AND_MEAN
321                 "/DMSC_VER_REQUIRED=${MSC_VER_REQUIRED}"
322                 /D_CRT_SECURE_NO_DEPRECATE
323                 # NOMINMAX keeps windows.h from defining "min" and "max" via windef.h.
324                 # This avoids conflicts with the C++ standard library.
325                 /DNOMINMAX
326                 # -DPSAPI_VERSION=1                 Programs that must run on earlier versions of Windows as well as Windows 7 and later
327                 #                                   versions should always call this function as GetProcessMemoryInfo. To ensure correct
328                 #                                   resolution of symbols, add Psapi.lib to the TARGETLIBS macro and compile the program
329                 #                                   with -DPSAPI_VERSION=1.To use run-time dynamic linking, load Psapi.dll.
330                 #                                   http://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx
331                 # -DBUILD_WINDOWS                   Starting from VS2013, GetVersionEx is deprecated and we are recommended to use
332                 #                                   VerifyVersionInfo instead
333                 #                                   http://msdn.microsoft.com/en-us/library/windows/desktop/ms724429(v=vs.85).aspx
334                 #                                   http://msdn.microsoft.com/en-us/library/windows/desktop/ms725491(v=vs.85).aspx
335                 #                                   To continue to use GetVersionEx, we can define BUILD_WINDOWS
336                 # -D_ALLOW_KEYWORD_MACROS           For VS2012 onwards the, C++ STL does not permit macro redefinitions of keywords
337                 #                                   (see http://msdn.microsoft.com/en-us/library/bb531344(v=vs.110).aspx)
338                 #                                   This definition prevents the complaint about the redefinition of inline by WinPCap
339                 #                                   in pcap-stdinc.h when compiling C++ files, e.g. the Qt UI
340                 /DPSAPI_VERSION=1
341                 /DBUILD_WINDOWS
342                 /D_ALLOW_KEYWORD_MACROS
343         )
344
345         if(NOT "${WIRESHARK_TARGET_PLATFORM}" STREQUAL "win64")
346                 add_definitions("/D_BIND_TO_CURRENT_CRT_VERSION=1")
347         endif()
348
349         # FIXME: WINPCAP_VERSION cannot be determined from source or executable.
350         set(WINPCAP_VERSION "4_1_3")
351         add_definitions("/DWINPCAP_VERSION=${WINPCAP_VERSION}")
352
353         set(LOCAL_CFLAGS
354                 /MP
355         )
356
357         if(MSVC12)
358                 # /Zo                               Enhanced debugging of optimised code for VS2013 Update 3 and beyond,
359                 #                                   Assume all VS2013 builds are at least Update 3.
360                 #                                   See http://msdn.microsoft.com/en-us/library/dn785163.aspx
361                 set(LOCAL_CFLAGS ${LOCAL_CFLAGS} "/Zo")
362         elseif(MSVC14)
363                 # /Zo                               Enhanced debugging of optimised code
364                 # /utf-8                            Set Source and Executable character sets to UTF-8
365                 #                                   VS2015(MSVC14): On by default when /Zi or /Z7 used.
366                 set(LOCAL_CFLAGS ${LOCAL_CFLAGS} "/Zo" "/utf-8")
367         endif()
368
369         if(ENABLE_CODE_ANALYSIS)
370                 set(LOCAL_CFLAGS ${LOCAL_CFLAGS} "/analyze:WX-")
371         endif()
372
373         # Additional compiler warnings to be treated as "Level 3"
374         #  when compiling Wireshark sources. (Selected from "level 4" warnings).
375         ## 4295: array is too small to include a terminating null character
376         ## 4189: local variable is initialized but not referenced
377         # Disable warnings about about use of flexible array members:
378         ## 4200: nonstandard extension used : zero-sized array in struct/union
379         set(WARNINGS_CFLAGS "/w34295 /w34189 /wd4200")
380
381         set(WIRESHARK_COMMON_FLAGS
382                 ${LOCAL_CFLAGS}
383                 ${WARNINGS_CFLAGS}
384         )
385
386         set(WS_LINK_FLAGS "/LARGEADDRESSAWARE /MANIFEST:NO /INCREMENTAL:NO /RELEASE")
387
388 else()
389         if(CMAKE_OSX_DEPLOYMENT_TARGET)
390                 if(APPLE)
391                         if(${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.0")
392                                 message(FATAL_ERROR "We don't support building for Mac OS X 10.0")
393                         elseif(${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.1")
394                                 message(FATAL_ERROR "We don't support building for Mac OS X 10.1")
395                         elseif(${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.2")
396                                 message(FATAL_ERROR "We don't support building for Mac OS X 10.2")
397                         elseif(${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.4" OR ${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.5")
398                                 #
399                                 # Only 32-bit builds are supported.  10.5
400                                 # (and 10.4?) had a bug that causes some BPF
401                                 # functions not to work with 64-bit userland
402                                 # code, so capturing won't work.
403                                 #
404                                 set(CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}")
405                                 set(CMAKE_CXX_FLAGS "-m32 ${CMAKE_CXX_FLAGS}")
406                                 set(WS_LINK_FLAGS "-m32 ${WS_LINK_FLAGS}")
407                         endif()
408                         message(STATUS "Building for Mac OS X/OS X/macOS ${CMAKE_OSX_DEPLOYMENT_TARGET}")
409                 else()
410                         message(FATAL_ERROR "CMAKE_OSX_DEPLOYMENT_TARGET only applies when building for macOS")
411                 endif()
412         endif()
413
414         if(CMAKE_VERSION VERSION_LESS "3.1")
415                 # Many modern compilers use c99 by default, but for older ones
416                 # (like GCC 4.4.7), -std=gnu99 is required to avoid errors about
417                 # use constructs like "for (int i = 0; i < n; i++) ;"
418                 #
419                 # Older versions of IBM XL C may require -qlanglvl=extc99.
420                 # With V7.0, the "xlc" command defaults to C89; with 10.1,
421                 # it defaults to C99 (both with IBM syntax extensions).
422                 #
423                 # HP's manual for HP C/HP-UX B.11.11.04 (the tenth
424                 # edition of the manual), for PA-RISC, "documents
425                 # new HP C features that support C99 industry standards".
426                 # The manual for Version A.06.25 for Itanium mentions an
427                 # -AC99 flag to support C99, but says it's the default;
428                 # some older versions might require -AC99.
429                 #
430                 # As of Sun Studio 8, the compiler appears to default
431                 # to supporting some C99 language features, but not
432                 # C99 library differences from C89; -xc99 will give
433                 # you both.  The earlier Sun Forte Developer 6 update 2
434                 # might or might not support thosee C99 language features
435                 # by default, and doesn't speak of library differences;
436                 # if it doesn't support the language features by default,
437                 # -xc99 will support them.
438                 #
439                 if(CMAKE_C_COMPILER_ID MATCHES "GNU")
440                         set(CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")
441                 endif()
442         else()
443                 #
444                 # Current versions of CMake do not support options to
445                 # request C99 for XL C, HP C, or Oracle C.  (They may
446                 # not be necessary for current versions.)
447                 #
448                 set(CMAKE_C_STANDARD 99)
449         endif()
450
451         if(CMAKE_C_COMPILER_ID MATCHES "Clang")
452                 set(WIRESHARK_COMMON_FLAGS ${WIRESHARK_COMMON_FLAGS}
453                         # avoid "argument unused during compilation" warnings
454                         # (for example, when getting the -gsplit-dwarf option or
455                         # when combining -fwrapv with -fno-strict-overflow)
456                         -Qunused-arguments
457                 )
458         else()
459                 set(WIRESHARK_COMMON_FLAGS ${WIRESHARK_COMMON_FLAGS}
460                         -fexcess-precision=fast
461                 )
462         endif()
463
464         set(COMMON_WARN_FLAGS
465                 # The following are for C and C++
466                 # -O<X> and -g get set by the CMAKE_BUILD_TYPE
467                 -Wall
468                 -Wextra
469                 -Wendif-labels
470                 -Wpointer-arith
471                 -Wformat-security
472                 -fwrapv
473                 -fno-strict-overflow
474                 -Wvla
475                 -Waddress
476                 -Wattributes
477                 -Wdiv-by-zero
478                 -Wignored-qualifiers
479                 -Wpragmas
480                 -Wno-overlength-strings
481                 -Wno-long-long
482                 -Wheader-guard
483                 -Wcomma
484         )
485
486         #
487         # Code that may be worth looking into (coding practices)
488         #
489         if((NOT ENABLE_ASAN) AND (NOT ENABLE_UBSAN) AND (NOT DISABLE_FRAME_LARGER_THAN_WARNING))
490                 #
491                 # Only do this if neither ASan nor UBSan are
492                 # enabled; the instrumentation they add increases
493                 # the stack usage - we only care about stack
494                 # usage in normal operation.
495                 #
496                 set(COMMON_WARN_FLAGS ${COMMON_WARN_FLAGS}
497                         -Wframe-larger-than=16384
498                 )
499         endif()
500
501         set(C_WARN_FLAGS
502                 # The following are C only, not C++
503                 -Wc++-compat
504                 -Wunused-const-variable
505                 #
506                 # XXX - some versions of GCC, including the one in at
507                 # least some Xcode versions that come with Mac OS X
508                 # 10.5, complain about variables in function and
509                 # function pointer *declarations* shadowing other
510                 # variables.  The autoconf script checks for that; we
511                 # don't.
512                 -Wshadow
513                 -Wno-pointer-sign
514                 -Wold-style-definition
515                 -Wstrict-prototypes
516                 #
517                 # Some versions of GCC, such as 4.3.2 and 4.4.5,
518                 # generate logical-op warnings when strchr() is given a
519                 # constant string.  The autoconf script checks for that;
520                 # we don't.
521                 #
522                 -Wlogical-op
523                 -Wjump-misses-init
524                 #
525                 # The Qt headers generate a ton of shortening warnings
526                 # on 64-bit systems, so we only enable this for C for
527                 # now.
528                 #
529                 -Wshorten-64-to-32
530                 #
531                 # Implicit function declarations are an error in C++ and most
532                 # likely a programming error in C. Turn -Wimplicit-int and
533                 # -Wimplicit-function-declaration into an error by default.
534                 #
535                 -Werror=implicit
536         )
537
538         set(CXX_WARN_FLAGS
539         )
540
541         find_package(Qt5Core)  # Needed to check for Qt version
542         if (Qt5Core_VERSION VERSION_GREATER 5.8)
543                 # The Qt headers in version 5.8 and older generate a ton of shortening
544                 # errors on 64-bit systems so only enable this for version 5.9 and greater.
545                 set(CXX_WARN_FLAGS ${CXX_WARN_FLAGS}
546                         -Wshorten-64-to-32
547                 )
548         endif()
549
550         #
551         # These are not enabled by default, because the warnings they
552         # produce are very hard or impossible to eliminate.
553         #
554         set(COMMON_EXTRA_WARN_FLAGS
555                 # The following are for C and C++
556                 -Wpedantic
557                 #
558                 # As we use variadic macros, we don't want warnings
559                 # about them, even with -Wpedantic.
560                 #
561                 -Wno-variadic-macros
562                 #
563                 # Various code blocks this one.
564                 #
565                 -Woverflow
566                 -fstrict-overflow -Wstrict-overflow=4
567                 #
568                 # Due to various places where APIs we don't control
569                 # require us to cast away constness, we can probably
570                 # never enable this one with -Werror.
571                 #
572                 -Wcast-qual
573                 #
574                 # Some generated ASN.1 dissectors block this one;
575                 # multiple function declarations for the same
576                 # function are being generated.
577                 #
578                 -Wredundant-decls
579                 #
580                 # Some loops are safe, but it's hard to convince the
581                 # compiler of that.
582                 #
583                 -Wunsafe-loop-optimizations
584                 #
585                 # All the registration functions block these for now.
586                 #
587                 -Wmissing-prototypes
588                 -Wmissing-declarations
589                 #
590                 # A bunch of "that might not work on SPARC" code blocks
591                 # this one for now; some of it is code that *will* work
592                 # on SPARC, such as casts of "struct sockaddr *" to
593                 # "struct sockaddr_in *", which are required by some
594                 # APIs such as getifaddrs().
595                 #
596                 -Wcast-align
597                 #
598                 # Works only with Clang
599                 #
600                 -Wunreachable-code
601                 #
602                 # Works only with Clang but generates a lot of warnings
603                 # (about glib library not using Doxygen)
604                 #
605                 -Wdocumentation
606                 #
607                 # Works only with GCC 7
608                 #
609                 -Wduplicated-branches
610                 #
611                 # No longer supported by El Capitan clang on C++
612                 # XXX - is this one of those where CMake's check
613                 # doesn't fail, so it won't reject this?
614                 #
615                 -fno-delete-null-pointer-checks
616         )
617
618         set(C_EXTRA_WARN_FLAGS
619                 # The following are C only, not C++
620                 #
621                 # Due to various places where APIs we don't control
622                 # require us to cast away constness, we can probably
623                 # never enable this one with -Werror.
624                 #
625                 -Wbad-function-cast
626         )
627
628         set(CXX_EXTRA_WARN_FLAGS
629         )
630
631         if(ENABLE_EXTRA_COMPILER_WARNINGS)   # This overrides -Werror
632                 set(COMMON_WARN_FLAGS ${COMMON_WARN_FLAGS} ${COMMON_EXTRA_WARN_FLAGS})
633                 set(C_WARN_FLAGS ${C_WARN_FLAGS} ${C_EXTRA_WARN_FLAGS})
634                 set(CXX_WARN_FLAGS ${CXX_WARN_FLAGS} ${CXX_EXTRA_WARN_FLAGS})
635         endif()
636
637         add_definitions(
638                 -DG_DISABLE_DEPRECATED
639                 -DG_DISABLE_SINGLE_INCLUDES
640         )
641 endif()
642
643 set( C_FLAG_TESTS ${WIRESHARK_COMMON_FLAGS} ${WIRESHARK_C_ONLY_FLAGS} )
644 set( CXX_FLAG_TESTS ${WIRESHARK_COMMON_FLAGS} ${WIRESHARK_CXX_ONLY_FLAGS} )
645
646 set( C_WARN_TESTS ${COMMON_WARN_FLAGS} ${C_WARN_FLAGS} )
647 set( CXX_WARN_TESTS ${COMMON_WARN_FLAGS} ${CXX_WARN_FLAGS} )
648
649 # Counterhack to work around some cache magic in CHECK_C_SOURCE_COMPILES
650 include(CheckCCompilerFlag)
651 include(CheckCXXCompilerFlag)
652
653 if(ENABLE_STATIC)
654         set(BUILD_SHARED_LIBS 0)
655         set(LINK_MODE_LIB STATIC)
656         set(LINK_MODE_MODULE STATIC)
657 else()
658         set(BUILD_SHARED_LIBS 1)
659         set(LINK_MODE_LIB SHARED)
660         set(LINK_MODE_MODULE MODULE)
661 endif()
662
663 # Sigh: Have to use THIS_FLAG instead of ${F} for some reason
664 foreach(THIS_FLAG ${C_FLAG_TESTS})
665         string( REGEX REPLACE "[^a-zA-Z0-9_]+" "_" F ${THIS_FLAG} )
666         set(${F} ${THIS_FLAG})
667         set(V C_${F}_VALID)
668         message(STATUS "Checking for c-compiler flag: ${THIS_FLAG}")
669         check_c_compiler_flag("${ADDED_CMAKE_C_FLAGS} ${${F}}" ${V})
670         if (${${V}})
671                 set(ADDED_CMAKE_C_FLAGS "${ADDED_CMAKE_C_FLAGS} ${${F}}")
672         endif()
673 endforeach()
674 set(CMAKE_C_FLAGS "${ADDED_CMAKE_C_FLAGS} ${CMAKE_C_FLAGS}")
675
676 foreach(THIS_FLAG ${CXX_FLAG_TESTS})
677         string( REGEX REPLACE "[^a-zA-Z0-9_]+" "_" F ${THIS_FLAG} )
678         set(${F} ${THIS_FLAG})
679         set(V CXX_${F}_VALID)
680         message(STATUS "Checking for c++-compiler flag: ${THIS_FLAG}")
681         check_cxx_compiler_flag("${ADDED_CMAKE_CXX_FLAGS} ${${F}}" ${V})
682         if (${${V}})
683                 set(ADDED_CMAKE_CXX_FLAGS "${ADDED_CMAKE_CXX_FLAGS} ${${F}}")
684         endif()
685 endforeach()
686 set(CMAKE_CXX_FLAGS "${ADDED_CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS}")
687
688 foreach(THIS_FLAG ${C_WARN_TESTS})
689         string( REGEX REPLACE "[^a-zA-Z0-9_]+" "_" F ${THIS_FLAG} )
690         set(${F} ${THIS_FLAG})
691         set(V C_${F}_VALID)
692         message(STATUS "Checking for c-compiler flag: ${THIS_FLAG}")
693         check_c_compiler_flag("${C_FLAG_TESTS} ${${F}}" ${V})
694         if (${${V}})
695                 set(ADDED_WARN_C_FLAGS ${ADDED_WARN_C_FLAGS} ${${F}})
696         endif()
697 endforeach()
698 set(WS_WARNINGS_C_FLAGS ${ADDED_WARN_C_FLAGS})
699
700 foreach(THIS_FLAG ${CXX_WARN_TESTS})
701         string( REGEX REPLACE "[^a-zA-Z0-9_]+" "_" F ${THIS_FLAG} )
702         set(${F} ${THIS_FLAG})
703         set(V CXX_${F}_VALID)
704         message(STATUS "Checking for c++-compiler flag: ${THIS_FLAG}")
705         check_cxx_compiler_flag("${CXX_FLAG_TESTS} ${${F}}" ${V})
706         if (${${V}})
707                 set(ADDED_WARN_CXX_FLAGS ${ADDED_WARN_CXX_FLAGS} ${${F}})
708         endif()
709 endforeach()
710 set(WS_WARNINGS_CXX_FLAGS ${ADDED_WARN_CXX_FLAGS})
711
712 include(CMakePushCheckState)
713
714 if(ENABLE_ASAN)
715         cmake_push_check_state()
716         set(CMAKE_REQUIRED_LIBRARIES "-fsanitize=address")
717         check_c_compiler_flag(-fsanitize=address C__fsanitize_address_VALID)
718         check_cxx_compiler_flag(-fsanitize=address CXX__fsanitize_address_VALID)
719         cmake_pop_check_state()
720         if(NOT C__fsanitize_address_VALID OR NOT CXX__fsanitize_address_VALID)
721                 message(FATAL_ERROR "ENABLE_ASAN was requested, but not supported!")
722         endif()
723         set(CMAKE_C_FLAGS "-fsanitize=address ${CMAKE_C_FLAGS}")
724         set(CMAKE_CXX_FLAGS "-fsanitize=address ${CMAKE_CXX_FLAGS}")
725         # Disable ASAN for build-time tools, e.g. lemon
726         check_c_compiler_flag(-fno-sanitize=all C__fno_sanitize_all_VALID)
727         if(C__fno_sanitize_all_VALID)
728                 set(NO_SANITIZE_CFLAGS "-fno-sanitize=all")
729                 set(NO_SANITIZE_LDFLAGS "-fno-sanitize=all")
730         endif()
731 endif()
732
733 if(ENABLE_UBSAN)
734         cmake_push_check_state()
735         set(CMAKE_REQUIRED_LIBRARIES "-fsanitize=undefined")
736         check_c_compiler_flag(-fsanitize=undefined C__fsanitize_undefined_VALID)
737         check_cxx_compiler_flag(-fsanitize=undefined CXX__fsanitize_undefined_VALID)
738         cmake_pop_check_state()
739         if(NOT C__fsanitize_undefined_VALID OR NOT CXX__fsanitize_undefined_VALID)
740                 message(FATAL_ERROR "ENABLE_UBSAN was requested, but not supported!")
741         endif()
742         set(CMAKE_C_FLAGS "-fsanitize=undefined ${CMAKE_C_FLAGS}")
743         set(CMAKE_CXX_FLAGS "-fsanitize=undefined ${CMAKE_CXX_FLAGS}")
744 endif()
745
746 set(WERROR_COMMON_FLAGS "")
747 set(NO_ERROR_DEPRECATED_DECLARATIONS_COMPILE_FLAGS "")
748 if(NOT DISABLE_WERROR AND NOT ENABLE_EXTRA_COMPILER_WARNINGS)
749         if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
750                 set(WERROR_COMMON_FLAGS "/WX")
751         else()
752                 check_c_compiler_flag(-Werror WERROR)
753                 if (WERROR)
754                         set(WERROR_COMMON_FLAGS "-Werror")
755                         set(NO_ERROR_DEPRECATED_DECLARATIONS_COMPILE_FLAGS "-Wno-error=deprecated-declarations")
756                 endif()
757         endif()
758 endif()
759
760 #
761 # Try to have the compiler default to hiding symbols, so that only
762 # symbols explicitly exported with WS_DLL_PUBLIC will be visible
763 # outside (shared) libraries; that way, more UN*X builds will catch
764 # failures to export symbols, rather than having that fail only on
765 # Windows.
766 #
767 # We don't need that with MSVC, as that's the default.
768 #
769 if( NOT CMAKE_C_COMPILER_ID MATCHES "MSVC")
770         #
771         # Try the GCC-and-compatible -fvisibility-hidden first.
772         #
773         check_c_compiler_flag(-fvisibility=hidden FVHIDDEN)
774         if(FVHIDDEN)
775                 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
776         else()
777                 #
778                 # OK, try the Sun^WOracle C -xldscope=hidden
779                 #
780                 check_c_compiler_flag(-xldscope=hidden XLDSCOPEHIDDEN)
781                 if(XLDSCOPEHIDDEN)
782                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -xldscope=hidden")
783                 else()
784                         #
785                         # Anything else?
786                         # If there is anything else, we might want to
787                         # make a list of options to try, and try them
788                         # in a loop.
789                         #
790                         message(WARNING "Hiding shared library symbols is not supported by the compiler."
791                                 " All shared library symbols will be exported.")
792                 endif()
793         endif()
794 endif()
795
796 set(WIRESHARK_LD_FLAGS
797         -Wl,--as-needed
798         # -flto
799         # -fwhopr
800         # -fwhole-program
801 )
802 # CMAKE_POSITION_INDEPENDENT_CODE is only supported starting with CMake
803 # 2.8.9. Do not add -pie automatically for older versions.
804 #
805 # XXX - are there other compilers that don't support -pie?  It's
806 # not as if the only platforms we support are Windows and Linux....
807 #
808 if(NOT CMAKE_VERSION VERSION_LESS "2.8.9")
809         set(WIRESHARK_LD_FLAGS ${WIRESHARK_LD_FLAGS}
810                 -pie
811         )
812 endif()
813
814 include(CheckCLinkerFlag)
815 set(_C 0)
816 # Sigh: Have to use THIS_FLAG instead of ${F} for some reason
817 foreach(THIS_FLAG ${WIRESHARK_LD_FLAGS})
818         set(F WS_LD_FLAG_${_C})
819         set(${F} ${THIS_FLAG})
820         set(V WS_LD_FLAG_VALID${_C})
821         check_c_linker_flag(${${F}} ${V})
822         if (${${V}})
823                 set(WS_LINK_FLAGS "${WS_LINK_FLAGS} ${${F}}")
824         endif()
825         math(EXPR _C "${_C} + 1")
826 endforeach()
827
828 if(APPLE AND EXISTS /usr/local/opt/gettext)
829         # GLib on macOS requires libintl. Homebrew installs gettext (and
830         # libintl) in /usr/local/opt/gettext
831         include_directories(/usr/local/opt/gettext/include)
832         link_directories(/usr/local/opt/gettext/lib)
833 endif()
834
835 # The packagelist is doing some magic: If we add XXX to the packagelist, we
836 # - may optionally set XXX_OPTIONS to pass to the find_package command
837 # - will call FindXXX.cmake or find_package
838 # - return found libraries in XXX_LIBRARIES
839 # - return found include in XXX_INCLUDE_DIRS
840 # - set HAVE_XXX
841
842 # The minimum package list
843 set(PACKAGELIST Gettext M Git GLIB2 GMODULE2 GTHREAD2 GCRYPT LEX YACC Perl SH PythonInterp)
844 set(LEX_OPTIONS REQUIRED)
845 set(GLIB2_OPTIONS REQUIRED)
846 set(GLIB2_FIND_OPTIONS REQUIRED)
847 set(GLIB2_MIN_VERSION 2.22.0)
848 set(GTHREAD2_OPTIONS REQUIRED)
849 set(GCRYPT_OPTIONS "1.4.2" REQUIRED)
850 set(PythonInterp_FIND_VERSION 2)
851 set(Python_ADDITIONAL_VERSIONS 3)
852 set(YACC_OPTIONS REQUIRED)
853
854 if (NOT WIN32)
855         set(M_OPTIONS REQUIRED)
856 endif()
857
858 set(PACKAGELIST ${PACKAGELIST} LIBSSH)
859 set(LIBSSH_OPTIONS "0.6")
860
861 if(ENABLE_PCAP)
862         set(PACKAGELIST ${PACKAGELIST} PCAP)
863 endif()
864
865 if(ENABLE_AIRPCAP)
866         set(PACKAGELIST ${PACKAGELIST} AIRPCAP)
867 endif()
868
869 # Build the GTK-GUI?
870 if(BUILD_wireshark_gtk)
871         if(ENABLE_GTK3)
872                 set(PACKAGELIST ${PACKAGELIST} GTK3)
873         else()
874                 set(PACKAGELIST ${PACKAGELIST} GTK2)
875                 set(GTK2_OPTIONS COMPONENTS gtk)
876                 set(GTK2_FIND_VERSION 2.12)
877                 set(GTK2_DEBUG false)
878         endif()
879 endif()
880
881 # Build the Qt GUI?
882 if(BUILD_wireshark)
883         if(ENABLE_QT5)
884                 # Untested, may not work if CMAKE_PREFIX_PATH gets overwritten
885                 # somewhere. The if WIN32 in this place is annoying as well.
886                 if( WIN32 )
887                         set( QT5_BASE_PATH "$ENV{QT5_BASE_DIR}" )
888                         set( CMAKE_PREFIX_PATH "${QT5_BASE_PATH}" )
889                 endif()
890                 set(PACKAGELIST ${PACKAGELIST}
891                         Qt5Core
892                         Qt5LinguistTools
893                         Qt5Multimedia
894                         Qt5PrintSupport
895                         Qt5Svg
896                         Qt5Widgets
897                 )
898                 if (APPLE)
899                         set(PACKAGELIST ${PACKAGELIST} Qt5MacExtras)
900                 endif()
901                 if( WIN32 )
902                         set(PACKAGELIST ${PACKAGELIST} Qt5WinExtras)
903                 endif()
904                 set(QT_VERSION 5)
905         else()
906                 set(PACKAGELIST ${PACKAGELIST} Qt4)
907                 set(Qt4_OPTIONS 4.8 REQUIRED QtCore QtGui)
908                 set(QT_VERSION 4)
909         endif()
910 endif()
911
912 # SMI SNMP
913 if(ENABLE_SMI)
914         set(PACKAGELIST ${PACKAGELIST} SMI)
915 endif()
916
917 # GNU SSL/TLS support
918 if(ENABLE_GNUTLS)
919         set(PACKAGELIST ${PACKAGELIST} GNUTLS)
920         # Minimum version needed.
921         set(GNUTLS_OPTIONS "2.12.0")
922 endif()
923
924 # Kerberos
925 if(ENABLE_KERBEROS)
926         set(PACKAGELIST ${PACKAGELIST} KERBEROS)
927 endif()
928
929 # Portable audio (GTK+ only)
930 if(ENABLE_PORTAUDIO AND BUILD_wireshark_gtk)
931         set(PACKAGELIST ${PACKAGELIST} PORTAUDIO)
932 endif()
933
934
935 # C Asynchronous resolver
936 if(ENABLE_CARES)
937         set(PACKAGELIST ${PACKAGELIST} CARES)
938         # Minimum version needed.
939         set(CARES_OPTIONS "1.5.0")
940 endif()
941
942 # Zlib compression
943 if(ENABLE_ZLIB)
944         if (WIN32)
945                 # On Windows we build our own version of zlib, so add the paths
946                 set(ZLIB_SRC_DIR "${_PROJECT_LIB_DIR}/zlib-1.2.11-ws")
947                 set(SKIP_INSTALL_ALL True) # We copy the DLL ourselves.
948                 add_subdirectory("${ZLIB_SRC_DIR}" "${CMAKE_BINARY_DIR}/zlib")
949                 unset(SKIP_INSTALL_ALL)
950                 set(ZLIB_INCLUDE_DIR  "${ZLIB_SRC_DIR}" "${CMAKE_BINARY_DIR}/zlib")
951                 set(ZLIB_LIBRARY zlib)
952                 set(ZLIB_DLL "zlib1.dll")
953                 set_target_properties(zlib PROPERTIES FOLDER "Libs/zlib")
954                 # Annoyingly zlib also builds some other stuff we aren't interested in
955                 set_target_properties(zlibstatic PROPERTIES FOLDER "Libs/zlib")
956         endif()
957         set(PACKAGELIST ${PACKAGELIST} ZLIB)
958 endif()
959
960 # LZ4 compression
961 if(ENABLE_LZ4)
962         set(PACKAGELIST ${PACKAGELIST} LZ4)
963 endif()
964
965 # Snappy compression
966 if(ENABLE_SNAPPY)
967         set(PACKAGELIST ${PACKAGELIST} SNAPPY)
968 endif()
969
970 # Enhanced HTTP/2 dissection
971 if(ENABLE_NGHTTP2)
972         set(PACKAGELIST ${PACKAGELIST} NGHTTP2)
973 endif()
974
975 # Embedded Lua interpreter
976 if(ENABLE_LUA)
977         set(PACKAGELIST ${PACKAGELIST} LUA)
978 endif()
979
980 # GeoIP address resolving
981 if(ENABLE_GEOIP)
982         set(PACKAGELIST ${PACKAGELIST} GEOIP)
983 endif()
984
985 if(ENABLE_NETLINK)
986         set(PACKAGELIST ${PACKAGELIST} NL)
987 endif()
988
989 if(ENABLE_SBC)
990         set(PACKAGELIST ${PACKAGELIST} SBC)
991 endif()
992
993 if(ENABLE_SPANDSP)
994         set(PACKAGELIST ${PACKAGELIST} SPANDSP)
995 endif()
996
997 if(ENABLE_BCG729)
998         set(PACKAGELIST ${PACKAGELIST} BCG729)
999 endif()
1000
1001 if(ENABLE_LIBXML2)
1002         set(PACKAGELIST ${PACKAGELIST} LibXml2)
1003 endif()
1004
1005 # Capabilities
1006 if(ENABLE_CAP)
1007         set(PACKAGELIST ${PACKAGELIST} CAP SETCAP)
1008 endif()
1009
1010 # Windows version updates
1011 if(ENABLE_WINSPARKLE)
1012         set(PACKAGELIST ${PACKAGELIST} WINSPARKLE)
1013 endif()
1014
1015 set(PACKAGELIST ${PACKAGELIST} YAPP)
1016
1017 set(PACKAGELIST ${PACKAGELIST} POD)
1018
1019 if(ENABLE_HTML_GUIDES)
1020         set(PACKAGELIST ${PACKAGELIST} DOXYGEN)
1021 endif()
1022
1023 set(PROGLIST)
1024
1025 # Sort the package list
1026 list(SORT PACKAGELIST)
1027 string(REPLACE ";" " " _package_list "${PACKAGELIST}")
1028 message(STATUS "Package List: ${_package_list}")
1029 # Let's loop the package list
1030 foreach(PACKAGE ${PACKAGELIST})
1031         if(${PACKAGE} STREQUAL "Qt4")
1032                 set(PACKAGE_VAR "QT")
1033         elseif(${PACKAGE} STREQUAL "PythonInterp")
1034                 set(PACKAGE_VAR "PYTHONINTERP")
1035         elseif(${PACKAGE} STREQUAL "Gettext")
1036                 set(PACKAGE_VAR "GETTEXT")
1037         elseif(${PACKAGE} STREQUAL "Perl")
1038                 set(PACKAGE_VAR "PERL")
1039         elseif(${PACKAGE} STREQUAL "LibXml2")
1040                 set(PACKAGE_VAR "LIBXML2")
1041         else()
1042                 set(PACKAGE_VAR ${PACKAGE})
1043         endif()
1044         if(${PACKAGE}_OPTIONS)
1045                 find_package(${PACKAGE} ${${PACKAGE}_OPTIONS})
1046         else()
1047                 find_package(${PACKAGE})
1048         endif()
1049         # FindPackageHandleStandardArgs before CMake 3.2 always uses uppercase
1050         # for the FOUND variables (e.g. GIT_FOUND is set, but not Git_FOUND).
1051         string(TOUPPER "${PACKAGE_VAR}" PACKAGE_VAR_UPPER)
1052         if (${PACKAGE_VAR}_FOUND OR ${PACKAGE_VAR_UPPER}_FOUND)
1053                 message(STATUS "${PACKAGE_VAR} FOUND")
1054                 set(HAVE_LIB${PACKAGE_VAR} 1)
1055                 if (NOT DEFINED ${PACKAGE_VAR}_INCLUDE_DIRS AND ${PACKAGE_VAR}_INCLUDE_DIR)
1056                         set(${PACKAGE_VAR}_INCLUDE_DIRS ${${PACKAGE_VAR}_INCLUDE_DIR})
1057                 endif()
1058                 if (${PACKAGE_VAR}_INCLUDE_DIRS)
1059                         include_directories(SYSTEM ${${PACKAGE_VAR}_INCLUDE_DIRS})
1060                         message(STATUS "${PACKAGE} includes: ${${PACKAGE_VAR}_INCLUDE_DIRS}")
1061                 endif()
1062                 if (${PACKAGE_VAR}_LIBRARIES)
1063                         list(APPEND WS_ALL_LIBS ${${PACKAGE_VAR}_LIBRARIES})
1064                         message(STATUS "${PACKAGE} libs: ${${PACKAGE_VAR}_LIBRARIES}")
1065                 endif()
1066                 if (${PACKAGE_VAR}_DEFINITIONS)
1067                         message(STATUS "${PACKAGE} definitions: ${${PACKAGE_VAR}_DEFINITIONS}")
1068                 endif()
1069                 if (${PACKAGE_VAR}_EXECUTABLE)
1070                         message(STATUS "${PACKAGE} executable: ${${PACKAGE_VAR}_EXECUTABLE}")
1071                 endif()
1072         else()
1073                 #
1074                 # Not finding a package is only a fatal error if the
1075                 # package is required; if it's required, then its
1076                 # XXX_OPTIONS variable contains REQUIRED, and the above
1077                 # code will pass REQUIRED to find_package, and the
1078                 # configure will fail if the package isn't found.
1079                 #
1080                 # Do *NOT* report this as an error!
1081                 #
1082                 message(STATUS "${PACKAGE_VAR} NOT FOUND")
1083         endif()
1084 endforeach()
1085
1086 # Provide Windows system lib names
1087 include( UseWinLibs )
1088
1089 # dist target that prepares source dir
1090 add_custom_target(dist
1091     COMMAND "${CMAKE_COMMAND}"
1092         -DPROJECT_SOURCE_DIR="${PROJECT_SOURCE_DIR}"
1093         -DGIT_EXECUTABLE="${GIT_EXECUTABLE}"
1094         -DWS_SOURCE_DIR="${WS_SOURCE_DIR}"
1095         -P "${CMAKE_SOURCE_DIR}/cmake/modules/Dist.cmake"
1096     COMMAND "${CMAKE_MAKE_PROGRAM}" package_source
1097 )
1098
1099
1100 if(HAVE_LIBAIRPCAP)
1101         set(HAVE_AIRPCAP 1)
1102 endif()
1103 if(HAVE_LIBLUA)
1104         set(HAVE_LUA_H 1)
1105         set(HAVE_LUA 1)
1106 endif()
1107 if(HAVE_LIBKERBEROS)
1108         set(HAVE_KERBEROS 1)
1109 endif()
1110 if(HAVE_LIBGEOIP)
1111         set(HAVE_GEOIP 1)
1112 endif()
1113 if(LIBSSH_FOUND)
1114         set(HAVE_LIBSSH 1)
1115 endif()
1116 if(NGHTTP2_FOUND)
1117         set(HAVE_NGHTTP2 1)
1118 endif()
1119 if(HAVE_LIBCARES)
1120         set(HAVE_C_ARES 1)
1121 endif()
1122 if(NOT HAVE_LIBCARES)
1123         message(WARNING "Not using c-ares.")
1124         message(WARNING "DNS name resolution for captures will be disabled.")
1125 endif()
1126 if(HAVE_LIBNL AND HAVE_AIRPCAP)
1127         message(ERROR "Airpcap and Libnl support are mutually exclusive")
1128 endif()
1129 if(HAVE_LIBSBC)
1130         set(HAVE_SBC 1)
1131 endif()
1132 if(SPANDSP_FOUND)
1133         set(HAVE_SPANDSP 1)
1134 endif()
1135 if(BCG729_FOUND)
1136         set(HAVE_BCG729 1)
1137 endif()
1138 if(LIBXML2_FOUND)
1139         set(HAVE_LIBXML2 1)
1140 else()
1141         # The (official) FindLibXml2.cmake file sets this cache variable to a
1142         # non-empty value, be sure to clear it when not found.
1143         set(LIBXML2_LIBRARIES "")
1144 endif()
1145 if(EXTCAP_ANDROIDDUMP_LIBPCAP)
1146         set(ANDROIDDUMP_USE_LIBPCAP 1)
1147 endif()
1148
1149 if (HAVE_LIBWINSPARKLE)
1150         set(HAVE_SOFTWARE_UPDATE 1)
1151 endif()
1152
1153 # No matter which version of GTK is present
1154 if(GTK2_FOUND OR GTK3_FOUND)
1155         set(GTK_FOUND ON)
1156 endif()
1157
1158 if(HAVE_LIBZLIB)
1159         set(HAVE_ZLIB 1)
1160         # Always include the "true" zlib includes first. This works around a
1161         # bug in the Windows setup of GTK[23] which has a faulty zconf.h.
1162         include_directories(BEFORE ${ZLIB_INCLUDE_DIRS})
1163 endif()
1164 if(HAVE_LIBLZ4)
1165         set(HAVE_LZ4 1)
1166 endif()
1167 if(SNAPPY_FOUND)
1168         set(HAVE_SNAPPY 1)
1169 endif()
1170 if (Qt5Widgets_FOUND)
1171         #
1172         # Qt5CoreConfigExtras.cmake in Qt 5.5.0 sets -fPIC unconditionally:
1173         #
1174         #    https://bugreports.qt.io/browse/QTBUG-47942
1175         #
1176         # There's a fix in Gerrit for that:
1177         #
1178         #     https://codereview.qt-project.org/#/c/139645/
1179         #
1180         # Do the same check as that fix does and, if the check says we
1181         # should *not* add -fPIC, remove it.
1182         #
1183         # XXX - if that check gets changed in the future, we'll have to
1184         # detect that and change it.
1185         #
1186         if (CMAKE_VERSION VERSION_LESS 2.8.12
1187             AND (CMAKE_CXX_COMPILER_ID STREQUAL \"GNU\"
1188             AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0))
1189                 #
1190                 # Yes, it should have been; leave it there.
1191                 #
1192         else()
1193                 #
1194                 # No, it shouldn't have been; remove it.
1195                 #
1196                 list(REMOVE_ITEM Qt5Widgets_EXECUTABLE_COMPILE_FLAGS "-fPIC")
1197         endif()
1198         if (Qt5Widgets_VERSION VERSION_GREATER 5.6
1199             AND (CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang"))
1200                 # Qt 5.7 and later require C++ 11. If our minmimu required CMake version
1201                 # is ever >= 3.1 we can use CXX_STANDARD + CXX_STANDARD_REQUIRED.
1202                 message(STATUS "Checking for C++ 11 support (Required by Qt 5.7 and later)")
1203                 check_cxx_compiler_flag(-std=c++11 CXX__std_c__11_VALID)
1204                 if(NOT CXX__std_c__11_VALID)
1205                         message(FATAL_ERROR "Qt ${Qt5Widgets_VERSION} requires C++ 11")
1206                 endif()
1207                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
1208         endif()
1209         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
1210         set (QT_FOUND ON)
1211         set (QT_LIBRARIES ${Qt5Widgets_LIBRARIES} ${Qt5PrintSupport_LIBRARIES})
1212         if(Qt5Multimedia_FOUND)
1213                 set (QT_LIBRARIES ${QT_LIBRARIES} ${Qt5Multimedia_LIBRARIES})
1214                 # That's the name autofoo uses
1215                 set(QT_MULTIMEDIA_LIB 1)
1216         endif()
1217         if(Qt5Svg_FOUND)
1218                 set (QT_LIBRARIES ${QT_LIBRARIES} ${Qt5Svg_LIBRARIES})
1219                 # That's the name autofoo uses
1220                 set(QT_SVG_LIB 1)
1221         endif()
1222         if(Qt5MacExtras_FOUND)
1223                 set (QT_LIBRARIES ${QT_LIBRARIES} ${Qt5MacExtras_LIBRARIES})
1224                 # That's the name autofoo uses
1225                 set(QT_MACEXTRAS_LIB 1)
1226         endif()
1227         if(Qt5WinExtras_FOUND)
1228                 set (QT_LIBRARIES ${QT_LIBRARIES} ${Qt5WinExtras_LIBRARIES})
1229                 # set(QT_WINEXTRAS_LIB 1) # Not needed?
1230         endif()
1231         if(NOT DEFINED MOC_OPTIONS)
1232                 # Squelch moc verbose "nothing to do" output
1233                 set(MOC_OPTIONS -nn)
1234         endif()
1235 # If Qt4: QT_LIBRARIES and QT_INCLUDES are not set above. They require extra magic
1236 elseif(QT4_FOUND)
1237         include(${QT_USE_FILE})
1238         include_directories(${QT_INCLUDE_DIR})
1239         message(STATUS "Qt includes: ${QT_INCLUDE_DIR}")
1240         message(STATUS "Qt libs: ${QT_LIBRARIES}")
1241         if(QT_QTMULTIMEDIA_FOUND)
1242                 include_directories(${QT_QTMULTIMEDIA_INCLUDE_DIR})
1243                 message(STATUS "QtMultimedia includes: ${QT_INCLUDE_DIR}")
1244                 set (QT_LIBRARIES ${QT_LIBRARIES} ${QT_QTMULTIMEDIA_LIBRARY})
1245                 message(STATUS "QtMultimedia libs: ${QT_QTMULTIMEDIA_LIBRARY}")
1246                 # That's the name autofoo uses
1247                 set(QT_MULTIMEDIA_LIB 1)
1248         endif()
1249         if(NOT DEFINED MOC_OPTIONS)
1250                 if(QT_VERSION_MAJOR EQUAL 4 AND QT_VERSION_MINOR GREATER 7)
1251                         set(MOC_OPTIONS -nn)
1252                 endif()
1253         endif()
1254         if(WIN32 OR APPLE)
1255                 message(FATAL_ERROR "Windows and macOS builds should use Qt5.")
1256         endif()
1257 endif()
1258
1259 if(ENABLE_CHECKHF_CONFLICT)
1260         set(ENABLE_CHECK_FILTER 1)
1261 endif()
1262
1263 string(REPLACE ";" " " _warnings_c_flags "${WS_WARNINGS_C_FLAGS}")
1264 message(STATUS "C-Flags: ${CMAKE_C_FLAGS} ${_warnings_c_flags}")
1265 string(REPLACE ";" " " _warnings_cxx_flags "${WS_WARNINGS_CXX_FLAGS}")
1266 message(STATUS "CXX-Flags: ${CMAKE_CXX_FLAGS} ${_warnings_cxx_flags}")
1267 message(STATUS "Warnings as errors: ${WERROR_COMMON_FLAGS}")
1268
1269 if(APPLE)
1270         #
1271         # We assume that APPLE means macOS so that we have the macOS
1272         # frameworks.
1273         #
1274         set(HAVE_MACOS_FRAMEWORKS 1)
1275         FIND_LIBRARY (APPLE_APPLICATION_SERVICES_LIBRARY ApplicationServices)
1276         FIND_LIBRARY (APPLE_CORE_FOUNDATION_LIBRARY CoreFoundation)
1277         FIND_LIBRARY (APPLE_SYSTEM_CONFIGURATION_LIBRARY SystemConfiguration)
1278 endif()
1279
1280 include(ConfigureChecks.cmake)
1281
1282 #Big or little endian ?
1283 include(TestBigEndian)
1284 test_big_endian(WORDS_BIGENDIAN)
1285
1286 # Global properties
1287 set_property(GLOBAL PROPERTY USE_FOLDERS ON)
1288
1289 if(ENABLE_CCACHE AND (CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang"))
1290         # http://stackoverflow.com/a/24305849/82195
1291         find_program(CCACHE_EXECUTABLE ccache)
1292         if(CCACHE_EXECUTABLE)
1293                 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_EXECUTABLE}")
1294                 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_EXECUTABLE}")
1295         endif()
1296 endif()
1297
1298 # The top level checkAPIs target, add before subdirectory calls so it's avaiable to all
1299 add_custom_target(checkAPI)
1300 set_target_properties(checkAPI
1301         PROPERTIES
1302                 FOLDER "Auxiliary"
1303                 EXCLUDE_FROM_ALL True
1304                 EXCLUDE_FROM_DEFAULT_BUILD True
1305 )
1306
1307 add_subdirectory( capchild )
1308 add_subdirectory( caputils )
1309 add_subdirectory( codecs )
1310 add_subdirectory( doc )
1311 add_subdirectory( docbook )
1312 add_subdirectory( epan )
1313 add_subdirectory( randpkt_core )
1314 add_subdirectory( tools/lemon )
1315 add_subdirectory( ui )
1316 add_subdirectory( wiretap )
1317 add_subdirectory( writecap )
1318
1319 # Location of our data files. This should be set to a value that allows
1320 # running from the build directory on Windows, on macOS when building an
1321 # application bundle, and on UNIX in general if
1322 # WIRESHARK_RUN_FROM_BUILD_DIRECTORY is set.
1323 if(ENABLE_APPLICATION_BUNDLE)
1324         set(_datafile_dir "${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/Resources/share/wireshark")
1325 else()
1326         get_target_property(_libwireshark_location epan LOCATION)
1327         get_filename_component(_datafile_dir "${_libwireshark_location}" PATH)
1328 endif()
1329
1330 set(DATAFILE_DIR ${_datafile_dir} CACHE INTERNAL "Build time data file location.")
1331
1332 # wsutil must be added after DATAFILE_DIR is set such that filesystem.c can
1333 # learn about the directory location.
1334 add_subdirectory( wsutil )
1335
1336 if(NOT WIN32)
1337         add_custom_target(dumpabi DEPENDS dumpabi-libwireshark dumpabi-libwiretap dumpabi-libwsutil)
1338 endif()
1339
1340 if(BUILD_wireshark_gtk AND GTK_FOUND)
1341         add_subdirectory( ui/gtk )
1342 endif()
1343
1344 if(BUILD_wireshark AND QT_FOUND)
1345         add_subdirectory( ui/qt )
1346 endif()
1347
1348 if(ENABLE_EXTCAP)
1349         # Target platform locations
1350         # UN*X in general, including macOS if not building an app bundle:
1351         # $DESTDIR/lib/wireshark/extcap
1352         # Windows: $DESTDIR/extcap
1353         # macOS app bundle: Wireshark.app/Contents/Resources/share/wireshark/extcap
1354         set(HAVE_EXTCAP 1)
1355         if (WIN32)
1356                 set(EXTCAP_DIR "extcap")
1357         else ()
1358                 set(EXTCAP_DIR "${CMAKE_INSTALL_LIBDIR}/${CPACK_PACKAGE_NAME}/extcap")
1359         endif()
1360 endif()
1361
1362 if(LIBSSH_FOUND)
1363         SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${LIBSSH_LIBRARIES})
1364         CHECK_FUNCTION_EXISTS(ssh_userauth_agent LIBSSH_USERAUTH_AGENT_FOUND)
1365         if(LIBSSH_USERAUTH_AGENT_FOUND)
1366                 set(HAVE_SSH_USERAUTH_AGENT 1)
1367         endif()
1368 endif()
1369
1370 # Directory where plugins and Lua dissectors can be found.
1371 set(PLUGIN_VERSION_DIR "plugins/${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}")
1372 set(PLUGIN_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}/${CPACK_PACKAGE_NAME}/${PLUGIN_VERSION_DIR}")
1373 # Used by the WiresharkConfig.cmake.in module
1374 if (WIN32)
1375         set(PLUGIN_INSTALL_DIR "${PLUGIN_VERSION_DIR}")
1376 else ()
1377         set(PLUGIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${PLUGIN_INSTALL_LIBDIR}")
1378 endif()
1379
1380 # Location of our plugins. PLUGIN_DIR should allow running
1381 # from the build directory similar to DATAFILE_DIR above.
1382 if(ENABLE_PLUGINS)
1383         # Target platform locations
1384         # UN*X in general, including macOS if not building an app bundle:
1385         # $DESTDIR/lib/wireshark/plugins/$VERSION
1386         # Windows: $DESTDIR/wireshark/plubins/$VERSION
1387         # macOS app bundle: Wireshark.app/Contents/PlugIns/wireshark
1388         set(HAVE_PLUGINS 1)
1389         add_custom_target(plugins)
1390         set_target_properties(plugins PROPERTIES FOLDER "Plugins")
1391         set(PLUGIN_SRC_DIRS
1392                 plugins/docsis
1393                 plugins/ethercat
1394                 plugins/gryphon
1395                 plugins/irda
1396                 plugins/m2m
1397                 plugins/mate
1398                 plugins/opcua
1399                 plugins/profinet
1400                 plugins/stats_tree
1401                 plugins/transum
1402                 plugins/unistim
1403                 plugins/wimax
1404                 plugins/wimaxasncp
1405                 plugins/wimaxmacphy
1406                 ${CUSTOM_PLUGIN_SRC_DIR}
1407         )
1408
1409         # Build demo plugin, only if asked explicitly
1410         if(ENABLE_PLUGIN_IFDEMO)
1411                 set(PLUGIN_SRC_DIRS
1412                         ${PLUGIN_SRC_DIRS}
1413                         plugins/pluginifdemo
1414                 )
1415         endif()
1416
1417 # It seems this stuff doesn't build with autofoo either...
1418 #       if(YAPP_FOUND)
1419 #               set(PLUGIN_SRC_DIRS
1420 #                       ${PLUGIN_SRC_DIRS}
1421 #                       plugins/tpg
1422 #               )
1423 #       endif()
1424 else()
1425         set(PLUGIN_SRC_DIRS )
1426 endif()
1427
1428 if(ENABLE_APPLICATION_BUNDLE)
1429         set(_plugin_dir "${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/PlugIns/wireshark/${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}")
1430 else()
1431         get_target_property(_libwireshark_location epan LOCATION)
1432         get_filename_component(_plugin_dir "${_libwireshark_location}" PATH)
1433         set(_plugin_dir "${_plugin_dir}/${PLUGIN_VERSION_DIR}")
1434 endif()
1435 set (PLUGIN_DIR ${_plugin_dir} CACHE INTERNAL "Build time plugin location.")
1436
1437 foreach(_plugin_src_dir ${PLUGIN_SRC_DIRS})
1438         add_subdirectory( ${_plugin_src_dir} )
1439 endforeach()
1440
1441
1442 # Basedir where to install guides
1443 set(DOC_DIR "$ENV{docdir}" CACHE FILEPATH "Installation directory for ug and dg pdfs.")
1444 message(STATUS "docdir: ${DOC_DIR}")
1445
1446 if(ENABLE_PCAP_NG_DEFAULT)
1447         set(PCAP_NG_DEFAULT 1)
1448 endif()
1449
1450 # Large file support (e.g. make off_t 64 bit if supported)
1451 include(gmxTestLargeFiles)
1452 gmx_test_large_files(GMX_LARGEFILES)
1453
1454 add_definitions( -DTOP_SRCDIR=\"${CMAKE_SOURCE_DIR}\" )
1455
1456 if (${GIT_EXECUTABLE})
1457         set(GIT_BIN_PARAM "--git-bin ${GIT_EXECUTABLE}")
1458 endif()
1459 set( VERSION ${PROJECT_VERSION} )
1460 if(NOT CMAKE_VERSION VERSION_LESS "3.2.1")
1461         # Prevents unnecessary rebuilds by ensuring that dependents are not
1462         # built before make-version.pl finishes (which may touch version.h).
1463         set(version_byproducts BYPRODUCTS version.h)
1464 else()
1465         set(version_byproducts "")
1466 endif()
1467 add_custom_target(version
1468         ${version_byproducts}
1469         COMMAND ${PERL_EXECUTABLE}
1470                 ${CMAKE_SOURCE_DIR}/make-version.pl
1471                 --set-vcs ${GIT_BIN_PARAM}
1472                 ${CMAKE_SOURCE_DIR}
1473 )
1474 set_target_properties(version PROPERTIES FOLDER "Auxiliary")
1475
1476 set( configure_input "Built with CMake ${CMAKE_VERSION}" )
1477 configure_file(${CMAKE_SOURCE_DIR}/cmakeconfig.h.in ${CMAKE_BINARY_DIR}/config.h)
1478
1479 set( prefix "${CMAKE_INSTALL_PREFIX}" )
1480 set( exec_prefix "\${prefix}" )
1481 set( libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}" )
1482 set( includedir  "\${prefix}/include" )
1483 set( plugindir "\${libdir}/wireshark/${PLUGIN_VERSION_DIR}" )
1484
1485 set(ICON_PATH "${CMAKE_SOURCE_DIR}/image/")
1486 set( IN_FILES
1487         capchild/doxygen.cfg.in
1488         caputils/doxygen.cfg.in
1489         doxygen.cfg.in
1490         doxygen_global.cfg
1491         epan/doxygen.cfg.in
1492         image/libwireshark.rc.in
1493         image/text2pcap.rc.in
1494         image/capinfos.rc.in
1495         image/wireshark.rc.in
1496         image/mergecap.rc.in
1497         image/tshark.rc.in
1498         image/dumpcap.rc.in
1499         image/reordercap.rc.in
1500         image/rawshark.rc.in
1501         image/file_dlg_win32.rc
1502         image/tfshark.rc.in
1503         image/editcap.rc.in
1504         image/captype.rc.in
1505         image/libwscodecs.rc.in
1506         image/libwsutil.rc.in
1507         image/wiretap.rc.in
1508         image/wireshark.exe.manifest.in
1509         packaging/macosx/Info.plist.in
1510         packaging/macosx/osx-dmg.sh.in
1511         packaging/macosx/Wireshark_package.pmdoc/index.xml.in
1512         randpkt_core/doxygen.cfg.in
1513         ui/doxygen.cfg.in
1514         ui/gtk/doxygen.cfg.in
1515         ui/qt/doxygen.cfg.in
1516         wireshark.pc.in
1517         writecap/doxygen.cfg.in
1518 )
1519 foreach( _in_file ${IN_FILES} )
1520         get_filename_component( _path ${_in_file} PATH )
1521         string( REGEX REPLACE "(.*)\\.in" "\\1" _outfile ${_in_file}  )
1522         configure_file( ${CMAKE_SOURCE_DIR}/${_in_file} ${CMAKE_BINARY_DIR}/${_outfile} @ONLY )
1523 endforeach()
1524
1525 include(FeatureSummary)
1526 set_package_properties(SBC PROPERTIES
1527         DESCRIPTION "Bluetooth low-complexity, subband codec (SBC) decoder"
1528         URL "https://git.kernel.org/pub/scm/bluetooth/sbc.git"
1529         PURPOSE "Support for playing SBC codec in RTP player"
1530 )
1531 set_package_properties(SPANDSP PROPERTIES
1532         DESCRIPTION "a library of many DSP functions for telephony"
1533         URL "http://www.soft-switch.org/"
1534         PURPOSE "Support for G.722 and G.726 codecs in RTP player"
1535 )
1536 set_package_properties(BCG729 PROPERTIES
1537         DESCRIPTION "G.729 decoder"
1538         URL "https://www.linphone.org/technical-corner/bcg729/overview"
1539         PURPOSE "Support for G.729 codec in RTP player"
1540 )
1541 set_package_properties(LIBXML2 PROPERTIES
1542         DESCRIPTION "XML parsing library"
1543         URL "http://xmlsoft.org/"
1544         PURPOSE "Read XML configuration files in EPL dissector"
1545 )
1546 set_package_properties(LIBSSH PROPERTIES
1547         DESCRIPTION "Library for implementing SSH clients"
1548         URL "https://www.libssh.org/"
1549         PURPOSE "extcap remote SSH interfaces (sshdump, ciscodump)"
1550 )
1551 set_package_properties(LZ4 PROPERTIES
1552         DESCRIPTION "LZ4 is lossless compression algorithm used in some protocol (CQL...)"
1553         URL "http://www.lz4.org"
1554         PURPOSE "LZ4 decompression in CQL and Kafka dissectors"
1555 )
1556 set_package_properties(SNAPPY PROPERTIES
1557         DESCRIPTION "A fast compressor/decompressor from Google"
1558         URL "http://google.github.io/snappy/"
1559         PURPOSE "Snappy decompression in CQL and Kafka dissectors"
1560 )
1561 set_package_properties(NGHTTP2 PROPERTIES
1562         DESCRIPTION "HTTP/2 C library and tools"
1563         URL "https://nghttp2.org"
1564         PURPOSE "Header decompression in HTTP2"
1565 )
1566 # XXX tpg plugin is not added in CMakeLists/Makefile.am, remove plugins/tpg/?
1567 set_package_properties(YAPP PROPERTIES
1568         DESCRIPTION "Yet Another Perl Parser compiler"
1569         URL "http://search.cpan.org/dist/Parse-Yapp/"
1570         PURPOSE "tpg plugin"
1571 )
1572 feature_summary(WHAT ALL)
1573
1574 link_directories(
1575         ${CMAKE_BINARY_DIR}/ui
1576         ${CMAKE_BINARY_DIR}/ui/gtk
1577         ${CMAKE_BINARY_DIR}/ui/qt
1578         ${CMAKE_BINARY_DIR}/capchild
1579         ${CMAKE_BINARY_DIR}/caputils
1580         ${CMAKE_BINARY_DIR}/codecs
1581         ${CMAKE_BINARY_DIR}/epan
1582         ${CMAKE_BINARY_DIR}/randpkt_core
1583         ${CMAKE_BINARY_DIR}/wiretap
1584         ${CMAKE_BINARY_DIR}/writecap
1585         ${CMAKE_BINARY_DIR}/wsutil
1586 )
1587
1588 if(WIN32)
1589         set(PLATFORM_UI_SRC
1590                 ui/win32/console_win32.c
1591                 ui/win32/file_dlg_win32.c
1592                 ui/win32/print_win32.c
1593         )
1594         set(PLATFORM_UI_RC_FILES
1595                 image/file_dlg_win32.rc
1596         )
1597 endif()
1598
1599 # sources common for wireshark, tshark, rawshark and sharkd
1600 set(SHARK_COMMON_SRC
1601         cfile.c
1602         frame_tvbuff.c
1603         sync_pipe_write.c
1604         ws_version_info.c
1605 )
1606
1607 # sources for external capture interfaces
1608 if(ENABLE_EXTCAP)
1609         set(SHARK_COMMON_SRC
1610                 ${SHARK_COMMON_SRC}
1611                 extcap.c
1612                 extcap_parser.c
1613                 extcap_spawn.c
1614         )
1615 endif()
1616
1617 set(TSHARK_TAP_SRC
1618         ui/cli/tap-camelsrt.c
1619         ui/cli/tap-comparestat.c
1620         ui/cli/tap-diameter-avp.c
1621         ui/cli/tap-expert.c
1622         ui/cli/tap-exportobject.c
1623         ui/cli/tap-endpoints.c
1624         ui/cli/tap-flow.c
1625         ui/cli/tap-follow.c
1626         ui/cli/tap-funnel.c
1627         ui/cli/tap-gsm_astat.c
1628         ui/cli/tap-hosts.c
1629         ui/cli/tap-httpstat.c
1630         ui/cli/tap-icmpstat.c
1631         ui/cli/tap-icmpv6stat.c
1632         ui/cli/tap-iostat.c
1633         ui/cli/tap-iousers.c
1634         ui/cli/tap-macltestat.c
1635         ui/cli/tap-protocolinfo.c
1636         ui/cli/tap-protohierstat.c
1637         ui/cli/tap-rlcltestat.c
1638         ui/cli/tap-rpcprogs.c
1639         ui/cli/tap-rtd.c
1640         ui/cli/tap-rtp.c
1641         ui/cli/tap-rtspstat.c
1642         ui/cli/tap-sctpchunkstat.c
1643         ui/cli/tap-simple_stattable.c
1644         ui/cli/tap-sipstat.c
1645         ui/cli/tap-smbsids.c
1646         ui/cli/tap-srt.c
1647         ui/cli/tap-stats_tree.c
1648         ui/cli/tap-sv.c
1649         ui/cli/tap-wspstat.c
1650 )
1651
1652 set(INSTALL_DIRS
1653         diameter
1654         dtds
1655         ${DATAFILE_DIR}/help
1656         profiles
1657         radius
1658         tpncp
1659         wimaxasncp
1660 )
1661
1662 set(INSTALL_FILES
1663         cfilters
1664         colorfilters
1665         dfilters
1666         enterprises.tsv
1667         ipmap.html
1668         manuf
1669         pdml2html.xsl
1670         services
1671         smi_modules
1672         wka
1673         docbook/ws.css
1674         ${CMAKE_BINARY_DIR}/doc/AUTHORS-SHORT
1675         ${CMAKE_BINARY_DIR}/doc/androiddump.html
1676         ${CMAKE_BINARY_DIR}/doc/udpdump.html
1677         ${CMAKE_BINARY_DIR}/doc/capinfos.html
1678         ${CMAKE_BINARY_DIR}/doc/captype.html
1679         ${CMAKE_BINARY_DIR}/doc/ciscodump.html
1680         ${CMAKE_BINARY_DIR}/doc/dftest.html
1681         ${CMAKE_BINARY_DIR}/doc/dumpcap.html
1682         ${CMAKE_BINARY_DIR}/doc/editcap.html
1683         ${CMAKE_BINARY_DIR}/doc/extcap.html
1684         ${CMAKE_BINARY_DIR}/doc/mergecap.html
1685         ${CMAKE_BINARY_DIR}/doc/randpkt.html
1686         ${CMAKE_BINARY_DIR}/doc/randpktdump.html
1687         ${CMAKE_BINARY_DIR}/doc/rawshark.html
1688         ${CMAKE_BINARY_DIR}/doc/reordercap.html
1689         ${CMAKE_BINARY_DIR}/doc/sshdump.html
1690         ${CMAKE_BINARY_DIR}/doc/text2pcap.html
1691         ${CMAKE_BINARY_DIR}/doc/tshark.html
1692         ${CMAKE_BINARY_DIR}/doc/wireshark.html
1693         ${CMAKE_BINARY_DIR}/doc/wireshark-filter.html
1694 )
1695
1696 if (BUILD_corbaidl2wrs)
1697         list(APPEND INSTALL_FILES ${CMAKE_BINARY_DIR}/doc/idl2wrs.html)
1698 endif()
1699 if (BUILD_xxx2deb)
1700         list(APPEND INSTALL_FILES
1701                 ${CMAKE_BINARY_DIR}/doc/asn2deb.html
1702                 ${CMAKE_BINARY_DIR}/doc/idl2deb.html
1703         )
1704 endif()
1705
1706 if(WIN32)
1707         set(TEXTIFY_FILES COPYING NEWS README.windows)
1708         set(TEXTIFY_MD_FILES README.md)
1709         foreach(_text_file ${TEXTIFY_FILES} ${TEXTIFY_MD_FILES})
1710                 string(REGEX REPLACE ".md$" "" _out_file ${_text_file})
1711                 set(INSTALL_FILES ${CMAKE_BINARY_DIR}/${_out_file}.txt ${INSTALL_FILES})
1712         endforeach()
1713 else()
1714         set(INSTALL_FILES COPYING ${INSTALL_FILES})
1715 endif()
1716
1717 set(LIBEPAN_LIBS
1718 #               @SSL_LIBS@      # -lcrypto
1719                 epan
1720 #               $(plugin_ldadd) # in case of static
1721                 ${AIRPCAP_LIBRARIES}
1722                 ${PCAP_LIBRARIES}
1723                 ${CARES_LIBRARIES}
1724                 ${KERBEROS_LIBRARIES}
1725                 ${LUA_LIBRARIES}
1726                 ${PYTHON_LIBRARIES}
1727                 ${GEOIP_LIBRARIES}
1728                 ${GCRYPT_LIBRARIES}
1729                 ${GNUTLS_LIBRARIES}
1730                 ${SMI_LIBRARIES}
1731                 ${ZLIB_LIBRARIES}
1732                 ${LZ4_LIBRARIES}
1733                 ${SNAPPY_LIBRARIES}
1734                 ${M_LIBRARIES}
1735                 ${WINSPARKLE_LIBRARIES}
1736 )
1737
1738 if(WIN32)
1739         # According to http://stackoverflow.com/questions/14474659/cmake-how-to-have-a-target-for-copying-files
1740         # we can't just use "set(_dll_output_dir "$<TARGET_FILE_DIR:epan>")"
1741         # DATAFILE_DIR is set using the same property. We could probably
1742         # get away with using it here.
1743         get_target_property(_libwireshark_location epan LOCATION)
1744         get_filename_component(_dll_output_dir "${_libwireshark_location}" PATH)
1745         add_custom_target(copy_cli_dlls)
1746         set_target_properties(copy_cli_dlls PROPERTIES FOLDER "Copy Tasks")
1747         add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1748                 COMMAND ${CMAKE_COMMAND} -E make_directory "${_dll_output_dir}"
1749         )
1750
1751         # XXX Can (and should) we iterate over these similar to the way
1752         # the top-level CMakeLists.txt iterates over the package list?
1753
1754         # Required DLLs.
1755         # The cairo, freetype, gio, gnutls, png, and other OBS-generated DLLs
1756         # depend on zlib1.dll. We compile zlib locally but the Debug
1757         # configuration (the default) creates zlibd1.dll.
1758         file (TO_NATIVE_PATH "${_dll_output_dir}" _dll_output_dir_win )
1759         foreach( _dll ${GLIB2_DLLS} $<$<CONFIG:Debug>:zlib1.dll> )
1760                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1761                         # It would be really handy if copy, xcopy, or "cmake
1762                         # -E copy_if_different" supported multiple files
1763                         # separated by whitespace, or if robocpy had a sane
1764                         # notion of exit codes.
1765                         COMMAND if exist \"${_dll}\" xcopy ${_dll} "${_dll_output_dir_win}" /D /Y
1766                         WORKING_DIRECTORY "${GLIB2_DLL_DIR}"
1767                 )
1768         endforeach(_dll)
1769
1770         # Optional
1771         if (AIRPCAP_FOUND)
1772                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1773                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1774                                 "${AIRPCAP_DLL_DIR}/${AIRPCAP_DLL}"
1775                                 "${_dll_output_dir}"
1776                 )
1777         endif(AIRPCAP_FOUND)
1778         if (CARES_FOUND)
1779                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1780                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1781                                 "${CARES_DLL_DIR}/${CARES_DLL}"
1782                                 "${_dll_output_dir}"
1783                 )
1784         endif(CARES_FOUND)
1785         if (GEOIP_FOUND)
1786                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1787                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1788                                 "${GEOIP_DLL_DIR}/${GEOIP_DLL}"
1789                                 "${_dll_output_dir}"
1790                 )
1791         endif(GEOIP_FOUND)
1792         if (LIBSSH_FOUND)
1793                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1794                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1795                                 "${LIBSSH_DLL_DIR}/${LIBSSH_DLL}"
1796                                 "${_dll_output_dir}"
1797                 )
1798         endif(LIBSSH_FOUND)
1799         foreach( _dll ${GCRYPT_DLLS} )
1800                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1801                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1802                                 "${GCRYPT_DLL_DIR}/${_dll}"
1803                                 "${_dll_output_dir}"
1804                 )
1805         endforeach(_dll)
1806         if(GNUTLS_FOUND)
1807                 foreach( _dll ${GNUTLS_DLLS} )
1808                         add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1809                                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
1810                                         "${GNUTLS_DLL_DIR}/${_dll}"
1811                                         "${_dll_output_dir}"
1812                         )
1813                 endforeach(_dll)
1814         endif(GNUTLS_FOUND)
1815         if(KERBEROS_FOUND)
1816                 foreach( _dll ${KERBEROS_DLLS} )
1817                         add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1818                                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
1819                                         "${KERBEROS_DLL_DIR}/${_dll}"
1820                                         "${_dll_output_dir}"
1821                         )
1822                 endforeach(_dll)
1823         endif(KERBEROS_FOUND)
1824         if (LUA_FOUND)
1825                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1826                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1827                                 "${LUA_DLL_DIR}/${LUA_DLL}"
1828                                 "${_dll_output_dir}"
1829                 )
1830         endif(LUA_FOUND)
1831         if (LZ4_FOUND)
1832                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1833                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1834                                 "${LZ4_DLL_DIR}/${LZ4_DLL}"
1835                                 "${_dll_output_dir}"
1836                 )
1837         endif(LZ4_FOUND)
1838         if (NGHTTP2_FOUND)
1839                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1840                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1841                                 "${NGHTTP2_DLL_DIR}/${NGHTTP2_DLL}"
1842                                 "${_dll_output_dir}"
1843                 )
1844         endif(NGHTTP2_FOUND)
1845         if (SBC_FOUND)
1846                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1847                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1848                                 "${SBC_DLL_DIR}/${SBC_DLL}"
1849                                 "${_dll_output_dir}"
1850                 )
1851         endif(SBC_FOUND)
1852         if (SPANDSP_FOUND)
1853                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1854                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1855                                 "${SPANDSP_DLL_DIR}/${SPANDSP_DLL}"
1856                                 "${_dll_output_dir}"
1857                 )
1858         endif(SPANDSP_FOUND)
1859         if (BCG729_FOUND)
1860                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1861                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1862                                 "${BCG729_DLL_DIR}/${BCG729_DLL}"
1863                                 "${_dll_output_dir}"
1864                 )
1865         endif(BCG729_FOUND)
1866         if (LIBXML2_FOUND)
1867                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1868                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1869                                 "${LIBXML2_DLL_DIR}/${LIBXML2_DLL}"
1870                                 "${_dll_output_dir}"
1871                 )
1872         endif(LIBXML2_FOUND)
1873         if (SMI_FOUND)
1874                 # Wireshark.nsi wants SMI_DIR which is the base SMI directory
1875                 get_filename_component(SMI_DIR ${SMI_DLL_DIR} DIRECTORY)
1876                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1877                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1878                                 "${SMI_DLL_DIR}/${SMI_DLL}"
1879                                 "${_dll_output_dir}"
1880                         COMMAND ${CMAKE_COMMAND} -E make_directory
1881                                 "${_dll_output_dir}/snmp"
1882                         COMMAND ${CMAKE_COMMAND} -E make_directory
1883                                 "${_dll_output_dir}/snmp/mibs"
1884                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1885                                 "${SMI_SHARE_DIR}/mibs/iana"
1886                                 "${_dll_output_dir}/snmp/mibs"
1887                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1888                                 "${SMI_SHARE_DIR}/mibs/ietf"
1889                                 "${_dll_output_dir}/snmp/mibs"
1890                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1891                                 "${SMI_SHARE_DIR}/mibs/irtf"
1892                                 "${_dll_output_dir}/snmp/mibs"
1893                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1894                                 "${SMI_SHARE_DIR}/mibs/site"
1895                                 "${_dll_output_dir}/snmp/mibs"
1896                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1897                                 "${SMI_SHARE_DIR}/mibs/tubs"
1898                                 "${_dll_output_dir}/snmp/mibs"
1899                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1900                                 "${SMI_SHARE_DIR}/pibs"
1901                                 "${_dll_output_dir}/snmp/mibs"
1902                         COMMAND ${CMAKE_COMMAND} -E copy_directory
1903                                 "${SMI_SHARE_DIR}/yang"
1904                                 "${_dll_output_dir}/snmp/mibs"
1905                         #remove the extra directories copied (shallow copying the above would remove the need for this)
1906                         COMMAND ${CMAKE_COMMAND} -E remove_directory
1907                                 "${_dll_output_dir}/snmp/mibs/iana"
1908                         COMMAND ${CMAKE_COMMAND} -E remove_directory
1909                                 "${_dll_output_dir}/snmp/mibs/ietf"
1910                         COMMAND ${CMAKE_COMMAND} -E remove_directory
1911                                 "${_dll_output_dir}/snmp/mibs/site"
1912                         COMMAND ${CMAKE_COMMAND} -E remove_directory
1913                                 "${_dll_output_dir}/snmp/mibs/tubs"
1914                 )
1915         endif(SMI_FOUND)
1916         if (SNAPPY_FOUND)
1917                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1918                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1919                                 "${SNAPPY_DLL_DIR}/${SNAPPY_DLL}"
1920                                 "${_dll_output_dir}"
1921                 )
1922         endif(SNAPPY_FOUND)
1923         if (WINSPARKLE_FOUND)
1924                 add_custom_command(TARGET copy_cli_dlls PRE_BUILD
1925                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
1926                                 "${WINSPARKLE_DLL_DIR}/${WINSPARKLE_DLL}"
1927                                 "${_dll_output_dir}"
1928                 )
1929         endif(WINSPARKLE_FOUND)
1930
1931         add_dependencies(epan copy_cli_dlls)
1932
1933         # We have a lot of choices for creating zip archives:
1934         # - 7z, WinZip, etc., which require a separate download+install.
1935         # - Cygwin's zip, which requires Cygwin.
1936         # - "CMake -E tar cz", which creates a tar file.
1937         # - CPack, which requires a CPack configuration.
1938         # - PowerShell via PSCX or System.IO.Compression.FileSystem.
1939         # - Python via zipfile.
1940         # For now, just look for 7z. It's installed on the Windows builders,
1941         # which might be the only systems that use this target.
1942         find_program(ZIP_EXECUTABLE 7z
1943                 PATH "$ENV{PROGRAMFILES}/7-Zip" "$ENV{PROGRAMW6432}/7-Zip"
1944                 DOC "Path to the 7z utility."
1945         )
1946         # XXX "if(ZIP_EXECUTABLE)" doesn't work here. It looks like the
1947         # absence of "-NOTFOUND" doesn't equal "true".
1948         if (NOT "${ZIP_EXECUTABLE}" STREQUAL "ZIP_EXECUTABLE-NOTFOUND")
1949                 add_custom_target(pdb_zip_package)
1950                 set_target_properties(pdb_zip_package PROPERTIES FOLDER "Packaging")
1951                 set(_pdb_zip "${CMAKE_BINARY_DIR}/Wireshark-pdb-${WIRESHARK_TARGET_PLATFORM}-${VERSION}.zip")
1952                 file(TO_NATIVE_PATH "${_pdb_zip}" _pdb_zip_win)
1953                 add_custom_command(TARGET pdb_zip_package POST_BUILD
1954                         COMMAND ${CMAKE_COMMAND} -E remove -f "${_pdb_zip}"
1955                         COMMAND ${ZIP_EXECUTABLE} a -tzip -mmt=on "${_pdb_zip_win}" *.pdb *.lib
1956                         WORKING_DIRECTORY "${_dll_output_dir}"
1957                 )
1958                 add_dependencies(pdb_zip_package epan)
1959         endif()
1960 endif(WIN32)
1961
1962 # List of extra dependencies for the "copy_data_files" target
1963 set(copy_data_files_depends)
1964
1965 # glob patterns relative to the source directory that should be copied to
1966 # ${DATAFILE_DIR} (including directory prefixes)
1967 set(DATA_FILES_SRC
1968         "help/toc"
1969 )
1970
1971 if(WIN32)
1972         foreach(_text_file ${TEXTIFY_FILES})
1973                 add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${_text_file}.txt
1974                         COMMAND ${POWERSHELL_COMMAND} "${CMAKE_SOURCE_DIR}/tools/textify.ps1"
1975                                 -Destination ${CMAKE_BINARY_DIR}
1976                                 ${CMAKE_SOURCE_DIR}/${_text_file}
1977                         DEPENDS
1978                                 ${CMAKE_SOURCE_DIR}/${_text_file}
1979                 )
1980         endforeach()
1981         foreach(_md_file ${TEXTIFY_MD_FILES})
1982                 string(REGEX REPLACE ".md$" ".txt" _text_file ${_md_file})
1983                 add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${_text_file}
1984                         COMMAND ${POWERSHELL_COMMAND} "${CMAKE_SOURCE_DIR}/tools/textify.ps1"
1985                                 -Destination ${CMAKE_BINARY_DIR}
1986                                 ${CMAKE_SOURCE_DIR}/${_md_file}
1987                         COMMAND ${CMAKE_COMMAND} -E rename
1988                                 ${CMAKE_BINARY_DIR}/${_md_file}.txt
1989                                 ${CMAKE_BINARY_DIR}/${_text_file}
1990                         DEPENDS
1991                                 ${CMAKE_SOURCE_DIR}/${_text_file}
1992                 )
1993         endforeach()
1994 endif()
1995
1996 foreach(_install_file ${INSTALL_FILES})
1997         get_filename_component(_install_file_src "${_install_file}" ABSOLUTE)
1998         get_filename_component(_install_basename "${_install_file}" NAME)
1999         set(_output_file "${DATAFILE_DIR}/${_install_basename}")
2000         add_custom_command(OUTPUT "${_output_file}"
2001                 COMMAND ${CMAKE_COMMAND} -E copy
2002                         "${_install_file_src}"
2003                         "${_output_file}"
2004                 DEPENDS
2005                         docs
2006                         "${_install_file}"
2007         )
2008         list(APPEND copy_data_files_depends "${_output_file}")
2009 endforeach()
2010
2011 if(ENABLE_EXTCAP)
2012         # Ensure "run/extcap" exists
2013         add_custom_command(OUTPUT "${DATAFILE_DIR}/extcap"
2014                 COMMAND ${CMAKE_COMMAND} -E make_directory
2015                         "${DATAFILE_DIR}/extcap"
2016         )
2017         list(APPEND copy_data_files_depends "${DATAFILE_DIR}/extcap")
2018 endif()
2019
2020 # faq.txt is handled separately below.
2021 set(_help_source_files
2022         help/capture_filters.txt
2023         help/capturing.txt
2024         help/display_filters.txt
2025         help/getting_started.txt
2026         help/overview.txt
2027 )
2028
2029 if(WIN32)
2030         file(TO_NATIVE_PATH "${DATAFILE_DIR}/help" _help_dest_dir)
2031         foreach(_help_file IN LISTS _help_source_files)
2032                 add_custom_command(OUTPUT "${DATAFILE_DIR}/${_help_file}"
2033                         COMMAND ${CMAKE_COMMAND} -E make_directory "${DATAFILE_DIR}/help"
2034                         COMMAND ${POWERSHELL_COMMAND} "${CMAKE_SOURCE_DIR}/tools/textify.ps1"
2035                                 -Destination "${_help_dest_dir}"
2036                                 "${CMAKE_SOURCE_DIR}/${_help_file}"
2037                         DEPENDS
2038                                 "${CMAKE_SOURCE_DIR}/${_help_file}"
2039                 )
2040                 list(APPEND copy_data_files_depends "${DATAFILE_DIR}/${_help_file}")
2041         endforeach()
2042 else()
2043         list(APPEND DATA_FILES_SRC ${_help_source_files})
2044 endif(WIN32)
2045
2046 # Create help/faq.txt when missing
2047 add_custom_command(OUTPUT "${DATAFILE_DIR}/help/faq.txt"
2048         COMMAND ${CMAKE_COMMAND} -E make_directory "${DATAFILE_DIR}/help"
2049         COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/help/faq.py -b > faq.tmp.html
2050         COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/html2text.py
2051                 faq.tmp.html > "${DATAFILE_DIR}/help/faq.txt"
2052         COMMAND ${CMAKE_COMMAND} -E remove faq.tmp.html
2053         DEPENDS
2054                 "${CMAKE_SOURCE_DIR}/help/faq.py"
2055                 "${CMAKE_SOURCE_DIR}/tools/html2text.py"
2056 )
2057 list(APPEND copy_data_files_depends "${DATAFILE_DIR}/help/faq.txt")
2058
2059 # Install LUA files in staging directory such that LUA can used when Wireshark
2060 # is ran from the build directory. For install targets, see
2061 # epan/wslua/CMakeLists.txt
2062 if(LUA_FOUND AND ENABLE_LUA)
2063         set(_lua_files
2064                 "${CMAKE_BINARY_DIR}/epan/wslua/init.lua"
2065                 "${CMAKE_SOURCE_DIR}/epan/wslua/console.lua"
2066                 "${CMAKE_SOURCE_DIR}/epan/wslua/dtd_gen.lua"
2067         )
2068         foreach(_lua_file ${_lua_files})
2069                 get_filename_component(_lua_filename "${_lua_file}" NAME)
2070                 list(APPEND copy_data_files_depends
2071                         "${DATAFILE_DIR}/${_lua_filename}")
2072                 add_custom_command(OUTPUT "${DATAFILE_DIR}/${_lua_filename}"
2073                         COMMAND ${CMAKE_COMMAND} -E copy
2074                                 "${_lua_file}"
2075                                 "${DATAFILE_DIR}/${_lua_filename}"
2076                         DEPENDS
2077                                 wsluaauxiliary
2078                                 "${_lua_file}"
2079                 )
2080         endforeach()
2081 endif(LUA_FOUND AND ENABLE_LUA)
2082 # doc/*.html handled elsewhere.
2083
2084 # TODO shouldn't this use full (relative) paths instead of glob patterns?
2085 list(APPEND DATA_FILES_SRC
2086         "dtds/*.dtd"
2087
2088         "radius/README.radius_dictionary"
2089         "radius/custom.includes"
2090         "radius/dictionary"
2091         "radius/dictionary.*"
2092
2093         "diameter/*.dtd"
2094         "diameter/*.xml"
2095         "profiles/*/*"
2096         "tpncp/tpncp.dat"
2097         "wimaxasncp/*.dtd"
2098         "wimaxasncp/*.xml"
2099 )
2100
2101 # Copy all paths from the source tree to the data directory. Directories are
2102 # automatically created if missing as the filename is given.
2103 file(GLOB _data_files RELATIVE "${CMAKE_SOURCE_DIR}" ${DATA_FILES_SRC})
2104 foreach(_data_file ${_data_files})
2105         add_custom_command(OUTPUT "${DATAFILE_DIR}/${_data_file}"
2106                 COMMAND ${CMAKE_COMMAND} -E copy
2107                         "${CMAKE_SOURCE_DIR}/${_data_file}"
2108                         "${DATAFILE_DIR}/${_data_file}"
2109                 DEPENDS
2110                         "${CMAKE_SOURCE_DIR}/${_data_file}"
2111         )
2112         list(APPEND copy_data_files_depends "${DATAFILE_DIR}/${_data_file}")
2113 endforeach()
2114
2115 # Copy files including ${INSTALL_FILES} and ${INSTALL_DIRS} to ${DATAFILE_DIR}
2116 add_custom_target(copy_data_files ALL DEPENDS ${copy_data_files_depends})
2117 set_target_properties(copy_data_files PROPERTIES FOLDER "Copy Tasks")
2118
2119 if( (BUILD_wireshark AND QT_FOUND) OR (BUILD_wireshark_gtk AND GTK_FOUND) )
2120         set(WIRESHARK_SRC
2121                 capture_info.c
2122                 capture_opts.c
2123                 file.c
2124                 fileset.c
2125                 summary.c
2126                 ${SHARK_COMMON_SRC}
2127                 ${PLATFORM_UI_SRC}
2128         )
2129         set(wireshark_FILES
2130                 ${WIRESHARK_SRC}
2131                 ${CMAKE_BINARY_DIR}/image/wireshark.rc
2132                 ${PLATFORM_UI_RC_FILES}
2133         )
2134 endif()
2135
2136 if(ENABLE_APPLICATION_BUNDLE)
2137         #
2138         # Add -Wl,-single_module to the LDFLAGS used with shared
2139         # libraries, to fix some error that show up in some cases;
2140         # some Apple documentation recommends it for most shared
2141         # libraries.
2142         #
2143         set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-single_module ${CMAKE_SHARED_LINKER_FLAGS}" )
2144         #
2145         # Add -Wl,-headerpad_max_install_names to the LDFLAGS, as
2146         # code-signing issues is running out of padding space.
2147         #
2148         # Add -Wl,-search_paths_first to make sure that if we search
2149         # directories A and B, in that order, for a given library, a
2150         # non-shared version in directory A, rather than a shared
2151         # version in directory B, is chosen (so we can use
2152         # --with-pcap=/usr/local to force all programs to be linked
2153         # with a static version installed in /usr/local/lib rather than
2154         # the system version in /usr/lib).
2155         #
2156
2157         set(CMAKE_EXE_LINKER_FLAGS
2158         "-Wl,-headerpad_max_install_names -Wl,-search_paths_first ${CMAKE_EXE_LINKER_FLAGS}"
2159         )
2160
2161         # Add files to the app bundle
2162         # Wireshark.app/Contents
2163         file(WRITE ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo "APPLWshk\n")
2164         set(BUNDLE_CONTENTS_FILES
2165                 ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo
2166         )
2167         set_source_files_properties(${BUNDLE_CONTENTS_FILES} PROPERTIES
2168                 MACOSX_PACKAGE_LOCATION .
2169         )
2170
2171         # Wireshark.app/Contents/Resources
2172         set(BUNDLE_RESOURCE_FILES
2173                 ${CMAKE_SOURCE_DIR}/packaging/macosx/Wireshark.icns
2174                 ${CMAKE_SOURCE_DIR}/packaging/macosx/Wiresharkdoc.icns
2175         )
2176         set_source_files_properties(${BUNDLE_RESOURCE_FILES} PROPERTIES
2177                 MACOSX_PACKAGE_LOCATION Resources
2178         )
2179
2180         # Wireshark.app/Contents/Resources/share/man/man1
2181         set_source_files_properties(${BUNDLE_RESOURCE_SHARE_MAN1_FILES} PROPERTIES
2182                 MACOSX_PACKAGE_LOCATION Resources/share/man/man1
2183                 GENERATED 1
2184         )
2185
2186         # Wireshark.app/Contents/Resources/share/man/man4
2187         set_source_files_properties(${BUNDLE_RESOURCE_SHARE_MAN4_FILES} PROPERTIES
2188                 MACOSX_PACKAGE_LOCATION Resources/share/man/man4
2189                 GENERATED 1
2190         )
2191
2192         # INSTALL_FILES and INSTALL_DIRS are handled by copy_data_files
2193
2194         set(EXTRA_BUNDLE_FILES
2195                 ${BUNDLE_CONTENTS_FILES}
2196                 ${BUNDLE_RESOURCE_FILES}
2197                 ${BUNDLE_RESOURCE_SHARE_MAN1_FILES}
2198                 ${BUNDLE_RESOURCE_SHARE_MAN4_FILES}
2199         )
2200 else()
2201         set(EXTRA_BUNDLE_FILES)
2202 endif()
2203
2204 if(BUILD_wireshark AND QT_FOUND)
2205         set(wireshark_LIBS
2206                 qtui
2207                 ui
2208                 capchild
2209                 caputils
2210                 ${QT_LIBRARIES}
2211                 ${GTHREAD2_LIBRARIES}
2212                 wscodecs
2213                 ${LIBEPAN_LIBS}
2214                 ${APPLE_APPLICATION_SERVICES_LIBRARY}
2215                 ${APPLE_CORE_FOUNDATION_LIBRARY}
2216                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2217                 ${NL_LIBRARIES}
2218                 ${WIN_VERSION_LIBRARY}
2219         )
2220
2221         # Policy since 2.8.11
2222         if (POLICY CMP0020)
2223                 cmake_policy(SET CMP0020 NEW)
2224         endif()
2225
2226         add_executable(wireshark WIN32 MACOSX_BUNDLE wireshark-qt.cpp ${wireshark_FILES} ${EXTRA_BUNDLE_FILES})
2227         add_dependencies(wireshark version)
2228         set(PROGLIST ${PROGLIST} wireshark)
2229         set_target_properties(wireshark PROPERTIES COMPILE_OPTIONS "${WS_WARNINGS_CXX_FLAGS}")
2230         set_target_properties(wireshark PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
2231         set_target_properties(wireshark PROPERTIES FOLDER "Executables")
2232         if(ENABLE_APPLICATION_BUNDLE OR WIN32)
2233                 set_target_properties(wireshark PROPERTIES OUTPUT_NAME Wireshark)
2234         endif()
2235
2236         if(ENABLE_APPLICATION_BUNDLE)
2237                 add_dependencies(wireshark manpages)
2238                 set_target_properties(
2239                         wireshark PROPERTIES
2240                                 MACOSX_BUNDLE_INFO_PLIST ${CMAKE_BINARY_DIR}/packaging/macosx/Info.plist
2241                 )
2242                 # Add a wrapper script which opens the bundle. This adds
2243                 # convenience but makes debugging more difficult.
2244                 file(REMOVE ${CMAKE_BINARY_DIR}/run/wireshark)
2245                 file(WRITE ${CMAKE_BINARY_DIR}/run/wireshark "#!/bin/sh\n")
2246                 file(APPEND ${CMAKE_BINARY_DIR}/run/wireshark "# Generated by ${CMAKE_CURRENT_LIST_FILE}\n")
2247                 file(APPEND ${CMAKE_BINARY_DIR}/run/wireshark "exec ${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/MacOS/Wireshark \"\$\@\"\n")
2248                 execute_process(COMMAND chmod a+x ${CMAKE_BINARY_DIR}/run/wireshark)
2249         endif()
2250
2251         target_link_libraries(wireshark ${wireshark_LIBS})
2252         install(
2253                 TARGETS wireshark
2254                 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
2255                 BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}
2256         )
2257
2258         if(NOT ENABLE_APPLICATION_BUNDLE)
2259                 # Map for endpoints dialog
2260                 ADD_CUSTOM_COMMAND(
2261                         TARGET wireshark
2262                         POST_BUILD
2263                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
2264                                 "${PROJECT_SOURCE_DIR}/ipmap.html"
2265                                 $<TARGET_FILE_DIR:wireshark>
2266                 )
2267         endif()
2268
2269         if(WIN32 AND Qt5Core_FOUND)
2270                 # Use windeployqt to copy our required DLLs to the run path.
2271                 # Ideally one of the modules in ${QTDIR}/lib/cmake would expose
2272                 # the path to windeployqt. For that matter having a reliable
2273                 # path to qmake would be *amazingly convenient*. We don't have
2274                 # either of those so we try to discover the path via Qt5Core.
2275                 # http://stackoverflow.com/questions/24650936/qt5-with-cmake-how-to-find-qt-translations-dir
2276
2277                 get_target_property(_qmake_location Qt5::qmake IMPORTED_LOCATION)
2278                 get_filename_component(_qt_bin_path "${_qmake_location}" DIRECTORY)
2279                 find_program(QT_WINDEPLOYQT_EXECUTABLE windeployqt
2280                         HINTS "${_qmake_location}"
2281                         DOC "Path to the windeployqt utility."
2282                 )
2283                 if (NOT "${QT_WINDEPLOYQT_EXECUTABLE}" STREQUAL "QT_WINDEPLOYQT_EXECUTABLE-NOTFOUND")
2284                         set(QT_BIN_PATH "${_qt_bin_path}" CACHE INTERNAL
2285                                 "Path to qmake, windeployqt, and other Qt utilities."
2286                         )
2287                         add_custom_target(copy_qt_dlls ALL)
2288                         set_target_properties(copy_qt_dlls PROPERTIES FOLDER "Copy Tasks")
2289                         # Will we ever need to use --debug? Windeployqt seems to
2290                         # be smart enough to copy debug DLLs when needed.
2291                         add_custom_command(TARGET copy_qt_dlls
2292                                 POST_BUILD
2293                                 COMMAND set "PATH=${QT_BIN_PATH};%PATH%"
2294                                 COMMAND "${QT_WINDEPLOYQT_EXECUTABLE}"
2295                                         $<$<CONFIG:Debug>:--debug>
2296                                         $<$<NOT:$<CONFIG:Debug>>:--release>
2297                                         --no-compiler-runtime
2298                                         --verbose 10
2299                                         "$<TARGET_FILE:wireshark>"
2300                         )
2301                         add_dependencies(copy_qt_dlls wireshark)
2302                 endif()
2303         endif(WIN32 AND Qt5Core_FOUND)
2304 endif()
2305
2306 # Common properties for CLI executables
2307 macro(set_extra_executable_properties _executable _folder)
2308         set_target_properties(${_executable} PROPERTIES
2309                 COMPILE_OPTIONS "${WS_WARNINGS_C_FLAGS}"
2310                 LINK_FLAGS "${WS_LINK_FLAGS}"
2311                 FOLDER ${_folder}
2312         )
2313
2314         set(PROGLIST ${PROGLIST} ${_executable})
2315
2316         if(ENABLE_APPLICATION_BUNDLE)
2317                 set_target_properties(${_executable} PROPERTIES
2318                         RUNTIME_OUTPUT_DIRECTORY run/Wireshark.app/Contents/MacOS
2319                 )
2320                 # Add a wrapper script which runs each executable from the
2321                 # correct location. This adds convenience but makes debugging
2322                 # more difficult.
2323                 file(REMOVE ${CMAKE_BINARY_DIR}/run/${_executable})
2324                 file(WRITE ${CMAKE_BINARY_DIR}/run/${_executable} "#!/bin/sh\n")
2325                 file(APPEND ${CMAKE_BINARY_DIR}/run/${_executable} "exec ${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/MacOS/${_executable} \"\$\@\"\n")
2326                 execute_process(COMMAND chmod a+x ${CMAKE_BINARY_DIR}/run/${_executable})
2327         endif()
2328 endmacro()
2329
2330 macro(set_extcap_executable_properties _executable)
2331         set_target_properties(${_executable} PROPERTIES FOLDER "Executables/Extcaps")
2332
2333         set(PROGLIST ${PROGLIST} ${_executable})
2334
2335         if(WIN32)
2336                 set_target_properties(${_executable} PROPERTIES
2337                         COMPILE_OPTIONS "${WS_WARNINGS_C_FLAGS}"
2338                         LINK_FLAGS "${WS_LINK_FLAGS}"
2339                         RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/run/extcap
2340                         RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/run/Debug/extcap
2341                         RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/run/Release/extcap
2342                         RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${CMAKE_BINARY_DIR}/run/MinSizeRel/extcap
2343                         RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/run/RelWithDebInfo/extcap
2344                 )
2345         else()
2346                 set_target_properties(${_executable} PROPERTIES
2347                         COMPILE_OPTIONS "${WS_WARNINGS_C_FLAGS}"
2348                         LINK_FLAGS "${WS_LINK_FLAGS}"
2349                         RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/run/extcap
2350                 )
2351                 if(ENABLE_APPLICATION_BUNDLE)
2352                         set_target_properties(${_executable} PROPERTIES
2353                                 RUNTIME_OUTPUT_DIRECTORY run/Wireshark.app/Contents/MacOS/extcap
2354                         )
2355                         # Add a wrapper script which runs each executable from the
2356                         # correct location. This adds convenience but makes debugging
2357                         # more difficult.
2358                         file(REMOVE ${CMAKE_BINARY_DIR}/run/${_executable})
2359                         file(WRITE ${CMAKE_BINARY_DIR}/run/${_executable} "#!/bin/sh\n")
2360                         file(APPEND ${CMAKE_BINARY_DIR}/run/${_executable} "exec ${CMAKE_BINARY_DIR}/run/Wireshark.app/Contents/MacOS/extcap/${_executable} \"\$\@\"\n")
2361                         execute_process(COMMAND chmod a+x ${CMAKE_BINARY_DIR}/run/${_executable})
2362                 endif()
2363         endif()
2364 endmacro()
2365
2366 if(BUILD_wireshark_gtk AND GTK_FOUND)
2367         set(wireshark_gtk_LIBS
2368                 gtkui
2369                 ui
2370                 capchild
2371                 caputils
2372                 ${GTK2_LIBRARIES}
2373                 ${GTK3_LIBRARIES}
2374                 ${GTHREAD2_LIBRARIES}
2375                 wscodecs
2376                 ${PORTAUDIO_LIBRARIES}
2377                 ${LIBEPAN_LIBS}
2378                 ${APPLE_APPLICATION_SERVICES_LIBRARY}
2379                 ${APPLE_CORE_SERVICES_LIBRARY}
2380                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2381                 ${NL_LIBRARIES}
2382                 ${WIN_COMCTL32_LIBRARY}
2383         )
2384         # wireshark and wireshark-gtk share wireshark_FILES
2385
2386         add_executable(wireshark-gtk WIN32 ${wireshark_FILES})
2387         add_dependencies(wireshark-gtk version)
2388         set(PROGLIST ${PROGLIST} wireshark-gtk)
2389         set_target_properties(wireshark-gtk PROPERTIES COMPILE_OPTIONS "${WS_WARNINGS_C_FLAGS}")
2390         set_target_properties(wireshark-gtk PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
2391         set_target_properties(wireshark-gtk PROPERTIES FOLDER "Executables")
2392         target_link_libraries(wireshark-gtk ${wireshark_gtk_LIBS})
2393         install(TARGETS wireshark-gtk RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2394
2395         # Map for endpoints dialog
2396         ADD_CUSTOM_COMMAND(
2397                 TARGET wireshark-gtk
2398                 POST_BUILD
2399                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2400                         "${PROJECT_SOURCE_DIR}/ipmap.html"
2401                         $<TARGET_FILE_DIR:wireshark-gtk>
2402         )
2403
2404         if(WIN32)
2405                 get_target_property(_wsgtk_location wireshark-gtk LOCATION)
2406                 get_filename_component(_dll_output_dir "${_wsgtk_location}" PATH)
2407                 add_custom_target(copy_gtk_dlls)
2408                 set_target_properties(copy_gtk_dlls PROPERTIES FOLDER "Copy Tasks")
2409                 add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2410                         COMMAND ${CMAKE_COMMAND} -E make_directory "${_dll_output_dir}"
2411                 )
2412
2413                 if(GTK2_FOUND)
2414                         set(_gtk_dll_dir "${GTK2_DLL_DIR}")
2415                         set(_gtk_etc_dir "${GTK2_ETC_DIR}")
2416                         set(_gtk_dlls "${GTK2_DLLS}")
2417                         set(_gtk_etc_dir "${GTK2_ETC_DIR}")
2418                 else()
2419                         set(_gtk_dll_dir "${GTK3_DLL_DIR}")
2420                         set(_gtk_dlls "${GTK3_DLLS}")
2421                         set(_gtk_etc_dir "${GTK3_ETC_DIR}")
2422                 endif()
2423
2424                 foreach(_dll ${_gtk_dlls})
2425                         add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2426                                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2427                                         "${_gtk_dll_dir}/${_dll}" "${_dll_output_dir}"
2428                         )
2429                 endforeach(_dll)
2430
2431                 # /etc
2432                 add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2433                         COMMAND ${CMAKE_COMMAND} -E make_directory "${_dll_output_dir}/etc"
2434                 )
2435                 add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2436                         COMMAND ${CMAKE_COMMAND} -E copy_directory
2437                                 "${_gtk_etc_dir}" "${_dll_output_dir}/etc"
2438                 )
2439
2440                 # XXX - Omitting ${GTK2_LIB_DIR}\loaders copying from Makefile.nmake
2441                 if(GTK2_FOUND)
2442                         # Engines
2443                         set (_engines_output_dir "${_dll_output_dir}/lib/gtk-2.0/2.10.0/engines")
2444                         add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2445                                 COMMAND ${CMAKE_COMMAND} -E make_directory "${_engines_output_dir}"
2446                         )
2447                         foreach(_dll ${GTK2_ENGINES_DLLS})
2448                                 add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2449                                         COMMAND ${CMAKE_COMMAND} -E copy_if_different
2450                                                 "${GTK2_ENGINES_DLL_DIR}/${_dll}" "${_engines_output_dir}"
2451                                 )
2452                         endforeach(_dll)
2453
2454                         # Themes
2455                         add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2456                                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2457                                         "${GTK2_THEMES_DIR}/gtkrc" "${_dll_output_dir}/etc/gtk-2.0"
2458                         )
2459
2460                         # Modules
2461                         add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2462                                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2463                                         "${GTK2_LIB_DIR}" "${_dll_output_dir}/lib/gtk-2.0"
2464                         )
2465                 else()
2466                         add_custom_command(TARGET copy_gtk_dlls PRE_BUILD
2467                                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2468                                         "${CMAKE_SOURCE_DIR}/ui/win32/settings.ini" "${_dll_output_dir}/etc"
2469                         )
2470                 endif()
2471
2472                 add_dependencies(wireshark-gtk copy_gtk_dlls copy_cli_dlls)
2473         endif(WIN32)
2474 endif()
2475
2476 register_tap_files(tshark-tap-register.c
2477         tshark-taps
2478         ${TSHARK_TAP_SRC}
2479 )
2480
2481 if(BUILD_tshark)
2482         set(tshark_LIBS
2483                 ui
2484                 capchild
2485                 caputils
2486                 ${LIBEPAN_LIBS}
2487                 ${APPLE_CORE_FOUNDATION_LIBRARY}
2488                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2489         )
2490         set(tshark_FILES
2491                 capture_opts.c
2492                 tshark-tap-register.c
2493                 tshark.c
2494                 ${TSHARK_TAP_SRC}
2495                 ${SHARK_COMMON_SRC}
2496                 ${CMAKE_BINARY_DIR}/image/tshark.rc
2497         )
2498         add_executable(tshark ${tshark_FILES})
2499         add_dependencies(tshark version)
2500         set_extra_executable_properties(tshark "Executables")
2501         target_link_libraries(tshark ${tshark_LIBS})
2502         install(TARGETS tshark RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2503 endif()
2504
2505 if(BUILD_tfshark)
2506         set(tfshark_LIBS
2507                 ui
2508                 ${LIBEPAN_LIBS}
2509                 ${APPLE_CORE_FOUNDATION_LIBRARY}
2510                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2511         )
2512         set(tfshark_FILES
2513                 tfshark.c
2514                 ${TSHARK_TAP_SRC}
2515                 ${SHARK_COMMON_SRC}
2516                 ${CMAKE_BINARY_DIR}/image/tfshark.rc
2517         )
2518         add_executable(tfshark ${tfshark_FILES})
2519         add_dependencies(tfshark version)
2520         set_extra_executable_properties(tfshark "Executables")
2521         target_link_libraries(tfshark ${tfshark_LIBS})
2522         install(TARGETS tfshark RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2523 endif()
2524
2525 if(BUILD_rawshark AND PCAP_FOUND)
2526         set(rawshark_LIBS
2527                 caputils
2528                 ui
2529                 ${LIBEPAN_LIBS}
2530                 ${APPLE_CORE_FOUNDATION_LIBRARY}
2531                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2532         )
2533         set(rawshark_FILES
2534                 ${SHARK_COMMON_SRC}
2535                 rawshark.c
2536                 ${CMAKE_BINARY_DIR}/image/rawshark.rc
2537         )
2538         add_executable(rawshark ${rawshark_FILES})
2539         add_dependencies(rawshark version)
2540         set_extra_executable_properties(rawshark "Executables")
2541         target_link_libraries(rawshark ${rawshark_LIBS})
2542         install(TARGETS rawshark RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2543 endif()
2544
2545 if(BUILD_sharkd)
2546         set(sharkd_LIBS
2547                 ui
2548                 wscodecs
2549                 ${LIBEPAN_LIBS}
2550                 ${APPLE_CORE_FOUNDATION_LIBRARY}
2551                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2552         )
2553         set(sharkd_FILES
2554                 sharkd.c
2555                 sharkd_daemon.c
2556                 sharkd_session.c
2557                 ${SHARK_COMMON_SRC}
2558         )
2559         add_executable(sharkd ${sharkd_FILES})
2560         add_dependencies(sharkd version)
2561         set_extra_executable_properties(sharkd "Executables")
2562         target_link_libraries(sharkd ${sharkd_LIBS})
2563         install(TARGETS sharkd RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2564 endif()
2565
2566 if(BUILD_dftest)
2567         set(dftest_LIBS
2568                 ui
2569                 ${LIBEPAN_LIBS}
2570         )
2571         set(dftest_FILES
2572                 dftest.c
2573         )
2574         add_executable(dftest ${dftest_FILES})
2575         add_dependencies(dftest version)
2576         set_extra_executable_properties(dftest "Tests")
2577         target_link_libraries(dftest ${dftest_LIBS})
2578         install(TARGETS dftest RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2579 endif()
2580
2581 if(BUILD_randpkt)
2582         set(randpkt_LIBS
2583                 randpkt_core
2584                 ui
2585                 wiretap
2586                 wsutil
2587                 ${M_LIBRARIES}
2588                 ${PCAP_LIBRARIES}
2589                 ${CARES_LIBRARIES}
2590                 ${ZLIB_LIBRARIES}
2591         )
2592         set(randpkt_FILES
2593                 randpkt.c
2594                 ws_version_info.c
2595         )
2596         add_executable(randpkt ${randpkt_FILES})
2597         add_dependencies(randpkt version)
2598         set_extra_executable_properties(randpkt "Executables")
2599         target_link_libraries(randpkt ${randpkt_LIBS})
2600         install(TARGETS randpkt RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2601 endif()
2602
2603 if(BUILD_text2pcap)
2604         set(text2pcap_LIBS
2605                 writecap
2606                 wsutil
2607                 ${M_LIBRARIES}
2608                 ${ZLIB_LIBRARIES}
2609         )
2610         set(text2pcap_CLEAN_FILES
2611                 text2pcap.c
2612                 ws_version_info.c
2613         )
2614         set(text2pcap_FILES
2615                 ${text2pcap_CLEAN_FILES}
2616                 ${CMAKE_BINARY_DIR}/image/text2pcap.rc
2617         )
2618         add_lex_files(text2pcap_LEX_FILES text2pcap_GENERATED_FILES
2619                 text2pcap-scanner.l
2620         )
2621         add_executable(text2pcap ${text2pcap_FILES} ${text2pcap_GENERATED_FILES})
2622         add_dependencies(text2pcap version)
2623         set_extra_executable_properties(text2pcap "Executables")
2624         target_link_libraries(text2pcap ${text2pcap_LIBS})
2625         install(TARGETS text2pcap RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2626 endif()
2627
2628 if(BUILD_mergecap)
2629         set(mergecap_LIBS
2630                 ui
2631                 wiretap
2632                 ${ZLIB_LIBRARIES}
2633                 ${CMAKE_DL_LIBS}
2634         )
2635         set(mergecap_FILES
2636                 mergecap.c
2637                 ws_version_info.c
2638                 ${CMAKE_BINARY_DIR}/image/mergecap.rc
2639         )
2640         add_executable(mergecap ${mergecap_FILES})
2641         add_dependencies(mergecap version)
2642         set_extra_executable_properties(mergecap "Executables")
2643         target_link_libraries(mergecap ${mergecap_LIBS})
2644         install(TARGETS mergecap RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2645 endif()
2646
2647 if(BUILD_reordercap)
2648         set(reordercap_LIBS
2649                 ui
2650                 wiretap
2651                 ${ZLIB_LIBRARIES}
2652                 ${CMAKE_DL_LIBS}
2653         )
2654         set(reordercap_FILES
2655                 reordercap.c
2656                 ws_version_info.c
2657                 ${CMAKE_BINARY_DIR}/image/reordercap.rc
2658         )
2659         add_executable(reordercap ${reordercap_FILES})
2660         add_dependencies(reordercap version)
2661         set_extra_executable_properties(reordercap "Executables")
2662         target_link_libraries(reordercap ${reordercap_LIBS})
2663         install(TARGETS reordercap RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2664 endif()
2665
2666 if(BUILD_capinfos)
2667         set(capinfos_LIBS
2668                 ui
2669                 wiretap
2670                 wsutil
2671                 ${ZLIB_LIBRARIES}
2672                 ${GCRYPT_LIBRARIES}
2673                 ${CMAKE_DL_LIBS}
2674         )
2675         set(capinfos_FILES
2676                 capinfos.c
2677                 ws_version_info.c
2678                 ${CMAKE_BINARY_DIR}/image/capinfos.rc
2679         )
2680         add_executable(capinfos ${capinfos_FILES})
2681         add_dependencies(capinfos version)
2682         set_extra_executable_properties(capinfos "Executables")
2683         target_link_libraries(capinfos ${capinfos_LIBS})
2684         install(TARGETS capinfos RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2685 endif()
2686
2687 if(BUILD_captype)
2688         set(captype_LIBS
2689                 ui
2690                 wiretap
2691                 wsutil
2692                 ${ZLIB_LIBRARIES}
2693                 ${CMAKE_DL_LIBS}
2694         )
2695         set(captype_FILES
2696                 captype.c
2697                 ws_version_info.c
2698                 ${CMAKE_BINARY_DIR}/image/captype.rc
2699         )
2700         add_executable(captype ${captype_FILES})
2701         add_dependencies(captype version)
2702         set_extra_executable_properties(captype "Executables")
2703         target_link_libraries(captype ${captype_LIBS})
2704         install(TARGETS captype RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2705 endif()
2706
2707 if(BUILD_editcap)
2708         set(editcap_LIBS
2709                 ui
2710                 wiretap
2711                 ${ZLIB_LIBRARIES}
2712                 ${GCRYPT_LIBRARIES}
2713                 ${CMAKE_DL_LIBS}
2714         )
2715         set(editcap_FILES
2716                 editcap.c
2717                 ws_version_info.c
2718                 ${CMAKE_BINARY_DIR}/image/editcap.rc
2719         )
2720         add_executable(editcap ${editcap_FILES})
2721         add_dependencies(editcap version)
2722         set_extra_executable_properties(editcap "Executables")
2723         target_link_libraries(editcap ${editcap_LIBS})
2724         install(TARGETS editcap RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2725 endif()
2726
2727 if(BUILD_dumpcap AND PCAP_FOUND)
2728         set(dumpcap_LIBS
2729                 writecap
2730                 wsutil
2731                 caputils
2732                 ui
2733                 ${PCAP_LIBRARIES}
2734                 ${CAP_LIBRARIES}
2735                 ${GLIB2_LIBRARIES}
2736                 ${GTHREAD2_LIBRARIES}
2737                 ${ZLIB_LIBRARIES}
2738                 ${APPLE_CORE_FOUNDATION_LIBRARY}
2739                 ${APPLE_SYSTEM_CONFIGURATION_LIBRARY}
2740                 ${NL_LIBRARIES}
2741         )
2742         set(dumpcap_FILES
2743                 capture_opts.c
2744                 capture_stop_conditions.c
2745                 conditions.c
2746                 dumpcap.c
2747                 ringbuffer.c
2748                 sync_pipe_write.c
2749                 ws_version_info.c
2750                 ${CMAKE_BINARY_DIR}/image/dumpcap.rc
2751         )
2752         add_executable(dumpcap ${dumpcap_FILES})
2753         add_dependencies(dumpcap version)
2754         set_extra_executable_properties(dumpcap "Executables")
2755         target_link_libraries(dumpcap ${dumpcap_LIBS})
2756         install(TARGETS dumpcap
2757                         RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
2758                         PERMISSIONS ${DUMPCAP_SETUID}
2759                                 OWNER_READ OWNER_WRITE OWNER_EXECUTE
2760                                 GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
2761         )
2762         if(DUMPCAP_INSTALL_OPTION STREQUAL "capabilities")
2763                 install( CODE "execute_process(
2764                         COMMAND
2765                                 ${SETCAP_EXECUTABLE}
2766                                 cap_net_raw,cap_net_admin+ep
2767                                 ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}/dumpcap${CMAKE_EXECUTABLE_SUFFIX}
2768                         RESULT_VARIABLE
2769                                 _SETCAP_RESULT
2770                         )
2771                         if( _SETCAP_RESULT )
2772                                 message( WARNING \"setcap failed (${_SETCAP_RESULT}).\")
2773                         endif()"
2774                 )
2775         endif()
2776 endif()
2777
2778 # We have two idl2wrs utilities: this and the CORBA version in tools.
2779 # We probably shouldn't do that.
2780 if(BUILD_dcerpcidl2wrs)
2781         set(idl2wrs_LIBS
2782                 ${GLIB2_LIBRARIES}
2783                 wsutil
2784         )
2785         set(idl2wrs_FILES
2786                 epan/dissectors/dcerpc/idl2wrs.c
2787         )
2788
2789         add_executable(idl2wrs ${idl2wrs_FILES})
2790         set_target_properties(idl2wrs PROPERTIES FOLDER "Executables")
2791         set_extra_executable_properties(idl2wrs "Executables")
2792         target_link_libraries(idl2wrs ${idl2wrs_LIBS})
2793         install(TARGETS idl2wrs RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
2794 endif()
2795
2796 if (WIN32)
2797         find_package( MSVC_REDIST )
2798
2799         # Must come after executable targets are defined.
2800         find_package( NSIS )
2801
2802         if (NOT "${MAKENSIS_EXECUTABLE}" STREQUAL "MAKENSIS_EXECUTABLE-NOTFOUND")
2803                 add_subdirectory( packaging/nsis EXCLUDE_FROM_ALL )
2804                 ADD_NSIS_UNINSTALLER_TARGET()
2805                 ADD_NSIS_PACKAGE_TARGET()
2806         endif()
2807
2808         find_package( WiX )
2809
2810         if (NOT "${WIX_CANDLE_EXECUTABLE}" STREQUAL "WIX_CANDLE_EXECUTABLE-NOTFOUND")
2811                 add_subdirectory( packaging/wix EXCLUDE_FROM_ALL )
2812                 ADD_WIX_PACKAGE_TARGET()
2813         endif()
2814
2815         find_package( PortableApps )
2816         if (
2817                 NOT "${PORTABLEAPPS_LAUNCHER_GENERATOR_EXECUTABLE}" STREQUAL "PORTABLEAPPS_LAUNCHER_GENERATOR_EXECUTABLE-NOTFOUND"
2818                 AND
2819                 NOT "${PORTABLEAPPS_INSTALLER_EXECUTABLE}" STREQUAL "PORTABLEAPPS_INSTALLER_EXECUTABLE-NOTFOUND"
2820         )
2821                 add_subdirectory( packaging/portableapps EXCLUDE_FROM_ALL )
2822                 ADD_PORTABLEAPPS_PACKAGE_TARGET()
2823         endif()
2824 endif()
2825
2826 add_custom_target(extcaps)
2827
2828 if(ENABLE_EXTCAP AND BUILD_androiddump)
2829         if(EXTCAP_ANDROIDDUMP_LIBPCAP)
2830                 if(HAVE_LIBPCAP)
2831                         set(androiddump_LIBS
2832                                 ui
2833                                 ${GLIB2_LIBRARIES}
2834                                 ${PCAP_LIBRARIES}
2835                         )
2836                 else()
2837                         message(FATAL_ERROR "You try to build androiddump with libpcap but do not have it")
2838                 endif()
2839         else()
2840                 set(androiddump_LIBS
2841                         ui
2842                         wiretap
2843                         ${GLIB2_LIBRARIES}
2844                         ${CMAKE_DL_LIBS}
2845                 )
2846         endif()
2847         set(androiddump_FILES
2848                 extcap/androiddump.c
2849                 extcap/extcap-base.c
2850         )
2851
2852         add_executable(androiddump WIN32 ${androiddump_FILES})
2853         # XXX Shouldn't we add wsutil to androiddump_LIBS instead?
2854         set_extcap_executable_properties(androiddump)
2855         target_link_libraries(androiddump ${androiddump_LIBS})
2856         install(TARGETS androiddump RUNTIME DESTINATION ${EXTCAP_DIR})
2857         add_dependencies(extcaps androiddump)
2858 endif()
2859
2860 if(ENABLE_EXTCAP AND BUILD_sshdump AND LIBSSH_FOUND)
2861         set(sshdump_LIBS
2862                 wsutil
2863                 ${GLIB2_LIBRARIES}
2864                 ${CMAKE_DL_LIBS}
2865                 ${LIBSSH_LIBRARIES}
2866         )
2867         set(sshdump_FILES
2868                 extcap/sshdump.c
2869                 extcap/extcap-base.c
2870                 extcap/ssh-base.c
2871         )
2872
2873         add_executable(sshdump WIN32 ${sshdump_FILES})
2874         set_extcap_executable_properties(sshdump)
2875         target_link_libraries(sshdump ${sshdump_LIBS})
2876         target_include_directories(sshdump PUBLIC ${LIBSSH_INCLUDE_DIR})
2877         install(TARGETS sshdump RUNTIME DESTINATION ${EXTCAP_DIR})
2878         add_dependencies(extcaps sshdump)
2879 elseif (BUILD_sshdump)
2880         #message( WARNING "Cannot find libssh, cannot build sshdump" )
2881 endif()
2882
2883 if(ENABLE_EXTCAP AND BUILD_ciscodump AND LIBSSH_FOUND)
2884         set(ciscodump_LIBS
2885                 writecap
2886                 wsutil
2887                 ${GLIB2_LIBRARIES}
2888                 ${CMAKE_DL_LIBS}
2889                 ${LIBSSH_LIBRARIES}
2890         )
2891         set(ciscodump_FILES
2892                 extcap/ciscodump.c
2893                 extcap/extcap-base.c
2894                 extcap/ssh-base.c
2895         )
2896
2897         add_executable(ciscodump WIN32 ${ciscodump_FILES})
2898         set_extcap_executable_properties(ciscodump)
2899         target_link_libraries(ciscodump ${ciscodump_LIBS})
2900         target_include_directories(ciscodump PUBLIC ${LIBSSH_INCLUDE_DIR})
2901         install(TARGETS ciscodump RUNTIME DESTINATION ${EXTCAP_DIR})
2902         add_dependencies(extcaps ciscodump)
2903 elseif (BUILD_ciscodump)
2904         #message( WARNING "Cannot find libssh, cannot build ciscodump" )
2905 endif()
2906
2907 if(ENABLE_EXTCAP AND BUILD_udpdump)
2908         set(udpdump_LIBS
2909                 ${GLIB2_LIBRARIES}
2910                 ${CMAKE_DL_LIBS}
2911                 wsutil
2912                 writecap
2913         )
2914         set(udpdump_FILES
2915                 extcap/udpdump.c
2916                 extcap/extcap-base.c
2917         )
2918
2919         add_executable(udpdump WIN32 ${udpdump_FILES})
2920         set_extcap_executable_properties(udpdump)
2921         target_link_libraries(udpdump ${udpdump_LIBS})
2922         install(TARGETS udpdump RUNTIME DESTINATION ${EXTCAP_DIR})
2923         add_dependencies(extcaps udpdump)
2924 endif()
2925
2926 if(ENABLE_EXTCAP AND BUILD_randpktdump)
2927         set(randpktdump_LIBS
2928                 randpkt_core
2929                 ui
2930                 wiretap
2931                 ${GLIB2_LIBRARIES}
2932                 ${CMAKE_DL_LIBS}
2933         )
2934         set(randpktdump_FILES
2935                 extcap/extcap-base.c
2936                 extcap/randpktdump.c
2937         )
2938
2939         add_executable(randpktdump WIN32 ${randpktdump_FILES})
2940         # XXX Shouldn't we add wsutil to randpktdump_LIBS instead?
2941         set_extcap_executable_properties(randpktdump)
2942         target_link_libraries(randpktdump ${randpktdump_LIBS})
2943         install(TARGETS randpktdump RUNTIME DESTINATION ${EXTCAP_DIR})
2944         add_dependencies(extcaps randpktdump)
2945 endif()
2946
2947 if(ENABLE_APPLICATION_BUNDLE)
2948         add_custom_target(app_bundle)
2949         set_target_properties(app_bundle PROPERTIES FOLDER "Copy Tasks")
2950         add_custom_command(TARGET app_bundle
2951                 POST_BUILD
2952                 COMMAND "${CMAKE_SOURCE_DIR}/packaging/macosx/osx-app.sh"
2953                 WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/run"
2954         )
2955         add_dependencies(app_bundle ${PROGLIST})
2956
2957         add_custom_target(dmg_package_prep DEPENDS app_bundle)
2958
2959         ADD_CUSTOM_COMMAND(
2960                 OUTPUT ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo
2961                 COMMAND ${CMAKE_COMMAND} -E echo APPLWshk > ${CMAKE_BINARY_DIR}/packaging/macosx/PkgInfo
2962         )
2963
2964         ADD_CUSTOM_TARGET( dmg_package
2965                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2966                                         "${PROJECT_SOURCE_DIR}/ipmap.html"
2967                                         $<TARGET_FILE_DIR:wireshark>
2968                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2969                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/ChmodBPF
2970                                         ${CMAKE_BINARY_DIR}/run/ChmodBPF
2971                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2972                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/Resources
2973                                         ${CMAKE_BINARY_DIR}/run/Resources
2974                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2975                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/Scripts
2976                                         ${CMAKE_BINARY_DIR}/run/Scripts
2977                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2978                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/utility-launcher
2979                                         ${CMAKE_BINARY_DIR}/run/utility-launcher
2980                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2981                                         ${CMAKE_SOURCE_DIR}/COPYING
2982                                         ${CMAKE_BINARY_DIR}/run/COPYING.txt
2983                 COMMAND ${CMAKE_COMMAND} -E copy_directory
2984                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/Wireshark_package.pmdoc
2985                                         ${CMAKE_BINARY_DIR}/run/Wireshark_package.pmdoc
2986                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2987                                         ${CMAKE_BINARY_DIR}/packaging/macosx/Wireshark_package.pmdoc/index.xml
2988                                         ${CMAKE_BINARY_DIR}/run/Wireshark_package.pmdoc/index.xml
2989                 COMMAND ${CMAKE_COMMAND} -E copy_if_different
2990                                         ${CMAKE_SOURCE_DIR}/packaging/macosx/dmg_background.png
2991                                         ${CMAKE_BINARY_DIR}/run/dmg_background.png
2992                 COMMAND bash -x ${CMAKE_BINARY_DIR}/packaging/macosx/osx-dmg.sh
2993                         --source-directory ${CMAKE_SOURCE_DIR}/packaging/macosx
2994                 # Unlike nsis_package_prep + nsis_package, we can add a direct
2995                 # dependency here.
2996                 DEPENDS dmg_package_prep
2997                 # We create Wireshark.app in "run". Do our work there.
2998                 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/run
2999         )
3000
3001 endif()
3002
3003 set(CLEAN_C_FILES
3004         ${wireshark_FILES}
3005         ${tshark_FILES}
3006         ${rawshark_FILES}
3007         ${dftest_FILES}
3008         ${randpkt_FILES}
3009         ${randpktdump_FILES}
3010         ${udpdump_FILES}
3011         ${text2pcap_CLEAN_FILES}
3012         ${mergecap_FILES}
3013         ${capinfos_FILES}
3014         ${captype_FILES}
3015         ${editcap_FILES}
3016         ${idl2wrs_FILES}
3017         ${dumpcap_FILES}
3018         ${androiddump_FILES}
3019         ${sshdump_FILES}
3020         ${ciscodump_FILES}
3021         ${udpdump_FILES}
3022 )
3023
3024 # Make sure we don't pass /WX to rc.exe. Rc doesn't have a /WX flag,
3025 # but it does have /W (warn about invalid code pages) and /X (ignore
3026 # the INCLUDE environment variable).
3027 # This should apparently be handled for us via CMAKE_RC_FLAG_REGEX
3028 # in CMakeRCInformation.cmake but that doesn't appear to work.
3029 if (WIN32)
3030         list(FILTER CLEAN_C_FILES EXCLUDE REGEX ".*\\.rc")
3031 endif (WIN32)
3032
3033 set_source_files_properties(
3034         ${CLEAN_C_FILES}
3035         PROPERTIES
3036         COMPILE_FLAGS "${WERROR_COMMON_FLAGS}"
3037 )
3038
3039 install(
3040         FILES
3041                 ${INSTALL_FILES}
3042         DESTINATION
3043                 ${CMAKE_INSTALL_DATADIR}/${CPACK_PACKAGE_NAME}
3044 )
3045
3046 set(SHARK_PUBLIC_HEADERS
3047         cfile.h
3048         file.h
3049         register.h
3050         globals.h
3051         log.h
3052         ws_symbol_export.h
3053         ws_attributes.h
3054         ws_diag_control.h
3055 )
3056
3057 if(NOT WIN32)
3058         install(
3059                 FILES
3060                         ${SHARK_PUBLIC_HEADERS}
3061                 DESTINATION
3062                         ${CMAKE_INSTALL_INCLUDEDIR}/${CPACK_PACKAGE_NAME}
3063         )
3064 endif()
3065
3066 # Install icons and other desktop files for Freedesktop.org-compliant desktops.
3067 if(((BUILD_wireshark AND QT_FOUND) OR BUILD_wireshark_gtk) AND NOT (WIN32 OR APPLE))
3068         install(FILES wireshark-mime-package.xml
3069                 DESTINATION "${CMAKE_INSTALL_DATADIR}/mime/packages"
3070                 RENAME wireshark.xml
3071         )
3072         install(FILES wireshark.appdata.xml
3073                 DESTINATION "${CMAKE_INSTALL_DATADIR}/appdata"
3074         )
3075         if(BUILD_wireshark AND QT_FOUND)
3076                 install(FILES wireshark.desktop
3077                         DESTINATION "${CMAKE_INSTALL_DATADIR}/applications")
3078         endif()
3079         if(BUILD_wireshark_gtk)
3080                 install(FILES wireshark-gtk.desktop
3081                         DESTINATION "${CMAKE_INSTALL_DATADIR}/applications")
3082         endif()
3083         foreach(size 16 24 32 48 64 128 256)
3084                 install(FILES image/wsicon${size}.png
3085                         DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/${size}x${size}/apps"
3086                         RENAME wireshark.png)
3087                 install(FILES image/WiresharkDoc-${size}.png
3088                         DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/${size}x${size}/mimetypes"
3089                         RENAME application-wireshark-doc.png)
3090         endforeach()
3091         install(FILES image/wsicon.svg
3092                 DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps"
3093                 RENAME wireshark.svg)
3094 endif()
3095
3096 install(
3097         FILES
3098                 "${CMAKE_BINARY_DIR}/wireshark.pc"
3099         DESTINATION
3100                 ${CMAKE_INSTALL_LIBDIR}/pkgconfig
3101 )
3102
3103 install(
3104         DIRECTORY
3105                 ${INSTALL_DIRS}
3106         DIRECTORY_PERMISSIONS
3107                 OWNER_EXECUTE OWNER_WRITE OWNER_READ
3108                 GROUP_EXECUTE GROUP_READ
3109                 WORLD_EXECUTE WORLD_READ
3110         DESTINATION
3111                 ${CMAKE_INSTALL_DATADIR}/${CPACK_PACKAGE_NAME}
3112         PATTERN ".git" EXCLUDE
3113         PATTERN ".svn" EXCLUDE
3114         PATTERN "Makefile.*" EXCLUDE
3115 )
3116
3117 set(CMAKE_INSTALL_MODULES_DIR ${CMAKE_INSTALL_LIBDIR}/${CPACK_PACKAGE_NAME})
3118 configure_file("${CMAKE_MODULE_PATH}/WiresharkConfig.cmake.in" "${CMAKE_BINARY_DIR}/WiresharkConfig.cmake" @ONLY)
3119 configure_file("${CMAKE_MODULE_PATH}/WiresharkConfigVersion.cmake.in" "${CMAKE_BINARY_DIR}/WiresharkConfigVersion.cmake" @ONLY)
3120 install(
3121         FILES
3122                 ${CMAKE_MODULE_PATH}/FindGLIB2.cmake
3123                 ${CMAKE_MODULE_PATH}/FindWireshark.cmake
3124                 ${CMAKE_MODULE_PATH}/FindWSWinLibs.cmake
3125                 ${CMAKE_MODULE_PATH}/UseAsn2Wrs.cmake
3126                 ${CMAKE_MODULE_PATH}/LocatePythonModule.cmake
3127                 ${CMAKE_MODULE_PATH}/UseMakeDissectorReg.cmake
3128                 ${CMAKE_BINARY_DIR}/WiresharkConfig.cmake
3129                 ${CMAKE_BINARY_DIR}/WiresharkConfigVersion.cmake
3130         DESTINATION
3131                 ${CMAKE_INSTALL_MODULES_DIR}
3132 )
3133
3134 if(DOC_DIR)
3135         message(STATUS "Docdir install: ${DOC_DIR}")
3136         INSTALL(
3137                 DIRECTORY
3138                         ${CMAKE_BINARY_DIR}/docbook/
3139                 DIRECTORY_PERMISSIONS
3140                         OWNER_EXECUTE OWNER_WRITE OWNER_READ
3141                         GROUP_EXECUTE GROUP_READ
3142                         WORLD_EXECUTE WORLD_READ
3143                 DESTINATION
3144                         ${DOC_DIR}/guides
3145                 FILES_MATCHING
3146                 PATTERN "*.pdf"
3147         )
3148 endif()
3149
3150 # Test suite wrapper
3151 if(ENABLE_APPLICATION_BUNDLE)
3152         set(TEST_SH_BIN_DIR ${CMAKE_BINARY_DIR}/run)
3153 else()
3154         set(TEST_SH_BIN_DIR $<TARGET_FILE_DIR:epan>)
3155 endif()
3156
3157 add_custom_target(test-sh
3158         COMMAND ${CMAKE_COMMAND}
3159                 -DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}
3160                 -DTEST_SH_BIN_DIR=${TEST_SH_BIN_DIR}
3161                 -DTEST_SH_SRC_DIR=${CMAKE_SOURCE_DIR}/test
3162                 -P ${CMAKE_SOURCE_DIR}/cmake/modules/GenerateTestSh.cmake
3163         DEPENDS ${CMAKE_SOURCE_DIR}/cmake/modules/GenerateTestSh.cmake
3164 )
3165 set_target_properties(test-sh PROPERTIES FOLDER "Tests")
3166
3167 if (GIT_EXECUTABLE)
3168         # Update AUTHORS file with entries from git shortlog
3169         add_custom_target(
3170                 gen-authors
3171                 COMMAND ${PERL_EXECUTABLE} tools/generate_authors.pl AUTHORS.src > AUTHORS
3172                 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
3173         )
3174 else (GIT_EXECUTABLE)
3175         add_custom_target( gen-authors COMMAND ${CMAKE_COMMAND} -E echo "Git not found." )
3176 endif (GIT_EXECUTABLE)
3177 set_target_properties(gen-authors PROPERTIES FOLDER "Docs")
3178
3179 add_custom_target(test-programs
3180         DEPENDS test-sh
3181                 exntest
3182                 oids_test
3183                 reassemble_test
3184                 tvbtest
3185                 wmem_test
3186         COMMENT "Building unit test programs and wrapper"
3187 )
3188 set_target_properties(test-programs PROPERTIES FOLDER "Tests")
3189
3190 if (WIN32)
3191         file (TO_NATIVE_PATH ${CMAKE_SOURCE_DIR}/tools/Get-HardenFlags.ps1 _win_harden_flags)
3192         add_custom_target(hardening-check
3193                 COMMAND ${POWERSHELL_COMMAND} "${_win_harden_flags}" "${_dll_output_dir_win}"
3194                 DEPENDS ${PROGLIST}
3195                 COMMENT "Checking binaries for security features"
3196         )
3197         set_target_properties(hardening-check PROPERTIES FOLDER "Tests")
3198 else ()
3199         find_program(HARDENING_CHECK_EXECUTABLE hardening-check
3200                 DOC "Path to the hardening-check utility."
3201         )
3202         if (NOT "${HARDENING_CHECK_EXECUTABLE}" STREQUAL "HARDENING_CHECK_EXECUTABLE-NOTFOUND")
3203                 foreach(_prog ${PROGLIST})
3204                         get_target_property(_prog_dir ${_prog} RUNTIME_OUTPUT_DIRECTORY)
3205                         if ("${_prog_dir}" STREQUAL "_prog_dir-NOTFOUND")
3206                                 set(_prog_dir "${CMAKE_BINARY_DIR}/run")
3207                         endif()
3208                         set(_prog_paths ${_prog_paths} "${_prog_dir}/${_prog}")
3209                 endforeach()
3210                 add_custom_target(hardening-check
3211                         COMMAND ${HARDENING_CHECK_EXECUTABLE} ${_prog_paths}
3212                         DEPENDS ${PROGLIST}
3213                         COMMENT "Checking binaries for security features"
3214                 )
3215         endif()
3216 endif()
3217
3218 include( UseCheckAPI )
3219 CHECKAPI(
3220         NAME
3221           main
3222         SWITCHES
3223           -build
3224         SOURCES
3225           ${WIRESHARK_SRC}
3226           ${TSHARK_TAP_SRC}
3227 )
3228
3229 find_program(SHELLCHECK_EXECUTABLE shellcheck
3230         DOC "Path to the shellcheck utility."
3231 )
3232 if (NOT "${SHELLCHECK_EXECUTABLE}" STREQUAL "SHELLCHECK_EXECUTABLE-NOTFOUND")
3233         add_custom_target(shellcheck)
3234         set_target_properties(shellcheck PROPERTIES FOLDER "Tests")
3235         # --external-sources requires 0.4.0 or later.
3236         add_custom_command(TARGET shellcheck POST_BUILD
3237                 COMMAND shellcheck --external-sources
3238                         tools/fuzz-test.sh
3239                         tools/randpkt-test.sh
3240                         tools/runa2x.sh
3241                         tools/test-captures.sh
3242                         tools/valgrind-wireshark.sh
3243                 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
3244         )
3245 endif()
3246
3247 #
3248 # Editor modelines  -  http://www.wireshark.org/tools/modelines.html
3249 #
3250 # Local variables:
3251 # c-basic-offset: 8
3252 # tab-width: 8
3253 # indent-tabs-mode: t
3254 # End:
3255 #
3256 # vi: set shiftwidth=8 tabstop=8 noexpandtab:
3257 # :indentSize=8:tabSize=8:noTabs=false:
3258 #