1 cmake_minimum_required(VERSION 2.8.6) 2 3 # 4 # Apple doesn't build with an install_name starting with @rpath, and 5 # neither do we with autotools; don't do so with CMake, either, and 6 # suppress warnings about that. 7 # 8 if(POLICY CMP0042) 9 cmake_policy(SET CMP0042 OLD) 10 endif() 11 12 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) 13 14 project(pcap) 15 16 # 17 # Try to enable as many C99 features as we can. 18 # At minimum, we want C++/C99-style // comments. 19 # 20 # Newer versions of compilers might default to supporting C99, but older 21 # versions may require a special flag. 22 # 23 # Prior to CMake 3.1, setting CMAKE_C_STANDARD will not have any effect, 24 # so, unless and until we require CMake 3.1 or later, we have to do it 25 # ourselves on pre-3.1 CMake, so we just do it ourselves on all versions 26 # of CMake. 27 # 28 # Note: with CMake 3.1 through 3.5, the only compilers for which CMake 29 # handles CMAKE_C_STANDARD are GCC and Clang. 3.6 adds support only 30 # for Intel C; 3.9 adds support for PGI C, Sun C, and IBM XL C, and 31 # 3.10 adds support for Cray C and IAR C, but no version of CMake has 32 # support for HP C. Therefore, even if we use CMAKE_C_STANDARD with 33 # compilers for which CMake supports it, we may still have to do it 34 # ourselves on other compilers. 35 # 36 # See the CMake documentation for the CMAKE_<LANG>_COMPILER_ID variables 37 # for a list of compiler IDs. 38 # 39 # We don't worry about MSVC; it doesn't have such a flag - either it 40 # doesn't support the C99 features we need at all, or it supports them 41 # regardless of the compiler flag. 42 # 43 # XXX - this just tests whether the option works and adds it if it does. 44 # We don't test whether it's necessary in order to get the C99 features 45 # that we use; if we ever have a user who tries to compile with a compiler 46 # that can't be made to support those features, we can add a test to make 47 # sure we actually *have* C99 support. 48 # 49 include(CheckCCompilerFlag) 50 macro(check_and_add_compiler_option _option) 51 message(STATUS "Checking C compiler flag ${_option}") 52 string(REPLACE "=" "-" _temp_option_variable ${_option}) 53 string(REGEX REPLACE "^-" "" _option_variable ${_temp_option_variable}) 54 check_c_compiler_flag("${_option}" ${_option_variable}) 55 if(${${_option_variable}}) 56 set(C_ADDITIONAL_FLAGS "${C_ADDITIONAL_FLAGS} ${_option}") 57 endif() 58 endmacro() 59 60 set(C_ADDITIONAL_FLAGS "") 61 if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR 62 CMAKE_C_COMPILER_ID MATCHES "Clang") 63 check_and_add_compiler_option("-std=gnu99") 64 elseif(CMAKE_C_COMPILER_ID MATCHES "XL") 65 # 66 # We want support for extensions picked up for GNU C compatibility, 67 # so we use -qlanglvl=extc99. 68 # 69 check_and_add_compiler_option("-qlanglvl=extc99") 70 elseif(CMAKE_C_COMPILER_ID MATCHES "HP") 71 check_and_add_compiler_option("-AC99") 72 elseif(CMAKE_C_COMPILER_ID MATCHES "Sun") 73 check_and_add_compiler_option("-xc99") 74 elseif(CMAKE_C_COMPILER_ID MATCHES "Intel") 75 check_and_add_compiler_option("-c99") 76 endif() 77 78 # 79 # Build all runtimes in the top-level binary directory; that way, 80 # on Windows, the executables will be in the same directory as 81 # the DLLs, so the system will find pcap.dll when any of the 82 # executables are run. 83 # 84 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/run) 85 86 ################################################################### 87 # Parameters 88 ################################################################### 89 90 if(WIN32) 91 # 92 # On Windows, allow the library name to be overridden, for the 93 # benefit of projects that combine libpcap with their own 94 # kernel-mode code to support capturing. 95 # 96 set(LIBRARY_NAME pcap CACHE STRING "Library name") 97 else() 98 # 99 # On UN*X, it's always been libpcap. 100 # 101 set(LIBRARY_NAME pcap) 102 endif() 103 104 option(INET6 "Enable IPv6" ON) 105 if(WIN32) 106 option(USE_STATIC_RT "Use static Runtime" ON) 107 endif(WIN32) 108 option(BUILD_SHARED_LIBS "Build shared libraries" ON) 109 if(WIN32) 110 set(PACKET_DLL_DIR "" CACHE PATH "Path to directory with include and lib subdirectories for packet.dll") 111 endif(WIN32) 112 113 # To pacify those who hate the protochain instruction 114 option(NO_PROTOCHAIN "Disable protochain instruction" OFF) 115 116 # 117 # Start out with the capture mechanism type unspecified; the user 118 # can explicitly specify it and, if they don't, we'll pick an 119 # appropriate one. 120 # 121 set(PCAP_TYPE "" CACHE STRING "Packet capture type") 122 123 # 124 # Default to having remote capture support on Windows and, for now, to 125 # not having it on UN*X. 126 # 127 if(WIN32) 128 option(ENABLE_REMOTE "Enable remote capture" ON) 129 else() 130 option(ENABLE_REMOTE "Enable remote capture" OFF) 131 endif(WIN32) 132 133 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 134 option(PCAP_SUPPORT_PACKET_RING "Enable Linux packet ring support" ON) 135 option(BUILD_WITH_LIBNL "Build with libnl" ON) 136 endif() 137 138 # 139 # By default, build universal with the appropriate set of architectures 140 # for the OS on which we're doing the build. 141 # 142 if(APPLE AND "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "") 143 # 144 # Get the major version of Darwin. 145 # 146 string(REGEX MATCH "^([0-9]+)" SYSTEM_VERSION_MAJOR "${CMAKE_SYSTEM_VERSION}") 147 148 if(SYSTEM_VERSION_MAJOR LESS 8) 149 # 150 # Pre-Tiger. Build only for 32-bit PowerPC. 151 # 152 set(CMAKE_OSX_ARCHITECTURES "ppc") 153 elseif(SYSTEM_VERSION_MAJOR EQUAL 8) 154 # 155 # Tiger. Is this prior to, or with, Intel support? 156 # 157 # Get the minor version of Darwin. 158 # 159 string(REPLACE "${SYSTEM_VERSION_MAJOR}." "" SYSTEM_MINOR_AND_PATCH_VERSION ${CMAKE_SYSTEM_VERSION}) 160 string(REGEX MATCH "^([0-9]+)" SYSTEM_VERSION_MINOR "${SYSTEM_MINOR_AND_PATCH_VERSION}") 161 if(SYSTEM_VERSION_MINOR LESS 4) 162 # 163 # Prior to Intel support. Build for 32-bit 164 # PowerPC and 64-bit PowerPC, with 32-bit PowerPC 165 # first. (I'm guessing that's what Apple does.) 166 # 167 set(CMAKE_OSX_ARCHITECTURES "ppc;ppc64") 168 elseif(SYSTEM_VERSION_MINOR LESS 7) 169 # 170 # With Intel support but prior to x86-64 support. 171 # Build for 32-bit PowerPC, 64-bit PowerPC, and x86, 172 # with 32-bit PowerPC first. 173 # (I'm guessing that's what Apple does.) 174 # 175 set(CMAKE_OSX_ARCHITECTURES "ppc;ppc64;i386") 176 else() 177 # 178 # With Intel support including x86-64 support. 179 # Build for 32-bit PowerPC, 64-bit PowerPC, x86, 180 # and x86-64, with 32-bit PowerPC first. 181 # (I'm guessing that's what Apple does.) 182 # 183 set(CMAKE_OSX_ARCHITECTURES "ppc;ppc64;i386;x86_64") 184 endif() 185 elseif(SYSTEM_VERSION_MAJOR EQUAL 9) 186 # 187 # Leopard. Build for 32-bit PowerPC, 64-bit 188 # PowerPC, x86, and x86-64, with 32-bit PowerPC 189 # first. (That's what Apple does.) 190 # 191 set(CMAKE_OSX_ARCHITECTURES "ppc;ppc64;i386;x86_64") 192 elseif(SYSTEM_VERSION_MAJOR EQUAL 10) 193 # 194 # Snow Leopard. Build for x86-64, x86, and 195 # 32-bit PowerPC, with x86-64 first. (That's 196 # what Apple does, even though Snow Leopard 197 # doesn't run on PPC, so PPC libpcap runs under 198 # Rosetta, and Rosetta doesn't support BPF 199 # ioctls, so PPC programs can't do live 200 # captures.) 201 # 202 set(CMAKE_OSX_ARCHITECTURES "x86_64;i386;ppc") 203 else() 204 # 205 # Post-Snow Leopard. Build for x86-64 and 206 # x86, with x86-64 first. (That's probably what 207 # Apple does, given that Rosetta is gone.) 208 # XXX - update if and when Apple drops support 209 # for 32-bit x86 code. 210 # 211 set(CMAKE_OSX_ARCHITECTURES "x86_64;i386") 212 endif() 213 endif() 214 215 # 216 # Additional capture modules. 217 # 218 option(DISABLE_USB "Disable USB sniffing support" OFF) 219 option(DISABLE_BLUETOOTH "Disable Bluetooth sniffing support" OFF) 220 option(DISABLE_NETMAP "Disable netmap support" OFF) 221 # 222 # We don't support D-Bus sniffing on macOS; see 223 # 224 # https://bugs.freedesktop.org/show_bug.cgi?id=74029 225 # 226 if(APPLE) 227 option(DISABLE_DBUS "Disable D-Bus sniffing support" ON) 228 else(APPLE) 229 option(DISABLE_DBUS "Disable D-Bus sniffing support" OFF) 230 endif(APPLE) 231 option(DISABLE_RDMA "Disable RDMA sniffing support" OFF) 232 233 option(DISABLE_DAG "Disable Endace DAG card support" OFF) 234 235 option(DISABLE_SEPTEL "Disable Septel card support" OFF) 236 set(SEPTEL_ROOT "${CMAKE_SOURCE_DIR}/../septel" CACHE PATH "Path to directory with include and lib subdirectories for Septel API") 237 238 option(DISABLE_SNF "Disable Myricom SNF support" OFF) 239 240 option(DISABLE_TC "Disable Riverbed TurboCap support" OFF) 241 242 # 243 # Debugging options. 244 # 245 option(BDEBUG "Build optimizer debugging code" OFF) 246 option(YYDEBUG "Build parser debugging code" OFF) 247 248 ################################################################### 249 # Versioning 250 ################################################################### 251 252 # Get, parse, format and set pcap's version string from [pcap_root]/VERSION 253 # for later use. 254 255 # Get MAJOR, MINOR, PATCH & SUFFIX 256 file(STRINGS ${pcap_SOURCE_DIR}/VERSION 257 PACKAGE_VERSION 258 LIMIT_COUNT 1 # Read only the first line 259 ) 260 261 # Get "just" MAJOR 262 string(REGEX MATCH "^([0-9]+)" PACKAGE_VERSION_MAJOR "${PACKAGE_VERSION}") 263 264 # Get MAJOR, MINOR & PATCH 265 string(REGEX MATCH "^([0-9]+.)?([0-9]+.)?([0-9]+)" PACKAGE_VERSION_NOSUFFIX "${PACKAGE_VERSION}") 266 267 if(WIN32) 268 # Convert PCAP_VERSION_NOSUFFIX to Windows preferred version format 269 string(REPLACE "." "," PACKAGE_VERSION_PREDLL ${PACKAGE_VERSION_NOSUFFIX}) 270 271 # Append NANO (used for Windows internal versioning) to PCAP_VERSION_PREDLL 272 # 0 means unused. 273 set(PACKAGE_VERSION_DLL ${PACKAGE_VERSION_PREDLL},0) 274 endif(WIN32) 275 276 set(PACKAGE_NAME "${LIBRARY_NAME}") 277 set(PACKAGE_STRING "${LIBRARY_NAME} ${PACKAGE_VERSION}") 278 279 ###################################### 280 # Project settings 281 ###################################### 282 283 add_definitions(-DHAVE_CONFIG_H) 284 285 include_directories( 286 ${CMAKE_CURRENT_BINARY_DIR} 287 ${pcap_SOURCE_DIR} 288 ) 289 290 include(CheckFunctionExists) 291 include(CMakePushCheckState) 292 293 if(WIN32) 294 295 if(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/../../Common) 296 include_directories(${CMAKE_HOME_DIRECTORY}/../../Common) 297 endif(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/../../Common) 298 299 find_package(Packet) 300 if(PACKET_FOUND) 301 set(HAVE_PACKET32 TRUE) 302 include_directories(${PACKET_INCLUDE_DIRS}) 303 # 304 # Check whether we have the NPcap PacketIsLoopbackAdapter() 305 # function. 306 # 307 cmake_push_check_state() 308 set(CMAKE_REQUIRED_LIBRARIES ${PACKET_LIBRARIES}) 309 check_function_exists(PacketIsLoopbackAdapter HAVE_PACKET_IS_LOOPBACK_ADAPTER) 310 cmake_pop_check_state() 311 endif(PACKET_FOUND) 312 313 endif(WIN32) 314 315 if(MSVC) 316 add_definitions(-D__STDC__) 317 add_definitions(-D_CRT_SECURE_NO_WARNINGS) 318 endif(MSVC) 319 320 if(USE_STATIC_RT) 321 message(STATUS "Use STATIC runtime") 322 if(MSVC) 323 foreach(RT_FLAG 324 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE 325 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO 326 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE 327 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) 328 string(REGEX REPLACE "/MD" "/MT" ${RT_FLAG} "${${RT_FLAG}}") 329 endforeach(RT_FLAG) 330 elseif(MINGW) 331 set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc") 332 endif() 333 else (USE_STATIC_RT) 334 message(STATUS "Use DYNAMIC runtime") 335 endif(USE_STATIC_RT) 336 337 ################################################################### 338 # Detect available platform features 339 ################################################################### 340 341 include(CheckIncludeFile) 342 include(CheckIncludeFiles) 343 include(CheckStructHasMember) 344 include(CheckTypeSize) 345 346 # 347 # Header files. 348 # 349 check_include_file(inttypes.h HAVE_INTTYPES_H) 350 check_include_file(stdint.h HAVE_STDINT_H) 351 check_include_file(unistd.h HAVE_UNISTD_H) 352 if(NOT HAVE_UNISTD_H) 353 add_definitions(-DYY_NO_UNISTD_H) 354 endif(NOT HAVE_UNISTD_H) 355 check_include_file(bitypes.h HAVE_SYS_BITYPES_H) 356 if(NOT WIN32) 357 check_include_file(sys/ioccom.h HAVE_SYS_IOCCOM_H) 358 check_include_file(sys/sockio.h HAVE_SYS_SOCKIO_H) 359 check_include_file(sys/select.h HAVE_SYS_SELECT_H) 360 endif(NOT WIN32) 361 check_include_file(limits.h HAVE_LIMITS_H) 362 if(NOT WIN32) 363 check_include_file(netpacket/packet.h HAVE_NETPACKET_PACKET_H) 364 check_include_files("sys/types.h;sys/socket.h;net/if.h;net/pfvar.h" HAVE_NET_PFVAR_H) 365 if(HAVE_NET_PFVAR_H) 366 # 367 # Check for various PF actions. 368 # 369 check_c_source_compiles( 370 "#include <sys/types.h> 371 #include <sys/socket.h> 372 #include <net/if.h> 373 #include <net/pfvar.h> 374 375 int 376 main(void) 377 { 378 return PF_NAT+PF_NONAT+PF_BINAT+PF_NOBINAT+PF_RDR+PF_NORDR; 379 } 380 " 381 HAVE_PF_NAT_THROUGH_PF_NORDR) 382 endif(HAVE_NET_PFVAR_H) 383 check_include_file(netinet/if_ether.h HAVE_NETINET_IF_ETHER_H) 384 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 385 check_include_file(linux/sockios.h HAVE_LINUX_SOCKIOS_H) 386 # 387 # linux/if_bonding.h requires sys/socket.h. 388 # 389 check_include_files("sys/socket.h;linux/if_bonding.h" HAVE_LINUX_IF_BONDING_H) 390 endif() 391 endif(NOT WIN32) 392 393 # 394 # Functions. 395 # 396 check_function_exists(strerror HAVE_STRERROR) 397 check_function_exists(strerror_r HAVE_STRERROR_R) 398 check_function_exists(strerror_s HAVE_STRERROR_S) 399 check_function_exists(strlcpy HAVE_STRLCPY) 400 check_function_exists(strlcat HAVE_STRLCAT) 401 check_function_exists(snprintf HAVE_SNPRINTF) 402 check_function_exists(vsnprintf HAVE_VSNPRINTF) 403 check_function_exists(strtok_r HAVE_STRTOK_R) 404 405 # 406 # These tests are for network applications that need socket functions 407 # and getaddrinfo()/getnameinfo()-ish functions. We now require 408 # getaddrinfo() and getnameinfo(). On UN*X systems, we also prefer 409 # versions of recvmsg() that conform to the Single UNIX Specification, 410 # so that we can check whether a datagram received with recvmsg() was 411 # truncated when received due to the buffer being too small. 412 # 413 # On Windows, getaddrinfo() is in the ws2_32 library. 414 415 # On most UN*X systems, they're available in the system library. 416 # 417 # Under Solaris, we need to link with libsocket and libnsl to get 418 # getaddrinfo() and getnameinfo() and, if we have libxnet, we need to 419 # link with libxnet before libsocket to get a version of recvmsg() 420 # that conforms to the Single UNIX Specification. 421 # 422 # We use getaddrinfo() because we want a portable thread-safe way 423 # of getting information for a host name or port; there exist _r 424 # versions of gethostbyname() and getservbyname() on some platforms, 425 # but not on all platforms. 426 # 427 # NOTE: if you hand check_library_exists as its last argument a variable 428 # that's been set, it skips the test, so we need different variables. 429 # 430 set(PCAP_LINK_LIBRARIES "") 431 include(CheckLibraryExists) 432 include(CheckSymbolExists) 433 if(WIN32) 434 # 435 # We need winsock2.h and ws2tcpip.h. 436 # 437 cmake_push_check_state() 438 set(CMAKE_REQUIRED_LIBRARIES ws2_32) 439 check_symbol_exists(getaddrinfo "winsock2.h;ws2tcpip.h" LIBWS2_32_HAS_GETADDRINFO) 440 cmake_pop_check_state() 441 if(LIBWS2_32_HAS_GETADDRINFO) 442 set(PCAP_LINK_LIBRARIES ws2_32 ${PCAP_LINK_LIBRARIES}) 443 else(LIBWS2_32_HAS_GETADDRINFO) 444 message(FATAL_ERROR "getaddrinfo is required, but wasn't found") 445 endif(LIBWS2_32_HAS_GETADDRINFO) 446 else(WIN32) 447 # 448 # UN*X. First try the system libraries, then try the libraries 449 # for Solaris and possibly other systems that picked up the 450 # System V library split. 451 # 452 check_function_exists(getaddrinfo STDLIBS_HAVE_GETADDRINFO) 453 if(NOT STDLIBS_HAVE_GETADDRINFO) 454 # 455 # Not found in the standard system libraries. 456 # Try libsocket, which requires libnsl. 457 # 458 cmake_push_check_state() 459 set(CMAKE_REQUIRED_LIBRARIES nsl) 460 check_library_exists(socket getaddrinfo "" LIBSOCKET_HAS_GETADDRINFO) 461 cmake_pop_check_state() 462 if(LIBSOCKET_HAS_GETADDRINFO) 463 # 464 # OK, we found it in libsocket. 465 # 466 set(PCAP_LINK_LIBRARIES socket nsl ${PCAP_LINK_LIBRARIES}) 467 else(LIBSOCKET_HAS_GETADDRINFO) 468 # 469 # We didn't find it. 470 # 471 message(FATAL_ERROR "getaddrinfo is required, but wasn't found") 472 endif(LIBSOCKET_HAS_GETADDRINFO) 473 474 # 475 # OK, do we have recvmsg() in libxnet? 476 # We also link with libsocket and libnsl. 477 # 478 cmake_push_check_state() 479 set(CMAKE_REQUIRED_LIBRARIES socket nsl) 480 check_library_exists(xnet recvmsg "" LIBXNET_HAS_RECVMSG) 481 cmake_pop_check_state() 482 if(LIBXNET_HAS_RECVMSG) 483 # 484 # Yes - link with it as well. 485 # 486 set(PCAP_LINK_LIBRARIES xnet ${PCAP_LINK_LIBRARIES}) 487 endif(LIBXNET_HAS_RECVMSG) 488 endif(NOT STDLIBS_HAVE_GETADDRINFO) 489 490 # DLPI needs putmsg under HPUX so test for -lstr while we're at it 491 check_function_exists(putmsg STDLIBS_HAVE_PUTMSG) 492 if(NOT STDLIBS_HAVE_PUTMSG) 493 check_library_exists(str putmsg "" LIBSTR_HAS_PUTMSG) 494 if(LIBSTR_HAS_PUTMSG) 495 set(PCAP_LINK_LIBRARIES str ${PCAP_LINK_LIBRARIES}) 496 endif(LIBSTR_HAS_PUTMSG) 497 endif(NOT STDLIBS_HAVE_PUTMSG) 498 endif(WIN32) 499 500 # 501 # Check for reentrant versions of getnetbyname_r(), as provided by 502 # Linux (glibc), Solaris/IRIX, and AIX (with three different APIs!). 503 # If we don't find one, we just use getnetbyname(), which uses 504 # thread-specific data on many platforms, but doesn't use it on 505 # NetBSD or OpenBSD, and may not use it on older versions of other 506 # platforms. 507 # 508 # Only do the check if we have a declaration of getnetbyname_r(); 509 # without it, we can't check which API it has. (We assume that 510 # if there's a declaration, it has a prototype, so that the API 511 # can be checked.) 512 # 513 cmake_push_check_state() 514 set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LINK_LIBRARIES}) 515 check_symbol_exists(getnetbyname_r netdb.h NETDB_H_DECLARES_GETNETBYNAME_R) 516 if(NETDB_H_DECLARES_GETNETBYNAME_R) 517 check_c_source_compiles( 518 "#include <netdb.h> 519 520 int 521 main(void) 522 { 523 struct netent netent_buf; 524 char buf[1024]; 525 struct netent *resultp; 526 int h_errnoval; 527 528 return getnetbyname_r((const char *)0, &netent_buf, buf, sizeof buf, &resultp, &h_errnoval); 529 } 530 " 531 HAVE_LINUX_GETNETBYNAME_R) 532 if(NOT HAVE_LINUX_GETNETBYNAME_R) 533 check_c_source_compiles( 534 "#include <netdb.h> 535 536 int 537 main(void) 538 { 539 struct netent netent_buf; 540 char buf[1024]; 541 542 return getnetbyname_r((const char *)0, &netent_buf, buf, (int)sizeof buf) != NULL; 543 } 544 " 545 HAVE_SOLARIS_IRIX_GETNETBYNAME_R) 546 if(NOT HAVE_SOLARIS_IRIX_GETNETBYNAME_R) 547 check_c_source_compiles( 548 "#include <netdb.h> 549 550 int 551 main(void) 552 { 553 struct netent netent_buf; 554 struct netent_data net_data; 555 556 return getnetbyname_r((const char *)0, &netent_buf, &net_data); 557 } 558 " 559 HAVE_AIX_GETNETBYNAME_R) 560 endif(NOT HAVE_SOLARIS_IRIX_GETNETBYNAME_R) 561 endif(NOT HAVE_LINUX_GETNETBYNAME_R) 562 endif(NETDB_H_DECLARES_GETNETBYNAME_R) 563 cmake_pop_check_state() 564 565 # 566 # Check for reentrant versions of getprotobyname_r(), as provided by 567 # Linux (glibc), Solaris/IRIX, and AIX (with three different APIs!). 568 # If we don't find one, we just use getprotobyname(), which uses 569 # thread-specific data on many platforms, but doesn't use it on 570 # NetBSD or OpenBSD, and may not use it on older versions of other 571 # platforms. 572 # 573 # Only do the check if we have a declaration of getprotobyname_r(); 574 # without it, we can't check which API it has. (We assume that 575 # if there's a declaration, it has a prototype, so that the API 576 # can be checked.) 577 # 578 cmake_push_check_state() 579 set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LINK_LIBRARIES}) 580 check_symbol_exists(getprotobyname_r netdb.h NETDB_H_DECLARES_GETPROTOBYNAME_R) 581 if(NETDB_H_DECLARES_GETPROTOBYNAME_R) 582 check_c_source_compiles( 583 "#include <netdb.h> 584 585 int 586 main(void) 587 { 588 struct protoent protoent_buf; 589 char buf[1024]; 590 struct protoent *resultp; 591 592 return getprotobyname_r((const char *)0, &protoent_buf, buf, sizeof buf, &resultp); 593 } 594 " 595 HAVE_LINUX_GETPROTOBYNAME_R) 596 if(NOT HAVE_LINUX_GETPROTOBYNAME_R) 597 check_c_source_compiles( 598 "#include <netdb.h> 599 600 int 601 main(void) 602 { 603 struct protoent protoent_buf; 604 char buf[1024]; 605 606 return getprotobyname_r((const char *)0, &protoent_buf, buf, (int)sizeof buf) != NULL; 607 } 608 " 609 HAVE_SOLARIS_IRIX_GETPROTOBYNAME_R) 610 if(NOT HAVE_SOLARIS_IRIX_GETPROTOBYNAME_R) 611 check_c_source_compiles( 612 "#include <netdb.h> 613 614 int 615 main(void) 616 { 617 struct protoent protoent_buf; 618 struct protoent_data proto_data; 619 620 return getprotobyname_r((const char *)0, &protoent_buf, &proto_data); 621 } 622 " 623 HAVE_AIX_GETPROTOBYNAME_R) 624 endif(NOT HAVE_SOLARIS_IRIX_GETPROTOBYNAME_R) 625 endif(NOT HAVE_LINUX_GETPROTOBYNAME_R) 626 endif(NETDB_H_DECLARES_GETPROTOBYNAME_R) 627 cmake_pop_check_state() 628 629 # 630 # Data types. 631 # 632 # XXX - there's no check_type() macro that's like check_type_size() 633 # except that it only checks for the existence of the structure type, 634 # so we use check_type_size() and ignore the size. 635 # 636 cmake_push_check_state() 637 if(WIN32) 638 set(CMAKE_EXTRA_INCLUDE_FILES winsock2.h) 639 else(WIN32) 640 set(CMAKE_EXTRA_INCLUDE_FILES unistd.h sys/socket.h) 641 endif(WIN32) 642 check_type_size("struct sockaddr_storage" STRUCT_SOCKADDR_STORAGE) 643 check_type_size("socklen_t" SOCKLEN_T) 644 cmake_pop_check_state() 645 646 # 647 # Structure fields. 648 # 649 if(WIN32) 650 check_struct_has_member("struct sockaddr" sa_len winsock2.h HAVE_STRUCT_SOCKADDR_SA_LEN) 651 else(WIN32) 652 check_struct_has_member("struct sockaddr" sa_len sys/socket.h HAVE_STRUCT_SOCKADDR_SA_LEN) 653 endif(WIN32) 654 655 # 656 # Do we have ffs(), and is it declared in <strings.h>? 657 # 658 check_function_exists(ffs HAVE_FFS) 659 if(HAVE_FFS) 660 # 661 # OK, we have ffs(). Is it declared in <strings.h>? 662 # 663 # This test fails if we don't have <strings.h> or if we do 664 # but it doesn't declare ffs(). 665 # 666 check_symbol_exists(ffs strings.h STRINGS_H_DECLARES_FFS) 667 endif() 668 669 # 670 # This requires the libraries that we require, as ether_hostton might be 671 # in one of those libraries. That means we have to do this after 672 # we check for those libraries. 673 # 674 # You are in a twisty little maze of UN*Xes, all different. 675 # Some might not have ether_hostton(). 676 # Some might have it and declare it in <net/ethernet.h>. 677 # Some might have it and declare it in <netinet/ether.h> 678 # Some might have it and declare it in <sys/ethernet.h>. 679 # Some might have it and declare it in <arpa/inet.h>. 680 # Some might have it and declare it in <netinet/if_ether.h>. 681 # Some might have it and not declare it in any header file. 682 # 683 # Before you is a C compiler. 684 # 685 cmake_push_check_state() 686 set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LINK_LIBRARIES}) 687 check_function_exists(ether_hostton HAVE_ETHER_HOSTTON) 688 if(HAVE_ETHER_HOSTTON) 689 # 690 # OK, we have ether_hostton(). Is it declared in <net/ethernet.h>? 691 # 692 # This test fails if we don't have <net/ethernet.h> or if we do 693 # but it doesn't declare ether_hostton(). 694 # 695 check_symbol_exists(ether_hostton net/ethernet.h NET_ETHERNET_H_DECLARES_ETHER_HOSTTON) 696 if(NET_ETHERNET_H_DECLARES_ETHER_HOSTTON) 697 # 698 # Yes - we have it declared. 699 # 700 set(HAVE_DECL_ETHER_HOSTTON TRUE) 701 endif() 702 # 703 # Did that succeed? 704 # 705 if(NOT HAVE_DECL_ETHER_HOSTTON) 706 # 707 # No - how about <netinet/ether.h>, as on Linux? 708 # 709 # This test fails if we don't have <netinet/ether.h> 710 # or if we do but it doesn't declare ether_hostton(). 711 # 712 check_symbol_exists(ether_hostton netinet/ether.h NETINET_ETHER_H_DECLARES_ETHER_HOSTTON) 713 if(NETINET_ETHER_H_DECLARES_ETHER_HOSTTON) 714 # 715 # Yes - we have it declared. 716 # 717 set(HAVE_DECL_ETHER_HOSTTON TRUE) 718 endif() 719 endif() 720 # 721 # Did that succeed? 722 # 723 if(NOT HAVE_DECL_ETHER_HOSTTON) 724 # 725 # No - how about <sys/ethernet.h>, as on Solaris 10 and later? 726 # 727 # This test fails if we don't have <sys/ethernet.h> 728 # or if we do but it doesn't declare ether_hostton(). 729 # 730 check_symbol_exists(ether_hostton sys/ethernet.h SYS_ETHERNET_H_DECLARES_ETHER_HOSTTON) 731 if(SYS_ETHERNET_H_DECLARES_ETHER_HOSTTON) 732 # 733 # Yes - we have it declared. 734 # 735 set(HAVE_DECL_ETHER_HOSTTON TRUE) 736 endif() 737 endif() 738 # 739 # Did that succeed? 740 # 741 if(NOT HAVE_DECL_ETHER_HOSTTON) 742 # 743 # No, how about <arpa/inet.h>, as on AIX? 744 # 745 # This test fails if we don't have <arpa/inet.h> 746 # or if we do but it doesn't declare ether_hostton(). 747 # 748 check_symbol_exists(ether_hostton arpa/inet.h ARPA_INET_H_DECLARES_ETHER_HOSTTON) 749 if(ARPA_INET_H_DECLARES_ETHER_HOSTTON) 750 # 751 # Yes - we have it declared. 752 # 753 set(HAVE_DECL_ETHER_HOSTTON TRUE) 754 endif() 755 endif() 756 # 757 # Did that succeed? 758 # 759 if(NOT HAVE_DECL_ETHER_HOSTTON) 760 # 761 # No, how about <netinet/if_ether.h>? 762 # On some platforms, it requires <net/if.h> and 763 # <netinet/in.h>, and we always include it with 764 # both of them, so test it with both of them. 765 # 766 # This test fails if we don't have <netinet/if_ether.h> 767 # and the headers we include before it, or if we do but 768 # <netinet/if_ether.h> doesn't declare ether_hostton(). 769 # 770 check_symbol_exists(ether_hostton "sys/types.h;sys/socket.h;net/if.h;netinet/in.h;netinet/if_ether.h" NETINET_IF_ETHER_H_DECLARES_ETHER_HOSTTON) 771 if(NETINET_IF_ETHER_H_DECLARES_ETHER_HOSTTON) 772 # 773 # Yes - we have it declared. 774 # 775 set(HAVE_DECL_ETHER_HOSTTON TRUE) 776 endif() 777 endif() 778 # 779 # After all that, is ether_hostton() declared? 780 # 781 if(NOT HAVE_DECL_ETHER_HOSTTON) 782 # 783 # No, we'll have to declare it ourselves. 784 # Do we have "struct ether_addr" if we include <netinet/if_ether.h>? 785 # 786 # XXX - there's no check_type() macro that's like check_type_size() 787 # except that it only checks for the existence of the structure type, 788 # so we use check_type_size() and ignore the size. 789 # 790 cmake_push_check_state() 791 set(CMAKE_EXTRA_INCLUDE_FILES sys/types.h sys/socket.h net/if.h netinet/in.h netinet/if_ether.h) 792 check_type_size("struct ether_addr" STRUCT_ETHER_ADDR) 793 cmake_pop_check_state() 794 endif() 795 endif() 796 cmake_pop_check_state() 797 798 # 799 # Large file support on UN*X, a/k/a LFS. 800 # 801 if(NOT WIN32) 802 include(FindLFS) 803 if(LFS_FOUND) 804 # 805 # Add the required #defines. 806 # 807 add_definitions(${LFS_DEFINITIONS}) 808 endif() 809 810 # 811 # Check for fseeko as well. 812 # 813 include(FindFseeko) 814 if(FSEEKO_FOUND) 815 set(HAVE_FSEEKO ON) 816 817 # 818 # Add the required #defines. 819 # 820 add_definitions(${FSEEKO_DEFINITIONS}) 821 endif() 822 endif() 823 824 if(INET6) 825 message(STATUS "Support IPv6") 826 endif(INET6) 827 828 # 829 # Pthreads. 830 # We might need them, because some libraries we use might use them, 831 # but we don't necessarily need them. 832 # That's only on UN*X; on Windows, if they use threads, we assume 833 # they're native Windows threads. 834 # 835 if(NOT WIN32) 836 set(CMAKE_THREAD_PREFER_PTHREAD ON) 837 find_package(Threads) 838 if(NOT CMAKE_USE_PTHREADS_INIT) 839 # 840 # If it's not pthreads, we won't use it; we use it for libraries 841 # that require it. 842 # 843 set(CMAKE_THREAD_LIBS_INIT "") 844 endif(NOT CMAKE_USE_PTHREADS_INIT) 845 endif(NOT WIN32) 846 847 ###################################### 848 # Input files 849 ###################################### 850 851 set(PROJECT_SOURCE_LIST_C 852 bpf_dump.c 853 bpf_filter.c 854 bpf_image.c 855 etherent.c 856 fmtutils.c 857 gencode.c 858 nametoaddr.c 859 optimize.c 860 pcap-common.c 861 pcap.c 862 savefile.c 863 sf-pcapng.c 864 sf-pcap.c 865 ) 866 867 if(WIN32) 868 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} missing/win_snprintf.c) 869 else() 870 if(NOT HAVE_SNPRINTF) 871 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} missing/snprintf.c) 872 endif(NOT HAVE_SNPRINTF) 873 if(NOT HAVE_STRTOK_R) 874 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} missing/strtok_r.c) 875 endif(NOT HAVE_STRTOK_R) 876 endif(WIN32) 877 878 # 879 # Determine the main pcap-XXX.c file to use, and the libraries with 880 # which we need to link libpcap, if any. 881 # 882 if(WIN32) 883 # 884 # Windows. 885 # 886 # Has the user explicitly specified a capture type? 887 # 888 if(PCAP_TYPE STREQUAL "") 889 # 890 # The user didn't explicitly specify a capture mechanism. 891 # Check whether we have packet.dll. 892 # 893 if(HAVE_PACKET32) 894 # 895 # We have packet.dll. 896 # Set the capture type to NPF. 897 # 898 set(PCAP_TYPE npf) 899 else() 900 # 901 # We don't have any capture type we know about, so just use 902 # the null capture type, and only support reading (and writing) 903 # capture files. 904 # 905 set(PCAP_TYPE null) 906 endif() 907 endif() 908 else() 909 # 910 # UN*X. 911 # 912 # Figure out what type of packet capture mechanism we have, and 913 # what libraries we'd need to link libpcap with, if any. 914 # 915 916 # 917 # Has the user explicitly specified a capture type? 918 # 919 if(PCAP_TYPE STREQUAL "") 920 # 921 # Check for a bunch of headers for various packet capture mechanisms. 922 # 923 check_include_files("sys/types.h;net/bpf.h" HAVE_NET_BPF_H) 924 if(HAVE_NET_BPF_H) 925 # 926 # Does it define BIOCSETIF? 927 # I.e., is it a header for an LBL/BSD-style capture 928 # mechanism, or is it just a header for a BPF filter 929 # engine? Some versions of Arch Linux, for example, 930 # have a net/bpf.h that doesn't define BIOCSETIF; 931 # as it's a Linux, it should use packet sockets, 932 # instead. 933 # 934 # 935 # We need: 936 # 937 # sys/types.h, because FreeBSD 10's net/bpf.h 938 # requires that various BSD-style integer types 939 # be defined; 940 # 941 # sys/ioctl.h and, if we have it, sys/ioccom.h, 942 # because net/bpf.h defines ioctls; 943 # 944 # net/if.h, because it defines some structures 945 # used in ioctls defined by net/bpf.h; 946 # 947 # sys/socket.h, because OpenBSD 5.9's net/bpf.h 948 # defines some structure fields as being 949 # struct sockaddrs; 950 # 951 # and net/bpf.h doesn't necessarily include all 952 # of those headers itself. 953 # 954 if(HAVE_SYS_IOCCOM_H) 955 check_symbol_exists(BIOCSETIF "sys/types.h;sys/ioctl.h;sys/socket.h;sys/ioccom.h;net/bpf.h;net/if.h" BPF_H_DEFINES_BIOCSETIF) 956 else(HAVE_SYS_IOCCOM_H) 957 check_symbol_exists(BIOCSETIF "sys/types.h;sys/ioctl.h;sys/socket.h;net/bpf.h;net/if.h" BPF_H_DEFINES_BIOCSETIF) 958 endif(HAVE_SYS_IOCCOM_H) 959 endif(HAVE_NET_BPF_H) 960 check_include_file(net/pfilt.h HAVE_NET_PFILT_H) 961 check_include_file(net/enet.h HAVE_NET_ENET_H) 962 check_include_file(net/nit.h HAVE_NET_NIT_H) 963 check_include_file(sys/net/nit.h HAVE_SYS_NET_NIT_H) 964 check_include_file(linux/socket.h HAVE_LINUX_SOCKET_H) 965 check_include_file(net/raw.h HAVE_NET_RAW_H) 966 check_include_file(sys/dlpi.h HAVE_SYS_DLPI_H) 967 968 if(BPF_H_DEFINES_BIOCSETIF) 969 # 970 # BPF. 971 # Check this before DLPI, so that we pick BPF on 972 # Solaris 11 and later. 973 # 974 set(PCAP_TYPE bpf) 975 elseif(HAVE_LINUX_SOCKET_H) 976 # 977 # No prizes for guessing this one. 978 # 979 set(PCAP_TYPE linux) 980 elseif(HAVE_NET_PFILT_H) 981 # 982 # DEC OSF/1, Digital UNIX, Tru64 UNIX 983 # 984 set(PCAP_TYPE pf) 985 elseif(HAVE_NET_ENET_H) 986 # 987 # Stanford Enetfilter. 988 # 989 set(PCAP_TYPE enet) 990 elseif(HAVE_NET_NIT_H) 991 # 992 # SunOS 4.x STREAMS NIT. 993 # 994 set(PCAP_TYPE snit) 995 elseif(HAVE_SYS_NET_NIT_H) 996 # 997 # Pre-SunOS 4.x non-STREAMS NIT. 998 # 999 set(PCAP_TYPE nit) 1000 elseif(HAVE_NET_RAW_H) 1001 # 1002 # IRIX snoop. 1003 # 1004 set(PCAP_TYPE snoop) 1005 elseif(HAVE_SYS_DLPI_H) 1006 # 1007 # DLPI on pre-Solaris 11 SunOS 5, HP-UX, possibly others. 1008 # 1009 set(PCAP_TYPE dlpi) 1010 else() 1011 # 1012 # Nothing we support. 1013 # 1014 set(PCAP_TYPE null) 1015 endif() 1016 endif() 1017 endif(WIN32) 1018 message(STATUS "Packet capture mechanism type: ${PCAP_TYPE}") 1019 1020 # 1021 # Do capture-mechanism-dependent tests. 1022 # 1023 if(WIN32) 1024 if(PCAP_TYPE STREQUAL "npf") 1025 # 1026 # Link with packet.dll before WinSock2. 1027 # 1028 set(PCAP_LINK_LIBRARIES ${PACKET_LIBRARIES} ${PCAP_LINK_LIBRARIES}) 1029 elseif(PCAP_TYPE STREQUAL "null") 1030 else() 1031 message(ERROR "${PCAP_TYPE} is not a valid pcap type") 1032 endif() 1033 else(WIN32) 1034 if(PCAP_TYPE STREQUAL "dlpi") 1035 # 1036 # Needed for common functions used by pcap-[dlpi,libdlpi].c 1037 # 1038 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} dlpisubs.c) 1039 1040 # 1041 # Checks for some header files. 1042 # 1043 check_include_file(sys/bufmod.h HAVE_SYS_BUFMOD_H) 1044 check_include_file(sys/dlpi_ext.h HAVE_SYS_DLPI_EXT_H) 1045 1046 # 1047 # Checks to see if Solaris has the public libdlpi(3LIB) library. 1048 # Note: The existence of /usr/include/libdlpi.h does not mean it is the 1049 # public libdlpi(3LIB) version. Before libdlpi was made public, a 1050 # private version also existed, which did not have the same APIs. 1051 # Due to a gcc bug, the default search path for 32-bit libraries does 1052 # not include /lib, we add it explicitly here. 1053 # [http://bugs.opensolaris.org/view_bug.do?bug_id=6619485]. 1054 # Also, due to the bug above applications that link to libpcap with 1055 # libdlpi will have to add "-L/lib" option to "configure". 1056 # 1057 cmake_push_check_state() 1058 set(CMAKE_REQUIRED_FLAGS "-L/lib") 1059 set(CMAKE_REQUIRED_LIBRARIES dlpi) 1060 check_function_exists(dlpi_walk HAVE_LIBDLPI) 1061 cmake_pop_check_state() 1062 if(HAVE_LIBDLPI) 1063 # 1064 # XXX - add -L/lib 1065 # 1066 set(PCAP_LINK_LIBRARIES ${PCAP_LINK_LIBRARIES} dlpi) 1067 set(PCAP_TYPE libdlpi) 1068 endif() 1069 1070 # 1071 # This check is for Solaris with DLPI support for passive modes. 1072 # See dlpi(7P) for more details. 1073 # 1074 # XXX - there's no check_type() macro that's like check_type_size() 1075 # except that it only checks for the existence of the structure type, 1076 # so we use check_type_size() and ignore the size. 1077 # 1078 cmake_push_check_state() 1079 set(CMAKE_EXTRA_INCLUDE_FILES sys/types.h sys/dlpi.h) 1080 check_type_size(dl_passive_req_t DL_PASSIVE_REQ_T) 1081 cmake_pop_check_state() 1082 elseif(PCAP_TYPE STREQUAL "linux") 1083 # 1084 # Do we have the wireless extensions? 1085 # linux/wireless.h requires sys/socket.h. 1086 # 1087 check_include_files("sys/socket.h;linux/wireless.h" HAVE_LINUX_WIRELESS_H) 1088 1089 # 1090 # Do we have libnl? 1091 # 1092 if(BUILD_WITH_LIBNL) 1093 # 1094 # Try libnl 3.x first. 1095 # 1096 cmake_push_check_state() 1097 set(CMAKE_REQUIRED_LIBRARIES nl-3) 1098 check_function_exists(nl_socket_alloc HAVE_LIBNL) 1099 cmake_pop_check_state() 1100 if(HAVE_LIBNL) 1101 # 1102 # Yes, we have libnl 3.x. 1103 # 1104 set(PCAP_LINK_LIBRARIES nl-genl-3 nl-3 ${PCAP_LINK_LIBRARIES}) 1105 set(HAVE_LIBNL_3_x ON) 1106 set(HAVE_LIBNL_NLE ON) 1107 set(HAVE_LIBNL_SOCKETS ON) 1108 include_directories("/usr/include/libnl3") 1109 else() 1110 # 1111 # Try libnl 2.x. 1112 # 1113 cmake_push_check_state() 1114 set(CMAKE_REQUIRED_LIBRARIES nl) 1115 check_function_exists(nl_socket_alloc HAVE_LIBNL) 1116 cmake_pop_check_state() 1117 if(HAVE_LIBNL) 1118 # 1119 # Yes, we have libnl 2.x. 1120 # 1121 set(PCAP_LINK_LIBRARIES nl-genl nl ${PCAP_LINK_LIBRARIES}) 1122 set(HAVE_LIBNL_2_x ON) 1123 set(HAVE_LIBNL_NLE ON) 1124 set(HAVE_LIBNL_SOCKETS ON) 1125 else() 1126 # 1127 # No, we don't; do we have libnl 1.x? 1128 # 1129 cmake_push_check_state() 1130 set(CMAKE_REQUIRED_LIBRARIES nl) 1131 check_function_exists(nl_handle_alloc HAVE_LIBNL) 1132 cmake_pop_check_state() 1133 if(HAVE_LIBNL) 1134 set(PCAP_LINK_LIBRARIES nl ${PCAP_LINK_LIBRARIES}) 1135 endif() 1136 endif() 1137 endif() 1138 endif() 1139 1140 check_include_file(linux/ethtool.h HAVE_LINUX_ETHTOOL_H) 1141 1142 # 1143 # Checks to see if tpacket_stats is defined in linux/if_packet.h 1144 # If so then pcap-linux.c can use this to report proper statistics. 1145 # 1146 # XXX - there's no check_type() macro that's like check_type_size() 1147 # except that it only checks for the existence of the structure type, 1148 # so we use check_type_size() and ignore the size. 1149 # 1150 cmake_push_check_state() 1151 set(CMAKE_EXTRA_INCLUDE_FILES linux/if_packet.h) 1152 check_type_size("struct tpacket_stats" STRUCT_TPACKET_STATS) 1153 cmake_pop_check_state() 1154 1155 check_struct_has_member("struct tpacket_auxdata" tp_vlan_tci linux/if_packet.h HAVE_STRUCT_TPACKET_AUXDATA_TP_VLAN_TCI) 1156 elseif(PCAP_TYPE STREQUAL "bpf") 1157 # 1158 # Check whether we have the *BSD-style ioctls. 1159 # 1160 check_include_files("sys/types.h;net/if_media.h" HAVE_NET_IF_MEDIA_H) 1161 1162 # 1163 # Check whether we have struct BPF_TIMEVAL. 1164 # 1165 # XXX - there's no check_type() macro that's like check_type_size() 1166 # except that it only checks for the existence of the structure type, 1167 # so we use check_type_size() and ignore the size. 1168 # 1169 cmake_push_check_state() 1170 if(HAVE_SYS_IOCCOM_H) 1171 set(CMAKE_EXTRA_INCLUDE_FILES sys/types.h sys/ioccom.h net/bpf.h) 1172 check_type_size("struct BPF_TIMEVAL" STRUCT_BPF_TIMEVAL) 1173 else() 1174 set(CMAKE_EXTRA_INCLUDE_FILES sys/types.h net/bpf.h) 1175 check_type_size("struct BPF_TIMEVAL" STRUCT_BPF_TIMEVAL) 1176 endif() 1177 cmake_pop_check_state() 1178 elseif(PCAP_TYPE STREQUAL "null") 1179 else() 1180 message(FATAL_ERROR "${PCAP_TYPE} is not a valid pcap type") 1181 endif() 1182 endif(WIN32) 1183 1184 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-${PCAP_TYPE}.c) 1185 1186 # 1187 # Now figure out how we get a list of interfaces and addresses, 1188 # if we support capturing. Don't bother if we don't support 1189 # capturing. 1190 # 1191 if(NOT WIN32) 1192 # 1193 # UN*X - figure out what type of interface list mechanism we 1194 # have. 1195 # 1196 # If the capture type is null, that means we can't capture, 1197 # so we can't open any capture devices, so we won't return 1198 # any interfaces. 1199 # 1200 if(NOT PCAP_TYPE STREQUAL "null") 1201 cmake_push_check_state() 1202 set(CMAKE_REQUIRED_LIBRARIES ${PCAP_LINK_LIBRARIES}) 1203 check_function_exists(getifaddrs HAVE_GETIFADDRS) 1204 cmake_pop_check_state() 1205 if(NOT HAVE_GETIFADDRS) 1206 # 1207 # It's not in the libraries that, at this point, we've 1208 # found we need to link libpcap with. 1209 # 1210 # It's in libsocket on Solaris and possibly other OSes; 1211 # as long as we're not linking with libxnet, check there. 1212 # 1213 # NOTE: if you hand check_library_exists as its last 1214 # argument a variable that's been set, it skips the test, 1215 # so we need different variables. 1216 # 1217 if(NOT LIBXNET_HAS_GETHOSTBYNAME) 1218 check_library_exists(socket getifaddrs "" SOCKET_HAS_GETIFADDRS) 1219 if(SOCKET_HAS_GETIFADDRS) 1220 set(PCAP_LINK_LIBRARIES socket ${PCAP_LINK_LIBRARIES}) 1221 set(HAVE_GETIFADDRS TRUE) 1222 endif() 1223 endif() 1224 endif() 1225 if(HAVE_GETIFADDRS) 1226 # 1227 # We have "getifaddrs()"; make sure we have <ifaddrs.h> 1228 # as well, just in case some platform is really weird. 1229 # It may require that sys/types.h be included first, 1230 # so include it first. 1231 # 1232 check_include_files("sys/types.h;ifaddrs.h" HAVE_IFADDRS_H) 1233 if(HAVE_IFADDRS_H) 1234 # 1235 # We have the header, so we use "getifaddrs()" to 1236 # get the list of interfaces. 1237 # 1238 set(FINDALLDEVS_TYPE getad) 1239 else() 1240 # 1241 # We don't have the header - give up. 1242 # XXX - we could also fall back on some other 1243 # mechanism, but, for now, this'll catch this 1244 # problem so that we can at least try to figure 1245 # out something to do on systems with "getifaddrs()" 1246 # but without "ifaddrs.h", if there is something 1247 # we can do on those systems. 1248 # 1249 message(FATAL_ERROR "Your system has getifaddrs() but doesn't have a usable <ifaddrs.h>.") 1250 endif() 1251 else() 1252 # 1253 # Well, we don't have "getifaddrs()", at least not with the 1254 # libraries with which we've decided we need to link 1255 # libpcap with, so we have to use some other mechanism. 1256 # 1257 # Note that this may happen on Solaris, which has 1258 # getifaddrs(), but in -lsocket, not in -lxnet, so we 1259 # won't find it if we link with -lxnet, which we want 1260 # to do for other reasons. 1261 # 1262 # For now, we use either the SIOCGIFCONF ioctl or the 1263 # SIOCGLIFCONF ioctl, preferring the latter if we have 1264 # it; the latter is a Solarisism that first appeared 1265 # in Solaris 8. (Solaris's getifaddrs() appears to 1266 # be built atop SIOCGLIFCONF; using it directly 1267 # avoids a not-all-that-useful middleman.) 1268 # 1269 try_compile(HAVE_SIOCGLIFCONF ${CMAKE_CURRENT_BINARY_DIR} "${pcap_SOURCE_DIR}/cmake/have_siocglifconf.c" ) 1270 if(HAVE_SIOCGLIFCONF) 1271 set(FINDALLDEVS_TYPE glifc) 1272 else() 1273 set(FINDALLDEVS_TYPE gifc) 1274 endif() 1275 endif() 1276 message(STATUS "Find-interfaces mechanism type: ${FINDALLDEVS_TYPE}") 1277 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} fad-${FINDALLDEVS_TYPE}.c) 1278 endif() 1279 endif() 1280 1281 # Check for hardware timestamp support. 1282 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 1283 check_include_file(linux/net_tstamp.h HAVE_LINUX_NET_TSTAMP_H) 1284 endif() 1285 1286 # 1287 # Check for additional native sniffing capabilities. 1288 # 1289 1290 # Check for USB sniffing support on Linux. 1291 # On FreeBSD, it uses BPF, so we don't need to do anything special here. 1292 if(NOT DISABLE_USB) 1293 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 1294 set(PCAP_SUPPORT_USB TRUE) 1295 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-usb-linux.c) 1296 set(LINUX_USB_MON_DEV /dev/usbmon) 1297 # 1298 # Do we have a version of <linux/compiler.h> available? 1299 # If so, we might need it for <linux/usbdevice_fs.h>. 1300 # 1301 check_include_files("linux/compiler.h" HAVE_LINUX_COMPILER_H) 1302 if(HAVE_LINUX_COMPILER_H) 1303 # 1304 # Yes - include it when testing for <linux/usbdevice_fs.h>. 1305 # 1306 check_include_files("linux/compiler.h;linux/usbdevice_fs.h" HAVE_LINUX_USBDEVICE_FS_H) 1307 else(HAVE_LINUX_COMPILER_H) 1308 check_include_files("linux/usbdevice_fs.h" HAVE_LINUX_USBDEVICE_FS_H) 1309 endif(HAVE_LINUX_COMPILER_H) 1310 if(HAVE_LINUX_USBDEVICE_FS_H) 1311 # 1312 # OK, does it define bRequestType? Older versions of the kernel 1313 # define fields with names like "requesttype, "request", and 1314 # "value", rather than "bRequestType", "bRequest", and 1315 # "wValue". 1316 # 1317 if(HAVE_LINUX_COMPILER_H) 1318 check_struct_has_member("struct usbdevfs_ctrltransfer" bRequestType "linux/compiler.h;linux/usbdevice_fs.h" HAVE_STRUCT_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE) 1319 else(HAVE_LINUX_COMPILER_H) 1320 check_struct_has_member("struct usbdevfs_ctrltransfer" bRequestType "linux/usbdevice_fs.h" HAVE_STRUCT_USBDEVFS_CTRLTRANSFER_BREQUESTTYPE) 1321 endif(HAVE_LINUX_COMPILER_H) 1322 endif() 1323 endif() 1324 endif() 1325 1326 # Check for netfilter sniffing support. 1327 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 1328 # 1329 # Life's too short to deal with trying to get this to compile 1330 # if you don't get the right types defined with 1331 # __KERNEL_STRICT_NAMES getting defined by some other include. 1332 # 1333 # Check whether the includes Just Work. If not, don't turn on 1334 # netfilter support. 1335 # 1336 check_c_source_compiles( 1337 "#include <sys/socket.h> 1338 #include <netinet/in.h> 1339 #include <linux/types.h> 1340 1341 #include <linux/netlink.h> 1342 #include <linux/netfilter.h> 1343 #include <linux/netfilter/nfnetlink.h> 1344 #include <linux/netfilter/nfnetlink_log.h> 1345 #include <linux/netfilter/nfnetlink_queue.h> 1346 1347 int 1348 main(void) 1349 { 1350 return 0; 1351 } 1352 " 1353 PCAP_SUPPORT_NETFILTER) 1354 if(PCAP_SUPPORT_NETFILTER) 1355 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-netfilter-linux.c) 1356 endif(PCAP_SUPPORT_NETFILTER) 1357 endif() 1358 1359 # Check for netmap sniffing support. 1360 if(NOT DISABLE_NETMAP) 1361 # 1362 # Check whether net/netmap_user.h is usable if NETMAP_WITH_LIBS is 1363 # defined; it's not usable on DragonFly BSD 4.6 if NETMAP_WITH_LIBS 1364 # is defined, for example, as it includes a non-existent malloc.h 1365 # header. 1366 # 1367 check_c_source_compiles( 1368 "#define NETMAP_WITH_LIBS 1369 #include <net/netmap_user.h> 1370 1371 int 1372 main(void) 1373 { 1374 return 0; 1375 } 1376 " 1377 PCAP_SUPPORT_NETMAP) 1378 if(PCAP_SUPPORT_NETMAP) 1379 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-netmap.c) 1380 endif(PCAP_SUPPORT_NETMAP) 1381 endif() 1382 1383 # Check for Bluetooth sniffing support 1384 if(NOT DISABLE_BLUETOOTH) 1385 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 1386 check_include_file(bluetooth/bluetooth.h HAVE_BLUETOOTH_BLUETOOTH_H) 1387 if(HAVE_BLUETOOTH_BLUETOOTH_H) 1388 set(PCAP_SUPPORT_BT TRUE) 1389 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-bt-linux.c) 1390 # 1391 # OK, does struct sockaddr_hci have an hci_channel 1392 # member? 1393 # 1394 check_struct_has_member("struct sockaddr_hci" hci_channel "bluetooth/bluetooth.h;bluetooth/hci.h" HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL) 1395 if(HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL) 1396 # 1397 # OK, is HCI_CHANNEL_MONITOR defined? 1398 # 1399 check_c_source_compiles( 1400 "#include <bluetooth/bluetooth.h> 1401 #include <bluetooth/hci.h> 1402 1403 int 1404 main(void) 1405 { 1406 u_int i = HCI_CHANNEL_MONITOR; 1407 return 0; 1408 } 1409 " 1410 PCAP_SUPPORT_BT_MONITOR) 1411 if(PCAP_SUPPORT_BT_MONITOR) 1412 # 1413 # Yes, so we can also support Bluetooth monitor 1414 # sniffing. 1415 # 1416 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-bt-monitor-linux.c) 1417 endif(PCAP_SUPPORT_BT_MONITOR) 1418 endif(HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL) 1419 endif(HAVE_BLUETOOTH_BLUETOOTH_H) 1420 endif() 1421 endif() 1422 1423 # Check for Bluetooth sniffing support 1424 if(NOT DISABLE_DBUS) 1425 # 1426 # We don't support D-Bus sniffing on macOS; see 1427 # 1428 # https://bugs.freedesktop.org/show_bug.cgi?id=74029 1429 # 1430 if(APPLE) 1431 message(FATAL_ERROR "Due to freedesktop.org bug 74029, D-Bus capture support is not available on macOS") 1432 endif(APPLE) 1433 include(FindPkgConfig) 1434 pkg_check_modules(DBUS dbus-1) 1435 if(DBUS_FOUND) 1436 set(PCAP_SUPPORT_DBUS TRUE) 1437 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-dbus.c) 1438 include_directories(${DBUS_INCLUDE_DIRS}) 1439 set(PCAP_LINK_LIBRARIES ${PCAP_LINK_LIBRARIES} ${DBUS_LIBRARIES}) 1440 endif(DBUS_FOUND) 1441 endif(NOT DISABLE_DBUS) 1442 1443 # Check for RDMA sniffing support 1444 if(NOT DISABLE_RDMA) 1445 check_library_exists(ibverbs ibv_get_device_list "" LIBIBVERBS_HAS_IBV_GET_DEVICE_LIST) 1446 if(LIBIBVERBS_HAS_IBV_GET_DEVICE_LIST) 1447 check_include_file(infiniband/verbs.h HAVE_INFINIBAND_VERBS_H) 1448 if(HAVE_INFINIBAND_VERBS_H) 1449 check_symbol_exists(ibv_create_flow infiniband/verbs.h PCAP_SUPPORT_RDMASNIFF) 1450 if(PCAP_SUPPORT_RDMASNIFF) 1451 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-rdmasniff.c) 1452 set(PCAP_LINK_LIBRARIES ibverbs ${PCAP_LINK_LIBRARIES}) 1453 endif(PCAP_SUPPORT_RDMASNIFF) 1454 endif(HAVE_INFINIBAND_VERBS_H) 1455 endif(LIBIBVERBS_HAS_IBV_GET_DEVICE_LIST) 1456 endif(NOT DISABLE_RDMA) 1457 1458 # 1459 # Check for sniffing capabilities using third-party APIs. 1460 # 1461 1462 # Check for Endace DAG card support. 1463 if(NOT DISABLE_DAG) 1464 # 1465 # Try to find the DAG header file and library. 1466 # 1467 find_package(DAG) 1468 1469 # 1470 # Did we succeed? 1471 # 1472 if(DAG_FOUND) 1473 # 1474 # Yes. 1475 # Check for various DAG API functions. 1476 # 1477 cmake_push_check_state() 1478 set(CMAKE_REQUIRED_INCLUDES ${DAG_INCLUDE_DIRS}) 1479 set(CMAKE_REQUIRED_LIBRARIES ${DAG_LIBRARIES}) 1480 check_function_exists(dag_attach_stream HAVE_DAG_STREAMS_API) 1481 if(NOT HAVE_DAG_STREAMS_API) 1482 message(FATAL_ERROR "DAG library lacks streams support") 1483 endif() 1484 check_function_exists(dag_attach_stream64 HAVE_DAG_LARGE_STREAMS_API) 1485 check_function_exists(dag_get_erf_types HAVE_DAG_GET_ERF_TYPES) 1486 check_function_exists(dag_get_stream_erf_types HAVE_DAG_GET_STREAM_ERF_TYPES) 1487 cmake_pop_check_state() 1488 1489 include_directories(AFTER ${DAG_INCLUDE_DIRS}) 1490 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-dag.c) 1491 set(HAVE_DAG_API TRUE) 1492 set(PCAP_LINK_LIBRARIES ${PCAP_LINK_LIBRARIES} ${DAG_LIBRARIES}) 1493 1494 if(HAVE_DAG_LARGE_STREAMS_API) 1495 get_filename_component(DAG_LIBRARY_DIR ${DAG_LIBRARY} PATH) 1496 check_library_exists(vdag vdag_set_device_info ${DAG_LIBRARY_DIR} HAVE_DAG_VDAG) 1497 if(HAVE_DAG_VDAG) 1498 set(PCAP_LINK_LIBRARIES ${PCAP_LINK_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) 1499 endif() 1500 endif() 1501 endif() 1502 endif() 1503 1504 # Check for Septel card support. 1505 set(PROJECT_EXTERNAL_OBJECT_LIST "") 1506 if(NOT DISABLE_SEPTEL) 1507 # 1508 # Do we have the msg.h header? 1509 # 1510 set(SEPTEL_INCLUDE_DIRS "${SEPTEL_ROOT}/INC") 1511 cmake_push_check_state() 1512 set(CMAKE_REQUIRED_INCLUDES ${SEPTEL_INCLUDE_DIRS}) 1513 check_include_file(msg.h HAVE_INC_MSG_H) 1514 cmake_pop_check_state() 1515 if(HAVE_INC_MSG_H) 1516 # 1517 # Yes. 1518 # 1519 include_directories(AFTER ${SEPTEL_INCLUDE_DIRS}) 1520 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-septel.c) 1521 set(PROJECT_EXTERNAL_OBJECT_LIST ${PROJECT_EXTERNAL_OBJECT_LIST} "${SEPTEL_ROOT}/asciibin.o ${SEPTEL_ROOT}/bit2byte.o ${SEPTEL_ROOT}/confirm.o ${SEPTEL_ROOT}/fmtmsg.o ${SEPTEL_ROOT}/gct_unix.o ${SEPTEL_ROOT}/hqueue.o ${SEPTEL_ROOT}/ident.o ${SEPTEL_ROOT}/mem.o ${SEPTEL_ROOT}/pack.o ${SEPTEL_ROOT}/parse.o ${SEPTEL_ROOT}/pool.o ${SEPTEL_ROOT}/sdlsig.o ${SEPTEL_ROOT}/strtonum.o ${SEPTEL_ROOT}/timer.o ${SEPTEL_ROOT}/trace.o") 1522 set(HAVE_SEPTEL_API TRUE) 1523 endif() 1524 endif() 1525 1526 # Check for Myricom SNF support. 1527 if(NOT DISABLE_SNF) 1528 # 1529 # Try to find the SNF header file and library. 1530 # 1531 find_package(SNF) 1532 1533 # 1534 # Did we succeed? 1535 # 1536 if(SNF_FOUND) 1537 # 1538 # Yes. 1539 # 1540 include_directories(AFTER ${SNF_INCLUDE_DIRS}) 1541 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-snf.c) 1542 set(HAVE_SNF_API TRUE) 1543 set(PCAP_LINK_LIBRARIES ${PCAP_LINK_LIBRARIES} ${SNF_LIBRARIES}) 1544 endif() 1545 endif() 1546 1547 # Check for Riverbed TurboCap support. 1548 if(NOT DISABLE_TC) 1549 # 1550 # Try to find the TurboCap header file and library. 1551 # 1552 find_package(TC) 1553 1554 # 1555 # Did we succeed? 1556 # 1557 if(TC_FOUND) 1558 # 1559 # Yes. 1560 # 1561 include_directories(AFTER ${TC_INCLUDE_DIRS}) 1562 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-tc.c) 1563 set(HAVE_TC_API TRUE) 1564 set(PCAP_LINK_LIBRARIES "${PCAP_LINK_LIBRARIES} ${TC_LIBRARIES} ${CMAKE_USE_PTHREADS_INIT} stdc++") 1565 endif() 1566 endif() 1567 1568 # 1569 # Remote capture support. 1570 # 1571 1572 if(ENABLE_REMOTE) 1573 # 1574 # Check for various members of struct msghdr. 1575 # We need to include ftmacros.h on some platforms, to make sure we 1576 # get the POSIX/Single USER Specification version of struct msghdr, 1577 # which has those members, rather than the backwards-compatible 1578 # version, which doesn't. That's not a system header file, and 1579 # at least some versions of CMake include it as <ftmacros.h>, which 1580 # won't check the current directory, so we add the top-level 1581 # source directory to the list of include directories when we do 1582 # the check. 1583 # 1584 cmake_push_check_state() 1585 set(CMAKE_REQUIRED_INCLUDES ${CMAKE_SOURCE_DIR}) 1586 check_struct_has_member("struct msghdr" msg_control "ftmacros.h;sys/socket.h" HAVE_STRUCT_MSGHDR_MSG_CONTROL) 1587 check_struct_has_member("struct msghdr" msg_flags "ftmacros.h;sys/socket.h" HAVE_STRUCT_MSGHDR_MSG_FLAGS) 1588 cmake_pop_check_state() 1589 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} 1590 pcap-new.c pcap-rpcap.c rpcap-protocol.c sockutils.c) 1591 endif(ENABLE_REMOTE) 1592 1593 ################################################################### 1594 # Warning options 1595 ################################################################### 1596 1597 # 1598 # Check and add warning options if we have a .devel file. 1599 # 1600 if(EXISTS ${CMAKE_SOURCE_DIR}/.devel OR EXISTS ${CMAKE_BINARY_DIR}/.devel) 1601 # 1602 # Warning options. 1603 # 1604 if(MSVC AND NOT ${CMAKE_C_COMPILER} MATCHES "clang*") 1605 # 1606 # MSVC, with Microsoft's front end and code generator. 1607 # "MSVC" is also set for Microsoft's compiler with a Clang 1608 # front end and their code generator ("Clang/C2"), so we 1609 # check for clang.exe and treat that differently. 1610 # 1611 check_and_add_compiler_option(-Wall) 1612 # 1613 # Disable some pointless warnings that /Wall turns on. 1614 # 1615 # Unfortunately, MSVC does not appear to have an equivalent 1616 # to "__attribute__((unused))" to mark a particular function 1617 # parameter as being known to be unused, so that the compiler 1618 # won't warn about it (for example, the function might have 1619 # that parameter because a pointer to it is being used, and 1620 # the signature of that function includes that parameter). 1621 # C++ lets you give a parameter a type but no name, but C 1622 # doesn't have that. 1623 # 1624 check_and_add_compiler_option(-wd4100) 1625 # 1626 # In theory, we care whether somebody uses f() rather than 1627 # f(void) to declare a function with no arguments, but, in 1628 # practice, there are places in the Windows header files 1629 # that appear to do that, so we squelch that warning. 1630 # 1631 check_and_add_compiler_option(-wd4255) 1632 # 1633 # Windows FD_SET() generates this, so we suppress it. 1634 # 1635 check_and_add_compiler_option(-wd4548) 1636 # 1637 # Perhaps testing something #defined to be 0 with #ifdef is an 1638 # error, and it should be tested with #if, but perhaps it's 1639 # not, and Microsoft does that in its headers, so we squelch 1640 # that warning. 1641 # 1642 check_and_add_compiler_option(-wd4574) 1643 # 1644 # The Windows headers also test not-defined values in #if, so 1645 # we don't want warnings about that, either. 1646 # 1647 check_and_add_compiler_option(-wd4668) 1648 # 1649 # We do *not* care whether some function is, or isn't, going to be 1650 # expanded inline. 1651 # 1652 check_and_add_compiler_option(-wd4710) 1653 check_and_add_compiler_option(-wd4711) 1654 # 1655 # We do *not* care whether we're adding padding bytes after 1656 # structure members. 1657 # 1658 check_and_add_compiler_option(-wd4820) 1659 else() 1660 # 1661 # Other compilers, including MSVC with a Clang front end and 1662 # Microsoft's code generator. We currently treat them as if 1663 # they might support GCC-style -W options. 1664 # 1665 check_and_add_compiler_option(-Wall) 1666 check_and_add_compiler_option(-Wsign-compare) 1667 check_and_add_compiler_option(-Wmissing-prototypes) 1668 check_and_add_compiler_option(-Wstrict-prototypes) 1669 check_and_add_compiler_option(-Wshadow) 1670 check_and_add_compiler_option(-Wdeclaration-after-statement) 1671 check_and_add_compiler_option(-Wused-but-marked-unused) 1672 check_and_add_compiler_option(-Wdocumentation) 1673 check_and_add_compiler_option(-Wcomma) 1674 check_and_add_compiler_option(-Wmissing-noreturn) 1675 # Warns about safeguards added in case the enums are extended 1676 # check_and_add_compiler_option(-Wcovered-switch-default) 1677 check_and_add_compiler_option(-Wmissing-variable-declarations) 1678 check_and_add_compiler_option(-Wunused-parameter) 1679 check_and_add_compiler_option(-Wformat-nonliteral) 1680 check_and_add_compiler_option(-Wunreachable-code) 1681 endif() 1682 endif() 1683 1684 # 1685 # Suppress some warnings we get with MSVC even without /Wall. 1686 # 1687 if(MSVC AND NOT ${CMAKE_C_COMPILER} MATCHES "clang*") 1688 # 1689 # Yes, we have some functions that never return but that 1690 # have a non-void return type. That's because, on some 1691 # platforms, they *do* return values but, on other 1692 # platforms, including Windows, they just fail and 1693 # longjmp out by calling bpf_error(). 1694 # 1695 check_and_add_compiler_option(-wd4646) 1696 endif() 1697 1698 file(GLOB PROJECT_SOURCE_LIST_H 1699 *.h 1700 pcap/*.h 1701 ) 1702 1703 # 1704 # Try to have the compiler default to hiding symbols, so that only 1705 # symbols explicitly exported with PCAP_API will be visible outside 1706 # (shared) libraries. 1707 # 1708 # Not necessary with MSVC, as that's the default. 1709 # 1710 # XXX - we don't use ADD_COMPILER_EXPORT_FLAGS, because, as of CMake 1711 # 2.8.12.2, it doesn't know about Sun C/Oracle Studio, and, as of 1712 # CMake 2.8.6, it only sets the C++ compiler flags, rather than 1713 # allowing an arbitrary variable to be set with the "hide symbols 1714 # not explicitly exported" flag. 1715 # 1716 if(NOT MSVC) 1717 if(CMAKE_C_COMPILER_ID MATCHES "SunPro") 1718 # 1719 # Sun C/Oracle Studio. 1720 # 1721 check_and_add_compiler_option(-xldscope=hidden) 1722 else() 1723 # 1724 # Try this for all other compilers; it's what GCC uses, 1725 # and a number of other compilers, such as Clang and Intel C, 1726 # use it as well. 1727 # 1728 check_and_add_compiler_option(-fvisibility=hidden) 1729 endif() 1730 endif(NOT MSVC) 1731 1732 # 1733 # Flex/Lex and YACC/Berkeley YACC/Bison. 1734 # From a mail message to the CMake mailing list by Andy Cedilnik of 1735 # Kitware. 1736 # 1737 1738 # 1739 # Try to find Flex, a Windows version of Flex, or Lex. 1740 # 1741 find_program(LEX_EXECUTABLE NAMES flex win_flex lex) 1742 if(LEX_EXECUTABLE STREQUAL "LEX_EXECUTABLE-NOTFOUND") 1743 message(FATAL_ERROR "Neither flex nor win_flex nor lex was found.") 1744 endif() 1745 message(STATUS "Lexical analyzer generator: ${LEX_EXECUTABLE}") 1746 1747 add_custom_command( 1748 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/scanner.c ${CMAKE_CURRENT_BINARY_DIR}/scanner.h 1749 SOURCE ${pcap_SOURCE_DIR}/scanner.l 1750 COMMAND ${LEX_EXECUTABLE} -P pcap_ --header-file=scanner.h --nounput -o${CMAKE_CURRENT_BINARY_DIR}/scanner.c ${pcap_SOURCE_DIR}/scanner.l 1751 DEPENDS ${pcap_SOURCE_DIR}/scanner.l 1752 ) 1753 1754 # 1755 # Since scanner.c does not exist yet when cmake is run, mark 1756 # it as generated. 1757 # 1758 # Since scanner.c includes grammar.h, mark that as a dependency. 1759 # 1760 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/scanner.c PROPERTIES 1761 GENERATED TRUE 1762 OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/grammar.h 1763 ) 1764 1765 # 1766 # Add scanner.c to the list of sources. 1767 # 1768 #set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} ${CMAKE_CURRENT_BINARY_DIR}/scanner.c) 1769 1770 # 1771 # Try to find YACC or Bison. 1772 # 1773 find_program(YACC_EXECUTABLE NAMES bison win_bison byacc yacc) 1774 if(YACC_EXECUTABLE STREQUAL "YACC_EXECUTABLE-NOTFOUND") 1775 message(FATAL_ERROR "Neither bison nor win_bison nor byacc nor yacc was found.") 1776 endif() 1777 message(STATUS "Parser generator: ${YACC_EXECUTABLE}") 1778 1779 # 1780 # Create custom command for the scanner. 1781 # Find out whether it's Bison or not by looking at the last component 1782 # of the path (without a .exe extension, if this is Windows). 1783 # 1784 get_filename_component(YACC_NAME ${YACC_EXECUTABLE} NAME_WE) 1785 if("${YACC_NAME}" STREQUAL "bison" OR "${YACC_NAME}" STREQUAL "win_bison") 1786 set(YACC_COMPATIBILITY_FLAG "-y") 1787 endif() 1788 add_custom_command( 1789 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/grammar.c ${CMAKE_CURRENT_BINARY_DIR}/grammar.h 1790 SOURCE ${pcap_SOURCE_DIR}/grammar.y 1791 COMMAND ${YACC_EXECUTABLE} ${YACC_COMPATIBILITY_FLAG} -p pcap_ -o ${CMAKE_CURRENT_BINARY_DIR}/grammar.c -d ${pcap_SOURCE_DIR}/grammar.y 1792 DEPENDS ${pcap_SOURCE_DIR}/grammar.y 1793 ) 1794 1795 # 1796 # Since grammar.c does not exists yet when cmake is run, mark 1797 # it as generated. 1798 # 1799 set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/grammar.c PROPERTIES 1800 GENERATED TRUE 1801 OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/scanner.h 1802 ) 1803 1804 # 1805 # Add grammar.c to the list of sources. 1806 # 1807 #set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} ${CMAKE_CURRENT_BINARY_DIR}/grammar.c) 1808 1809 # 1810 # Assume, by default, no support for shared libraries and V7/BSD 1811 # convention for man pages (file formats in section 5, miscellaneous 1812 # info in section 7, administrative commands and daemons in section 8). 1813 # Individual cases can override this. 1814 # 1815 set(MAN_FILE_FORMATS 5) 1816 set(MAN_MISC_INFO 7) 1817 set(MAN_ADMIN_COMMANDS 8) 1818 if(CMAKE_SYSTEM_NAME STREQUAL "AIX") 1819 # Workaround to enable certain features 1820 set(_SUN TRUE) 1821 if(PCAP_TYPE STREQUAL "bpf") 1822 # 1823 # If we're using BPF, we need libodm and libcfg, as 1824 # we use them to load the BPF module. 1825 # 1826 set(PCAP_LINK_LIBRARIES ${PCAP_LINK_LIBRARIES} odm cfg) 1827 endif() 1828 elseif(CMAKE_SYSTEM_NAME STREQUAL "HP-UX") 1829 if(CMAKE_SYSTEM_VERSION MATCHES "[A-Z.]*9\.[0-9]*") 1830 # 1831 # HP-UX 9.x. 1832 # 1833 set(HAVE_HPUX9 TRUE) 1834 elseif(CMAKE_SYSTEM_VERSION MATCHES "[A-Z.]*10\.0") 1835 # 1836 # HP-UX 10.0. 1837 # 1838 elseif(CMAKE_SYSTEM_VERSION MATCHES "[A-Z.]*10\.1") 1839 # 1840 # HP-UX 10.1. 1841 # 1842 else() 1843 # 1844 # HP-UX 10.20 and later. 1845 # 1846 set(HAVE_HPUX10_20_OR_LATER TRUE) 1847 endif() 1848 1849 # 1850 # Use System V conventions for man pages. 1851 # 1852 set(MAN_ADMIN_COMMANDS 1m) 1853 set(MAN_FILE_FORMATS 4) 1854 set(MAN_MISC_INFO 5) 1855 elseif(CMAKE_SYSTEM_NAME STREQUAL "IRIX" OR CMAKE_SYSTEM_NAME STREQUAL "IRIX64") 1856 # 1857 # Use IRIX conventions for man pages; they're the same as the 1858 # System V conventions, except that they use section 8 for 1859 # administrative commands and daemons. 1860 # 1861 set(MAN_FILE_FORMATS 4) 1862 set(MAN_MISC_INFO 5) 1863 elseif(CMAKE_SYSTEM_NAME STREQUAL "OSF1") 1864 # 1865 # DEC OSF/1, a/k/a Digial UNIX, a/k/a Tru64 UNIX. 1866 # Use Tru64 UNIX conventions for man pages; they're the same as the 1867 # System V conventions except that they use section 8 for 1868 # administrative commands and daemons. 1869 # 1870 set(MAN_FILE_FORMATS 4) 1871 set(MAN_MISC_INFO 5) 1872 elseif(CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND CMAKE_SYSTEM_VERSION MATCHES "5[.][0-9.]*") 1873 # 1874 # SunOS 5.x. 1875 # 1876 set(HAVE_SOLARIS TRUE) 1877 # 1878 # Make sure errno is thread-safe, in case we're called in 1879 # a multithreaded program. We don't guarantee that two 1880 # threads can use the *same* pcap_t safely, but the 1881 # current version does guarantee that you can use different 1882 # pcap_t's in different threads, and even that pcap_compile() 1883 # is thread-safe (it wasn't thread-safe in some older versions). 1884 # 1885 add_definitions(-D_TS_ERRNO) 1886 1887 if(CMAKE_SYSTEM_VERSION STREQUAL "5.12") 1888 else() 1889 # 1890 # Use System V conventions for man pages. 1891 # 1892 set(MAN_ADMIN_COMMANDS 1m) 1893 set(MAN_FILE_FORMATS 4) 1894 set(MAN_MISC_INFO 5) 1895 endif() 1896 endif() 1897 1898 source_group("Source Files" FILES ${PROJECT_SOURCE_LIST_C}) 1899 source_group("Header Files" FILES ${PROJECT_SOURCE_LIST_H}) 1900 1901 if(WIN32) 1902 # 1903 # Add pcap-dll.rc to the list of sources. 1904 # 1905 set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} ${pcap_SOURCE_DIR}/pcap-dll.rc) 1906 endif(WIN32) 1907 1908 # 1909 # Add subdirectories after we've set various variables, so they pick up 1910 # pick up those variables. 1911 # 1912 if(ENABLE_REMOTE) 1913 add_subdirectory(rpcapd) 1914 endif(ENABLE_REMOTE) 1915 add_subdirectory(testprogs) 1916 1917 ###################################### 1918 # Register targets 1919 ###################################### 1920 1921 # 1922 # Special target to serialize the building of the generated source. 1923 # 1924 # See 1925 # 1926 # http://public.kitware.com/pipermail/cmake/2013-August/055510.html 1927 # 1928 add_custom_target(SerializeTarget 1929 DEPENDS 1930 ${CMAKE_CURRENT_BINARY_DIR}/grammar.c 1931 ${CMAKE_CURRENT_BINARY_DIR}/scanner.c 1932 ) 1933 1934 set_source_files_properties(${PROJECT_EXTERNAL_OBJECT_LIST} PROPERTIES 1935 EXTERNAL_OBJECT TRUE) 1936 1937 if(BUILD_SHARED_LIBS) 1938 add_library(${LIBRARY_NAME} SHARED 1939 ${PROJECT_SOURCE_LIST_C} 1940 ${CMAKE_CURRENT_BINARY_DIR}/grammar.c 1941 ${CMAKE_CURRENT_BINARY_DIR}/scanner.c 1942 ${PROJECT_EXTERNAL_OBJECT_LIST} 1943 ) 1944 add_dependencies(${LIBRARY_NAME} SerializeTarget) 1945 set_target_properties(${LIBRARY_NAME} PROPERTIES 1946 COMPILE_DEFINITIONS BUILDING_PCAP) 1947 endif(BUILD_SHARED_LIBS) 1948 1949 add_library(${LIBRARY_NAME}_static STATIC 1950 ${PROJECT_SOURCE_LIST_C} 1951 ${CMAKE_CURRENT_BINARY_DIR}/grammar.c 1952 ${CMAKE_CURRENT_BINARY_DIR}/scanner.c 1953 ${PROJECT_EXTERNAL_OBJECT_LIST} 1954 ) 1955 add_dependencies(${LIBRARY_NAME}_static SerializeTarget) 1956 set_target_properties(${LIBRARY_NAME}_static PROPERTIES 1957 COMPILE_DEFINITIONS BUILDING_PCAP) 1958 1959 if(WIN32) 1960 if(BUILD_SHARED_LIBS) 1961 set_target_properties(${LIBRARY_NAME} PROPERTIES 1962 VERSION ${PACKAGE_VERSION_NOSUFFIX} # only MAJOR and MINOR are needed 1963 ) 1964 endif(BUILD_SHARED_LIBS) 1965 if(MSVC) 1966 # XXX For DLLs, the TARGET_PDB_FILE generator expression can be used to locate 1967 # its PDB file's output directory for installation. 1968 # cmake doesn't offer a generator expression for PDB files generated by the 1969 # compiler (static libraries). 1970 # So instead of considering any possible output there is (there are many), 1971 # this will search for the PDB file in the compiler's initial output directory, 1972 # which is always ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles\wpcap_static.dir 1973 # regardless of architecture, build generator etc. 1974 # Quite hackish indeed. 1975 set(CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY $<TARGET_FILE_DIR:${LIBRARY_NAME}_static>) 1976 set_target_properties(${LIBRARY_NAME}_static PROPERTIES 1977 COMPILE_PDB_NAME ${LIBRARY_NAME}_static 1978 OUTPUT_NAME "${LIBRARY_NAME}_static" 1979 ) 1980 elseif(MINGW) 1981 # 1982 # For compatibility, build the shared library without the "lib" prefix on 1983 # MinGW as well. 1984 # 1985 set_target_properties(${LIBRARY_NAME} PROPERTIES 1986 PREFIX "" 1987 OUTPUT_NAME "${LIBRARY_NAME}" 1988 ) 1989 set_target_properties(${LIBRARY_NAME}_static PROPERTIES 1990 OUTPUT_NAME "${LIBRARY_NAME}" 1991 ) 1992 endif() 1993 else(WIN32) # UN*X 1994 if(BUILD_SHARED_LIBS) 1995 if(APPLE) 1996 set_target_properties(${LIBRARY_NAME} PROPERTIES 1997 VERSION ${PACKAGE_VERSION} 1998 SOVERSION A 1999 ) 2000 else(APPLE) 2001 set_target_properties(${LIBRARY_NAME} PROPERTIES 2002 VERSION ${PACKAGE_VERSION} 2003 SOVERSION ${PACKAGE_VERSION_MAJOR} 2004 ) 2005 endif(APPLE) 2006 endif(BUILD_SHARED_LIBS) 2007 set_target_properties(${LIBRARY_NAME}_static PROPERTIES 2008 OUTPUT_NAME "${LIBRARY_NAME}" 2009 ) 2010 endif(WIN32) 2011 2012 if(BUILD_SHARED_LIBS) 2013 if(NOT C_ADDITIONAL_FLAGS STREQUAL "") 2014 set_target_properties(${LIBRARY_NAME} PROPERTIES COMPILE_FLAGS ${C_ADDITIONAL_FLAGS}) 2015 endif() 2016 target_link_libraries(${LIBRARY_NAME} ${PCAP_LINK_LIBRARIES}) 2017 endif(BUILD_SHARED_LIBS) 2018 2019 if(NOT C_ADDITIONAL_FLAGS STREQUAL "") 2020 set_target_properties(${LIBRARY_NAME}_static PROPERTIES COMPILE_FLAGS ${C_ADDITIONAL_FLAGS}) 2021 endif() 2022 2023 ###################################### 2024 # Write out the config.h file 2025 ###################################### 2026 2027 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmakeconfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) 2028 2029 ###################################### 2030 # Install pcap library, include files, and man pages 2031 ###################################### 2032 2033 # 2034 # "Define GNU standard installation directories", which actually 2035 # are also defined, to some degree, by autotools, and at least 2036 # some of which are general UN*X conventions. 2037 # 2038 include(GNUInstallDirs) 2039 2040 set(LIBRARY_NAME_STATIC ${LIBRARY_NAME}_static) 2041 2042 function(install_manpage_symlink SOURCE TARGET MANDIR) 2043 if(MINGW) 2044 find_program(LINK_EXECUTABLE ln) 2045 if(LINK_EXECUTABLE) 2046 set(LINK_COMMAND "\"${LINK_EXECUTABLE}\" \"-s\" \"${SOURCE}\" \"${TARGET}\"") 2047 else(LINK_EXECUTABLE) 2048 message(FATAL_ERROR "ln (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ln.html) not found.") 2049 endif(LINK_EXECUTABLE) 2050 else(MINGW) 2051 set(LINK_COMMAND "\"${CMAKE_COMMAND}\" \"-E\" \"create_symlink\" \"${SOURCE}\" \"${TARGET}\"") 2052 endif(MINGW) 2053 2054 install(CODE 2055 "message(STATUS \"Symlinking: ${CMAKE_INSTALL_PREFIX}/${MANDIR}/${SOURCE} to ${TARGET}\") 2056 execute_process( 2057 COMMAND \"${CMAKE_COMMAND}\" \"-E\" \"remove\" \"${TARGET}\" 2058 WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${MANDIR} 2059 ) 2060 execute_process( 2061 COMMAND ${LINK_COMMAND} 2062 WORKING_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${MANDIR} 2063 RESULT_VARIABLE EXIT_STATUS 2064 ) 2065 if(NOT EXIT_STATUS EQUAL 0) 2066 message(FATAL_ERROR \"Could not create symbolic link from ${CMAKE_INSTALL_PREFIX}/${MANDIR}/${SOURCE} to ${TARGET}\") 2067 endif() 2068 set(CMAKE_INSTALL_MANIFEST_FILES \${CMAKE_INSTALL_MANIFEST_FILES} ${CMAKE_INSTALL_PREFIX}/${MANDIR}/${TARGET})") 2069 endfunction(install_manpage_symlink) 2070 2071 set(MAN1_NOEXPAND pcap-config.1) 2072 set(MAN3PCAP_EXPAND 2073 pcap.3pcap.in 2074 pcap_compile.3pcap.in 2075 pcap_datalink.3pcap.in 2076 pcap_dump_open.3pcap.in 2077 pcap_get_tstamp_precision.3pcap.in 2078 pcap_list_datalinks.3pcap.in 2079 pcap_list_tstamp_types.3pcap.in 2080 pcap_open_dead.3pcap.in 2081 pcap_open_offline.3pcap.in 2082 pcap_set_tstamp_precision.3pcap.in 2083 pcap_set_tstamp_type.3pcap.in 2084 ) 2085 set(MAN3PCAP_NOEXPAND 2086 pcap_activate.3pcap 2087 pcap_breakloop.3pcap 2088 pcap_can_set_rfmon.3pcap 2089 pcap_close.3pcap 2090 pcap_create.3pcap 2091 pcap_datalink_name_to_val.3pcap 2092 pcap_datalink_val_to_name.3pcap 2093 pcap_dump.3pcap 2094 pcap_dump_close.3pcap 2095 pcap_dump_file.3pcap 2096 pcap_dump_flush.3pcap 2097 pcap_dump_ftell.3pcap 2098 pcap_file.3pcap 2099 pcap_fileno.3pcap 2100 pcap_findalldevs.3pcap 2101 pcap_freecode.3pcap 2102 pcap_get_required_select_timeout.3pcap 2103 pcap_get_selectable_fd.3pcap 2104 pcap_geterr.3pcap 2105 pcap_inject.3pcap 2106 pcap_is_swapped.3pcap 2107 pcap_lib_version.3pcap 2108 pcap_lookupdev.3pcap 2109 pcap_lookupnet.3pcap 2110 pcap_loop.3pcap 2111 pcap_major_version.3pcap 2112 pcap_next_ex.3pcap 2113 pcap_offline_filter.3pcap 2114 pcap_open_live.3pcap 2115 pcap_set_buffer_size.3pcap 2116 pcap_set_datalink.3pcap 2117 pcap_set_immediate_mode.3pcap 2118 pcap_set_promisc.3pcap 2119 pcap_set_protocol_linux.3pcap 2120 pcap_set_rfmon.3pcap 2121 pcap_set_snaplen.3pcap 2122 pcap_set_timeout.3pcap 2123 pcap_setdirection.3pcap 2124 pcap_setfilter.3pcap 2125 pcap_setnonblock.3pcap 2126 pcap_snapshot.3pcap 2127 pcap_stats.3pcap 2128 pcap_statustostr.3pcap 2129 pcap_strerror.3pcap 2130 pcap_tstamp_type_name_to_val.3pcap 2131 pcap_tstamp_type_val_to_name.3pcap 2132 ) 2133 set(MANFILE_EXPAND pcap-savefile.manfile.in) 2134 set(MANMISC_EXPAND 2135 pcap-filter.manmisc.in 2136 pcap-linktype.manmisc.in 2137 pcap-tstamp.manmisc.in 2138 ) 2139 2140 if(NOT BUILD_SHARED_LIBS) 2141 unset(LIBRARY_NAME) 2142 endif(NOT BUILD_SHARED_LIBS) 2143 2144 if(WIN32) 2145 if(MSVC AND CMAKE_SIZEOF_VOID_P EQUAL 8) 2146 # 2147 # Install 64-bit code built with MSVC in the amd64 subdirectories, 2148 # as that's where it expects it to be. 2149 # 2150 install(TARGETS ${LIBRARY_NAME} ${LIBRARY_NAME_STATIC} 2151 RUNTIME DESTINATION bin/amd64 2152 LIBRARY DESTINATION lib/amd64 2153 ARCHIVE DESTINATION lib/amd64) 2154 if(NOT MINGW) 2155 install(FILES $<TARGET_FILE_DIR:${LIBRARY_NAME_STATIC}>/${LIBRARY_NAME_STATIC}.pdb 2156 DESTINATION bin/amd64 OPTIONAL) 2157 if(BUILD_SHARED_LIBS) 2158 install(FILES $<TARGET_PDB_FILE:${LIBRARY_NAME}> 2159 DESTINATION bin/amd64 OPTIONAL) 2160 endif(BUILD_SHARED_LIBS) 2161 endif(NOT MINGW) 2162 else(MSVC AND CMAKE_SIZEOF_VOID_P EQUAL 8) 2163 # 2164 # Install 32-bit code, and 64-bit code not built with MSVC 2165 # in the top-level directories, as those are where they 2166 # expect it to be. 2167 # 2168 install(TARGETS ${LIBRARY_NAME} ${LIBRARY_NAME_STATIC} 2169 RUNTIME DESTINATION bin 2170 LIBRARY DESTINATION lib 2171 ARCHIVE DESTINATION lib) 2172 if(NOT MINGW) 2173 install(FILES $<TARGET_FILE_DIR:${LIBRARY_NAME_STATIC}>/${LIBRARY_NAME_STATIC}.pdb 2174 DESTINATION bin OPTIONAL) 2175 if(BUILD_SHARED_LIBS) 2176 install(FILES $<TARGET_PDB_FILE:${LIBRARY_NAME}> 2177 DESTINATION bin OPTIONAL) 2178 endif(BUILD_SHARED_LIBS) 2179 endif(NOT MINGW) 2180 endif(MSVC AND CMAKE_SIZEOF_VOID_P EQUAL 8) 2181 else(WIN32) 2182 install(TARGETS ${LIBRARY_NAME} ${LIBRARY_NAME_STATIC} DESTINATION lib) 2183 endif(WIN32) 2184 2185 install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/pcap/ DESTINATION include/pcap) 2186 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/pcap.h DESTINATION include) 2187 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/pcap-bpf.h DESTINATION include) 2188 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/pcap-namedb.h DESTINATION include) 2189 2190 # On UN*X, and on Windows when not using MSVC, generate libpcap.pc and 2191 # pcap-config and process man pages and arrange that they be installed. 2192 if(NOT MSVC) 2193 set(PACKAGE_NAME ${LIBRARY_NAME}) 2194 set(prefix ${CMAKE_INSTALL_PREFIX}) 2195 set(exec_prefix "\${prefix}") 2196 set(includedir "\${prefix}/include") 2197 set(libdir "\${exec_prefix}/lib") 2198 if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" OR 2199 CMAKE_SYSTEM_NAME STREQUAL "NetBSD" OR 2200 CMAKE_SYSTEM_NAME STREQUAL "OpenBSD" OR 2201 CMAKE_SYSTEM_NAME STREQUAL "DragonFly BSD" OR 2202 CMAKE_SYSTEM_NAME STREQUAL "Linux" OR 2203 CMAKE_SYSTEM_NAME STREQUAL "OSF1") 2204 # 2205 # Platforms where the linker is the GNU linker 2206 # or accepts command-line arguments like 2207 # those the GNU linker accepts. 2208 # 2209 set(V_RPATH_OPT "-Wl,-rpath,") 2210 elseif(CMAKE_SYSTEM_NAME STREQUAL "SunOS" AND CMAKE_SYSTEM_VERSION MATCHES "5[.][0-9.]*") 2211 # 2212 # SunOS 5.x. 2213 # 2214 # XXX - this assumes GCC is using the Sun linker, 2215 # rather than the GNU linker. 2216 # 2217 set(V_RPATH_OPT "-Wl,-R,") 2218 else() 2219 # 2220 # No option needed to set the RPATH. 2221 # 2222 set(V_RPATH_OPT "") 2223 endif() 2224 set(LIBS "") 2225 foreach(LIB ${PCAP_LINK_LIBRARIES}) 2226 set(LIBS "${LIBS} -l${LIB}") 2227 endforeach(LIB) 2228 configure_file(${CMAKE_SOURCE_DIR}/pcap-config.in ${CMAKE_CURRENT_BINARY_DIR}/pcap-config @ONLY) 2229 configure_file(${CMAKE_SOURCE_DIR}/libpcap.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libpcap.pc @ONLY) 2230 install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/pcap-config DESTINATION bin) 2231 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpcap.pc DESTINATION lib/pkgconfig) 2232 2233 # 2234 # Man pages. 2235 # 2236 # For each section of the manual for which we have man pages 2237 # that require macro expansion, do the expansion. 2238 # 2239 set(MAN1 "") 2240 foreach(MANPAGE ${MAN1_NOEXPAND}) 2241 set(MAN1 ${MAN1} ${CMAKE_SOURCE_DIR}/${MANPAGE}) 2242 endforeach(MANPAGE) 2243 install(FILES ${MAN1} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) 2244 2245 set(MAN3PCAP "") 2246 foreach(MANPAGE ${MAN3PCAP_NOEXPAND}) 2247 set(MAN3PCAP ${MAN3PCAP} ${CMAKE_SOURCE_DIR}/${MANPAGE}) 2248 endforeach(MANPAGE) 2249 foreach(TEMPLATE_MANPAGE ${MAN3PCAP_EXPAND}) 2250 string(REPLACE ".in" "" MANPAGE ${TEMPLATE_MANPAGE}) 2251 configure_file(${CMAKE_SOURCE_DIR}/${TEMPLATE_MANPAGE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE} @ONLY) 2252 set(MAN3PCAP ${MAN3PCAP} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE}) 2253 endforeach(TEMPLATE_MANPAGE) 2254 install(FILES ${MAN3PCAP} DESTINATION ${CMAKE_INSTALL_MANDIR}/man3) 2255 install_manpage_symlink(pcap_datalink_val_to_name.3pcap pcap_datalink_val_to_description.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2256 install_manpage_symlink(pcap_dump_open.3pcap pcap_dump_fopen.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2257 install_manpage_symlink(pcap_findalldevs.3pcap pcap_freealldevs.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2258 install_manpage_symlink(pcap_geterr.3pcap pcap_perror.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2259 install_manpage_symlink(pcap_inject.3pcap pcap_sendpacket.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2260 install_manpage_symlink(pcap_list_datalinks.3pcap pcap_free_datalinks.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2261 install_manpage_symlink(pcap_list_tstamp_types.3pcap pcap_free_tstamp_types.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2262 install_manpage_symlink(pcap_loop.3pcap pcap_dispatch.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2263 install_manpage_symlink(pcap_major_version.3pcap pcap_minor_version.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2264 install_manpage_symlink(pcap_next_ex.3pcap pcap_next.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2265 install_manpage_symlink(pcap_open_dead.3pcap pcap_open_dead_with_tstamp_precision.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2266 install_manpage_symlink(pcap_open_offline.3pcap pcap_open_offline_with_tstamp_precision.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2267 install_manpage_symlink(pcap_open_offline.3pcap pcap_fopen_offline.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2268 install_manpage_symlink(pcap_open_offline.3pcap pcap_fopen_offline_with_tstamp_precision.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2269 install_manpage_symlink(pcap_tstamp_type_val_to_name.3pcap pcap_tstamp_type_val_to_description.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2270 install_manpage_symlink(pcap_setnonblock.3pcap pcap_getnonblock.3pcap ${CMAKE_INSTALL_MANDIR}/man3) 2271 2272 set(MANFILE "") 2273 foreach(TEMPLATE_MANPAGE ${MANFILE_EXPAND}) 2274 string(REPLACE ".manfile.in" ".${MAN_FILE_FORMATS}" MANPAGE ${TEMPLATE_MANPAGE}) 2275 configure_file(${CMAKE_SOURCE_DIR}/${TEMPLATE_MANPAGE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE} @ONLY) 2276 set(MANFILE ${MANFILE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE}) 2277 endforeach(TEMPLATE_MANPAGE) 2278 install(FILES ${MANFILE} DESTINATION ${CMAKE_INSTALL_MANDIR}/man${MAN_FILE_FORMATS}) 2279 2280 set(MANMISC "") 2281 foreach(TEMPLATE_MANPAGE ${MANMISC_EXPAND}) 2282 string(REPLACE ".manmisc.in" ".${MAN_MISC_INFO}" MANPAGE ${TEMPLATE_MANPAGE}) 2283 configure_file(${CMAKE_SOURCE_DIR}/${TEMPLATE_MANPAGE} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE} @ONLY) 2284 set(MANMISC ${MANMISC} ${CMAKE_CURRENT_BINARY_DIR}/${MANPAGE}) 2285 endforeach(TEMPLATE_MANPAGE) 2286 install(FILES ${MANMISC} DESTINATION ${CMAKE_INSTALL_MANDIR}/man${MAN_MISC_INFO}) 2287 endif(NOT MSVC) 2288 2289 # uninstall target 2290 configure_file( 2291 "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" 2292 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" 2293 IMMEDIATE @ONLY) 2294 2295 add_custom_target(uninstall 2296 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) 2297