diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 520 |
1 files changed, 520 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000000..0ed8b61291a6 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,520 @@ +cmake_minimum_required( VERSION 2.8.8 ) + +project( pcap ) +# +# Call the library "wpcap" on Windows, for backwards compatibility. +# +if( WIN32 ) + set( LIBRARY_NAME wpcap ) +else() + set( LIBRARY_NAME pcap ) +endif() + +################################################################### +# Parameters +################################################################### + +option (INET6 "Enable IPv6" ON) +if( MSVC ) + option (USE_STATIC_RT "Use static Runtime" ON) +endif( MSVC ) +option (BUILD_SHARED_LIBS "Build shared libraries" ON) +if( WIN32 ) + set(PACKET_DLL_DIR "" CACHE PATH "Path to directory with include and lib subdirectories for packet.dll") +endif( WIN32 ) + +# +# XXX - this should be an option, defaulting to "yes" for Windows and to +# "no", for now, on UN*X. +# +if( WIN32 ) + set( HAVE_REMOTE 1 ) +endif( WIN32 ) + +###################################### +# Project settings +###################################### + +add_definitions( -DHAVE_CONFIG_H ) + +include_directories( + ${CMAKE_CURRENT_BINARY_DIR} + ${pcap_SOURCE_DIR} +) + +if( WIN32 ) + if( NOT "${PACKET_DLL_DIR}" STREQUAL "" ) + include_directories("${PACKET_DLL_DIR}/Include") + if( CMAKE_CL_64 ) + link_directories("${PACKET_DLL_DIR}/Lib/x64") + else( CMAKE_CL_64 ) + link_directories("${PACKET_DLL_DIR}/Lib") + endif( CMAKE_CL_64 ) + endif() + include_directories( + ../Common/ + Win32/Include + ) +endif( WIN32) + +add_definitions( -DBUILDING_PCAP ) + +if( MSVC ) + add_definitions( -D__STDC__ ) + add_definitions( -D_CRT_SECURE_NO_WARNINGS ) + add_definitions( "-D_U_=" ) +elseif( CMAKE_COMPILER_IS_GNUCXX ) + add_definitions( "-D_U_=__attribute__((unused))" ) +else(MSVC) + add_definitions( "-D_U_=" ) +endif( MSVC ) + +if( MSVC ) + if (USE_STATIC_RT) + MESSAGE( STATUS "Use STATIC runtime" ) + set(NAME_RT MT) + set (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MT") + set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT") + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") + set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") + + set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MT") + set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MT") + set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") + set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd") + else (USE_STATIC_RT) + MESSAGE( STATUS "Use DYNAMIC runtime" ) + set(NAME_RT MD) + set (CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /MD") + set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MD") + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD") + set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd") + + set (CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} /MD") + set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /MD") + set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MD") + set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MDd") + endif (USE_STATIC_RT) +endif( MSVC ) + +################################################################### +# Detect available platform features +################################################################### + +include(CheckIncludeFile) +include(CheckFunctionExists) +include(CheckStructHasMember) +include(CheckTypeSize) + +# +# Header files. +# +check_include_file( inttypes.h HAVE_INTTYPES_H ) +check_include_file( stdint.h HAVE_STDINT_H ) +check_include_file( unistd.h HAVE_UNISTD_H ) +if( NOT HAVE_UNISTD_H ) + add_definitions( -DYY_NO_UNISTD_H ) +endif( NOT HAVE_UNISTD_H ) +check_include_file( bitypes.h HAVE_SYS_BITYPES_H ) +check_include_file( limits.h HAVE_LIMITS_H ) + +# +# Functions. +# +check_function_exists( strerror HAVE_STRERROR ) +check_function_exists( strlcpy HAVE_STRLCPY ) +check_function_exists( snprintf HAVE_SNPRINTF ) +check_function_exists( vsnprintf HAVE_VSNPRINTF ) +check_function_exists( strtok_r HAVE_STRTOK_R ) + +if (WIN32) + # + # Check for Windows-only functions, such as packet.dll functions. + # + check_function_exists( PacketIsLoopbackAdapter HAVE_PACKET_IS_LOOPBACK_ADAPTER ) +endif() + +# +# Data types. +# +# XXX - there's no check_struct() macro that's like check_struct_has_member() +# except that it only checks for the existence of the structure type, +# so we use check_struct_has_member() and look for ss_family. +# +check_struct_has_member("struct sockaddr_storage" ss_family sys/socket.h HAVE_SOCKADDR_STORAGE) +set(CMAKE_EXTRA_INCLUDE_FILES unistd.h sys/socket.h) +check_type_size("socklen_t" SOCKLEN_T) +set(CMAKE_EXTRA_INCLUDE_FILES unistd.h) + +# +# Structure fields. +# +check_struct_has_member("struct sockaddr" sa_len sys/socket.h HAVE_SOCKADDR_SA_LEN ) + +if( INET6 ) + MESSAGE( STATUS "Use IPv6" ) +endif( INET6 ) + +if( WIN32 ) + add_definitions( -DHAVE_ADDRINFO ) +endif( WIN32 ) + +###################################### +# External dependencies +###################################### + +###################################### +# Input files +###################################### + +set(PROJECT_SOURCE_LIST_C + bpf_dump.c + bpf_image.c + etherent.c + fad-helpers.c + gencode.c + inet.c + nametoaddr.c + optimize.c + pcap-common.c + pcap.c + savefile.c + sf-pcap-ng.c + sf-pcap.c + bpf/net/bpf_filter.c +) + +if( WIN32 ) + set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} missing/win_snprintf.c ) +else() + if( NOT HAVE_SNPRINTF ) + set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} missing/snprintf.c ) + endif( NOT HAVE_SNPRINTF ) + if( NOT HAVE_STRTOK_R ) + set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} missing/strtok_r.c ) + endif( NOT HAVE_STRTOK_R ) +endif( WIN32 ) + +if( HAVE_REMOTE ) + set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} + pcap-new.c pcap-rpcap.c sockutils.c) +endif( HAVE_REMOTE ) + +# +# Determine the main pcap-XXX.c file to use. +# +if( WIN32 ) + # + # WinPcap. + # + set( PCAP_TYPE win32 ) +else() + # + # UN*X - figure out what type of packet capture mechanism we + # have. + # + if( EXISTS /dev/bpf ) + # + # Cloning BPF device. + # + set( PCAP_TYPE bpf ) + AC_DEFINE(HAVE_CLONING_BPF,1,[define if you have a cloning BPF device]) + elseif( EXISTS /dev/bpf0 ) + set( PCAP_TYPE bpf ) + + # + # XXX - many more BPF checks. + # + elseif( EXISTS /usr/include/net/pfilt.h ) + # + # DEC OSF/1, Digital UNIX, Tru64 UNIX + # + set( PCAP_TYPE pf ) + elseif( EXISTS /dev/enet ) + set( PCAP_TYPE enet ) + elseif( EXISTS /dev/nit ) + set( PCAP_TYPE snit ) + elseif( EXISTS /usr/include/sys/net/nit.h ) + set( PCAP_TYPE nit ) + elseif( EXISTS /usr/include/linux/socket.h ) + set( PCAP_TYPE linux ) + + # + # Do we have the wireless extensions? + # + check_include_file( linux/wireless.h HAVE_LINUX_WIRELESS_H ) + + # + # XXX - many more Linux checks. + # + elseif( EXISTS /usr/include/net/raw.h ) + set( PCAP_TYPE snoop ) + elseif( EXISTS /usr/include/odmi.h ) + # + # On AIX, the BPF devices might not yet be present - they're + # created the first time libpcap runs after booting. + # We check for odmi.h instead. + # + set( PCAP_TYPE bpf ) + elseif( /usr/include/sys/dlpi.h ) + set( PCAP_TYPE dlpi ) + + # + # XXX - many more DLPI checks. + # + else() + set( PCAP_TYPE null ) + endif() +endif( WIN32 ) +message(STATUS "Packet capture mechanism type: ${PCAP_TYPE}") +set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} pcap-${PCAP_TYPE}.c) + +# +# Now figure out how we get a list of interfaces and addresses, +# if we support capturing. Don't bother if we don't support +# capturing. +# +if( NOT WIN32 ) + # + # UN*X - figure out what type of interface list mechanism we + # have. + # + if( ${PCAP_TYPE} STREQUAL "null" ) + # + # We can't capture, so we can't open any capture + # devices, so we won't return any interfaces. + # + set( FINDALLDEVS_TYPE null ) + else() + check_function_exists( getifaddrs HAVE_GETIFADDRS ) + if( ${HAVE_GETIFADDRS} ) + # + # We have "getifaddrs()"; make sure we have <ifaddrs.h> + # as well, just in case some platform is really weird. + # + check_include_file( ifaddrs.h HAVE_IFADDRS_H ) + if( ${HAVE_IFADDRS_H} ) + # + # We have the header, so we use "getifaddrs()" to + # get the list of interfaces. + # + set( FINDALLDEVS_TYPE getad ) + else() + # + # We don't have the header - give up. + # XXX - we could also fall back on some other + # mechanism, but, for now, this'll catch this + # problem so that we can at least try to figure + # out something to do on systems with "getifaddrs()" + # but without "ifaddrs.h", if there is something + # we can do on those systems. + # + message(FATAL_ERROR "Your system has getifaddrs() but doesn't have a usable <ifaddrs.h>." ) + endif() + else() + # + # Well, we don't have "getifaddrs()", so we have to use + # some other mechanism; determine what that mechanism is. + # + # The first thing we use is the type of capture mechanism, + # which is somewhat of a proxy for the OS we're using. + # + if( ${PCAP_TYPE} STREQUAL "dlpi" OR ${PCAP_TYPE} STREQUAL "libdlpi" ) + # + # This might be Solaris 8 or later, with + # SIOCGLIFCONF, or it might be some other OS + # or some older version of Solaris, with + # just SIOCGIFCONF. + # + try_compile( HAVE_SIOCGLIFCONF ${CMAKE_CURRENT_BINARY_DIR} "${pcap_SOURCE_DIR}/config/have_siocglifconf.c" ) + message( STATUS "HAVE_SIOCGLIFCONF = ${HAVE_SIOCGLIFCONF}" ) + if( HAVE_SIOCGLIFCONF ) + set( FINDALLDEVS_TYPE glifc ) + else() + set( FINDALLDEVS_TYPE gifc ) + endif() + else() + # + # Assume we just have SIOCGIFCONF. + # (XXX - on at least later Linux kernels, there's + # another mechanism, and we should be using that + # instead.) + # + set( FINDALLDEVS_TYPE gifc ) + endif() + endif() + endif() + message(STATUS "Find-interfaces mechanism type: ${FINDALLDEVS_TYPE}") + set( PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} fad-${FINDALLDEVS_TYPE}.c ) +endif() + +file(GLOB PROJECT_SOURCE_LIST_CORE_H + *.h + pcap/*.h +) +set( PROJECT_SOURCE_LIST_H ${PROJECT_SOURCE_LIST_H} ${PROJECT_SOURCE_LIST_CORE_H} ) + +if( WIN32 ) + file(GLOB PROJECT_SOURCE_LIST_WIN32_H + Win32/Include/*.h + ) + set( PROJECT_SOURCE_LIST_H ${PROJECT_SOURCE_LIST_H} ${PROJECT_SOURCE_LIST_WIN32_H} ) +endif( WIN32 ) + +# +# {Flex} and YACC/Berkeley YACC/Bison. +# From a mail message to the CMake mailing list by Andy Cedilnik of +# Kitware. +# + +# +# Try to find Flex, a Windows version of Flex, or Lex. +# +find_program(LEX_EXECUTABLE NAMES flex win_flex lex) +if( ${LEX_EXECUTABLE} STREQUAL "LEX_EXECUTABLE-NOTFOUND" ) + message(FATAL_ERROR "Neither flex nor win_flex nor lex was found." ) +endif() +message(STATUS "Lexical analyzer generator: ${LEX_EXECUTABLE}") + +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/scanner.c ${CMAKE_CURRENT_BINARY_DIR}/scanner.h + SOURCE ${pcap_SOURCE_DIR}/scanner.l + COMMAND ${LEX_EXECUTABLE} -P pcap_ --header-file=scanner.h --nounput -o${CMAKE_CURRENT_BINARY_DIR}/scanner.c ${pcap_SOURCE_DIR}/scanner.l + DEPENDS ${pcap_SOURCE_DIR}/scanner.l +) + +# +# Since scanner.c does not exist yet when cmake is run, mark +# it as generated. +# +# Since scanner.c includes grammar.h, mark that as a dependency. +# +set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/scanner.c PROPERTIES + GENERATED TRUE + OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/scanner.h +) + +# +# Add scanner.c to the list of sources. +# +#set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} ${CMAKE_CURRENT_BINARY_DIR}/scanner.c) + +# +# Try to find YACC or Bison. +# +find_program(YACC_EXECUTABLE NAMES bison win_bison byacc yacc) +if( ${YACC_EXECUTABLE} STREQUAL "YACC_EXECUTABLE-NOTFOUND" ) + message(FATAL_ERROR "Neither bison nor win_bison nor byacc nor yacc was found." ) +endif() +message(STATUS "Parser generator: ${YACC_EXECUTABLE}") + +# +# Create custom command for the scanner. +# Find out whether it's Bison or notby looking at the last component +# of the path (without a .exe extension, if this is Windows). +# +get_filename_component(YACC_NAME ${YACC_EXECUTABLE} NAME_WE) +if( "${YACC_NAME}" STREQUAL "bison" OR "${YACC_NAME}" STREQUAL "win_bison" ) + set( YACC_COMPATIBILITY_FLAG "-y" ) +endif() +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/grammar.c ${CMAKE_CURRENT_BINARY_DIR}/grammar.h + SOURCE ${pcap_SOURCE_DIR}/grammar.y + COMMAND ${YACC_EXECUTABLE} ${YACC_COMPATIBILITY_FLAG} -p pcap_ -o ${CMAKE_CURRENT_BINARY_DIR}/grammar.c -d ${pcap_SOURCE_DIR}/grammar.y + DEPENDS ${pcap_SOURCE_DIR}/grammar.y +) + +# +# Since grammar.c does not exists yet when cmake is run, mark +# it as generated. +# +set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/grammar.c PROPERTIES + GENERATED TRUE +) + +# +# Add grammar.c to the list of sources. +# +#set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} ${CMAKE_CURRENT_BINARY_DIR}/grammar.c) + +if( WIN32 ) + # + # CMake does not love Windows. + # + file(TO_NATIVE_PATH "${pcap_SOURCE_DIR}/GenVersion.bat" GenVersion_path) + file(TO_NATIVE_PATH "${pcap_SOURCE_DIR}/VERSION" VERSION_path) + file(TO_NATIVE_PATH "${pcap_SOURCE_DIR}/pcap_version.h.in" version_h_in_path) + file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h" version_h_path) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h + SOURCE ${pcap_SOURCE_DIR}/VERSION ${pcap_SOURCE_DIR}/pcap_version.h.in + COMMAND ${GenVersion_path} ${VERSION_path} ${version_h_in_path} ${version_h_path} + DEPENDS ${pcap_SOURCE_DIR}/VERSION ${pcap_SOURCE_DIR}/pcap_version.h.in + ) +else( WIN32 ) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/version.c + SOURCE ${pcap_SOURCE_DIR}/VERSION + COMMAND ${pcap_SOURCE_DIR}/gen_version_c.sh ${pcap_SOURCE_DIR}/VERSION ${CMAKE_CURRENT_BINARY_DIR}/version.c + DEPENDS ${pcap_SOURCE_DIR}/VERSION + ) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h + SOURCE ${pcap_SOURCE_DIR}/VERSION + COMMAND ${pcap_SOURCE_DIR}/gen_version_header.sh ${pcap_SOURCE_DIR}/VERSION ${pcap_SOURCE_DIR}/pcap_version.h.in ${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h + DEPENDS ${pcap_SOURCE_DIR}/VERSION + ) + + # + # Since version.c does not exists yet when cmake is run, mark + # it as generated. + # + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/version.c PROPERTIES + GENERATED TRUE + ) + + # + # Add version.c to the list of sources. + # + set(PROJECT_SOURCE_LIST_C ${PROJECT_SOURCE_LIST_C} ${CMAKE_CURRENT_BINARY_DIR}/version.c) +endif( WIN32 ) + +# +# Since pcap_version.h does not exists yet when cmake is run, mark +# it as generated. +# +set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h PROPERTIES + GENERATED TRUE +) + +# +# Add pcap_version.h to the list of headers. +# +set(PROJECT_SOURCE_LIST_H ${PROJECT_SOURCE_LIST_H} ${CMAKE_CURRENT_BINARY_DIR}/pcap_version.h) + +source_group("Source Files" FILES ${PROJECT_SOURCE_LIST_C}) +source_group("Header Files" FILES ${PROJECT_SOURCE_LIST_H}) + +###################################### +# Register targets +###################################### + +add_library(${LIBRARY_NAME} + ${PROJECT_SOURCE_LIST_C} + ${CMAKE_CURRENT_BINARY_DIR}/grammar.c + ${CMAKE_CURRENT_BINARY_DIR}/scanner.c + ${PROJECT_SOURCE_LIST_H} +) + +if( WIN32 ) + target_link_libraries ( ${LIBRARY_NAME} + packet + ws2_32 + ) +endif( WIN32 ) + +###################################### +# Write out the config.h file +###################################### + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmakeconfig.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h) |