wmem: allow wmem_destroy_list to ignore a NULL list.
[metze/wireshark/wip.git] / wsutil / CMakeLists.txt
index 1d5ad1c7d4605ca91a9fcd1e062c14d347f1c714..289a13e58f0906f63737a5e00d400dbd481b8ce1 100644 (file)
@@ -4,52 +4,81 @@
 # By Gerald Combs <gerald@wireshark.org>
 # Copyright 1998 Gerald Combs
 #
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# SPDX-License-Identifier: GPL-2.0-or-later
 #
 
 include(UseABICheck)
 
-if(WIN32)
-       set(WSUTIL_PLATFORM_FILES
-               file_util.c
-               inet_aton.c
-               inet_ntop.c
-               inet_pton.c
-               strptime.c
-               wsgetopt.c
-       )
-ENDIF(WIN32)
+add_definitions(-DPLUGIN_DIR=\"${CMAKE_INSTALL_PREFIX}/${PLUGIN_INSTALL_LIBDIR}\")
+add_definitions(-DEXTCAP_DIR=\"${CMAKE_INSTALL_PREFIX}/${EXTCAP_INSTALL_LIBDIR}\")
+add_definitions(-DDATA_DIR=\"${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}\")
 
-if(HAVE_SSE4_2)
-       set( WSUTIL_SSE42_FILES
-               ws_mempbrk_sse42.c
-       )
-endif()
+set(WSUTIL_PUBLIC_HEADERS
+       adler32.h
+       base32.h
+       bits_count_ones.h
+       bits_ctz.h
+       bitswap.h
+       buffer.h
+       color.h
+       copyright_info.h
+       cpu_info.h
+       crash_info.h
+       crc6.h
+       crc7.h
+       crc8.h
+       crc10.h
+       crc11.h
+       crc16.h
+       crc16-plain.h
+       crc32.h
+       curve25519.h
+       eax.h
+       filesystem.h
+       frequency-utils.h
+       g711.h
+       inet_addr.h
+       inet_ipv4.h
+       inet_ipv6.h
+       interface.h
+       jsmn.h
+       json_dumper.h
+       mpeg-audio.h
+       netlink.h
+       nstime.h
+       os_version_info.h
+       pint.h
+       plugins.h
+       pow2.h
+       privileges.h
+       processes.h
+       report_message.h
+       sign_ext.h
+       sober128.h
+       socket.h
+       str_util.h
+       strnatcmp.h
+       strtoi.h
+       tempfile.h
+       time_util.h
+       type_util.h
+       unicode-utils.h
+       utf8_entities.h
+       ws_cpuid.h
+       ws_mempbrk.h
+       ws_mempbrk_int.h
+       ws_pipe.h
+       ws_printf.h
+       wsjson.h
+       xtea.h
+)
 
-set(WSUTIL_FILES
+set(WSUTIL_COMMON_FILES
        adler32.c
-       aes.c
-       airpdcap_wep.c
-       base64.c
+       base32.c
        bitswap.c
-       cfutils.c
-       clopts_common.c
-       cmdarg_err.c
-       compiler_info.c
+       buffer.c
        copyright_info.c
-       cpu_info.c
        crash_info.c
        crc10.c
        crc16.c
@@ -59,115 +88,219 @@ set(WSUTIL_FILES
        crc7.c
        crc8.c
        crc11.c
-       crcdrm.c
-       des.c
+       curve25519.c
+       dot11decrypt_wep.c
        eax.c
        filesystem.c
+       frequency-utils.c
        g711.c
-       glib_version_info.c
-       md4.c
-       md5.c
-       mem_info.c
+       inet_addr.c
+       interface.c
+       jsmn.c
+       json_dumper.c
        mpeg-audio.c
        nstime.c
+       cpu_info.c
        os_version_info.c
-       plugins.c
        privileges.c
-       sha1.c
+       rsa.c
        sober128.c
        strnatcmp.c
        str_util.c
-       rc4.c
-       report_err.c
+       strtoi.c
+       report_message.c
        tempfile.c
        time_util.c
        type_util.c
-       u3.c
        unicode-utils.c
        ws_mempbrk.c
-       ws_mempbrk_sse42.c
-       ws_version_info.c
-       nghttp2/nghttp2_buf.c
-       nghttp2/nghttp2_hd.c
-       nghttp2/nghttp2_hd_huffman.c
-       nghttp2/nghttp2_hd_huffman_data.c
-       nghttp2/nghttp2_helper.c
-       ${WSUTIL_PLATFORM_FILES}
-       ${WSUTIL_SSE42_FILES}
+       ws_pipe.c
+       wsgcrypt.c
+       wsjson.c
+       xtea.c
 )
 
+if(ENABLE_PLUGINS)
+       list(APPEND WSUTIL_COMMON_FILES
+               plugins.c
+       )
+endif()
+
+set(WSUTIL_FILES ${WSUTIL_COMMON_FILES})
+if(WIN32)
+       list(APPEND WSUTIL_FILES
+               file_util.c
+               win32-utils.c
+       )
+endif(WIN32)
+
+
+if(HAVE_MACOS_FRAMEWORKS)
+       list(APPEND WSUTIL_FILES cfutils.c)
+endif()
+
+#
+# XXX - we're assuming MSVC doesn't require a flag to enable SSE 4.2
+# support, and that, if the compiler supports a flag for SSE 4.2
+# support, the intrinsics are supported iff we can include the
+# <nmmintrin.h> flag.
+#
+# We only check for the GCC-style -msse4.2 flag and the Sun C
+# -xarch=sse4_2 flag.
+#
+if(CMAKE_C_COMPILER_ID MATCHES "MSVC")
+       set(COMPILER_CAN_HANDLE_SSE4_2 TRUE)
+       set(SSE4_2_FLAG "")
+else()
+       message(STATUS "Checking for c-compiler flag: -msse4.2")
+       check_c_compiler_flag(-msse4.2 COMPILER_CAN_HANDLE_SSE4_2)
+       if(COMPILER_CAN_HANDLE_SSE4_2)
+               set(SSE4_2_FLAG "-msse4.2")
+       else()
+               message(STATUS "Checking for c-compiler flag: -xarch=sse4_2")
+               check_c_compiler_flag(-xarch=sse4_2 COMPILER_CAN_HANDLE_SSE4_2)
+               if(COMPILER_CAN_HANDLE_SSE4_2)
+                       set(SSE4_2_FLAG "-xarch=sse4_2")
+               endif()
+       endif()
+endif()
+if(COMPILER_CAN_HANDLE_SSE4_2)
+       #
+       # Make sure we have the necessary headers for the SSE4.2 intrinsics
+       # and that we can use them.
+       #
+       # First, check whether we have emmintrin.h and can use it
+       # *without* the SSE 4.2 flag.
+       #
+       check_include_file("emmintrin.h" EMMINTRIN_H_WORKS)
+
+       #
+       # OK, if that works, see whether we have nmmintrin.h and
+       # can use it *with* the SSE 4.2 flag.
+       #
+       if(EMMINTRIN_H_WORKS)
+               #
+               # Does this add the SSE4.2 flags to the beginning of
+               # CFLAGS?
+               #
+               # Note that if there's a mix of "enable SSE 4.2" and
+               # "disable SSE 4.2" flags, this may not indicate that
+               # we can use the header.  That's not a bug, that's a
+               # feature; the other flags may have been forced by
+               # the build process, e.g. in Gentoo Linux, and we want
+               # to check this with whatever flags will actually be
+               # used when building (see bug 10792).
+               #
+               cmake_push_check_state()
+               set(CMAKE_REQUIRED_FLAGS "${SSE4_2_FLAG}")
+               check_include_file("nmmintrin.h" HAVE_SSE4_2)
+               cmake_pop_check_state()
+       endif()
+endif()
+if(HAVE_SSE4_2)
+       list(APPEND WSUTIL_FILES ws_mempbrk_sse42.c)
+endif()
+
+if(NOT HAVE_GETOPT_LONG)
+       list(APPEND WSUTIL_FILES getopt_long.c)
+endif()
+
+if(NOT HAVE_STRPTIME)
+       list(APPEND WSUTIL_FILES strptime.c)
+endif()
+
 if(APPLE)
        #
-       # We assume that APPLE means OS X so that we have the OS X
+       # We assume that APPLE means macOS so that we have the macOS
        # frameworks.
        #
        FIND_LIBRARY (APPLE_CORE_FOUNDATION_LIBRARY CoreFoundation)
 endif()
 
-set(wsutil_LIBS
-       ${APPLE_CORE_FOUNDATION_LIBRARY}
-       ${GMODULE2_LIBRARIES}
-       ${GLIB2_LIBRARIES}
-       ${GCRYPT_LIBRARIES}
-       ${WIN_WSOCK32_LIBRARY}
-)
-IF(WIN32)
-       set(wsutil_LIBS ${wsutil_LIBS} "ws2_32.lib")
-ENDIF(WIN32)
-
-set(CLEAN_FILES
+set_source_files_properties(
        ${WSUTIL_FILES}
+       PROPERTIES
+       COMPILE_FLAGS "${WERROR_COMMON_FLAGS}"
 )
-
-if (WERROR)
-       set_source_files_properties(
-               ${CLEAN_FILES}
-               PROPERTIES
-               COMPILE_FLAGS -Werror
-       )
-endif()
 if (HAVE_SSE4_2)
+       # TODO with CMake 2.8.12, we could use COMPILE_OPTIONS and just append
+       # instead of this COMPILE_FLAGS duplication...
        set_source_files_properties(
-               ${WSUTIL_SSE42_FILES}
+               ws_mempbrk_sse42.c
                PROPERTIES
-               COMPILE_FLAGS -msse4.2
+               COMPILE_FLAGS "${WERROR_COMMON_FLAGS} ${SSE4_2_FLAG}"
        )
 endif()
 
-add_library(wsutil ${LINK_MODE_LIB}
+add_library(wsutil
        ${WSUTIL_FILES}
-       ../image/libwsutil.rc
+       ${CMAKE_BINARY_DIR}/image/libwsutil.rc
 )
 
-add_dependencies(wsutil gitversion)
-
-set(FULL_SO_VERSION "0.0.0")
-
-set_target_properties(wsutil PROPERTIES COMPILE_DEFINITIONS "WS_BUILD_DLL")
-set_target_properties(wsutil PROPERTIES LINK_FLAGS "${WS_LINK_FLAGS}")
-set_target_properties(wsutil PROPERTIES VERSION ${FULL_SO_VERSION} SOVERSION 0)
-set_target_properties(wsutil PROPERTIES FOLDER "DLLs")
+set_target_properties(wsutil PROPERTIES
+       PREFIX "lib"
+       COMPILE_DEFINITIONS "WS_BUILD_DLL"
+       LINK_FLAGS "${WS_LINK_FLAGS}"
+       VERSION "0.0.0" SOVERSION 0
+       FOLDER "DLLs"
+)
 
 ABICHECK(libwsutil)
 
 add_custom_command(OUTPUT libwsutil.abi.tar.gz
-       COMMAND cp ../config.h ${ABICHECK_TMPDIR}/
+       COMMAND ${CMAKE_COMMAND} -E remove_directory ${ABICHECK_TMPDIR}
+       COMMAND ${CMAKE_COMMAND} -E make_directory ${ABICHECK_TMPDIR}
+       COMMAND ${ABI_COPY_COMMAND} ../config.h ${ABICHECK_TMPDIR}/ ${ABI_COPY_FLAGS}
+       COMMAND ${ABI_COPY_COMMAND} ${ABICHECK_HEADERS} ${ABICHECK_TMPDIR}/ ${ABI_COPY_FLAGS}
        COMMAND ${ABICHECK_COMMAND}
        COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/abi_dumps/libwsutil/libwsutil_* ${CMAKE_CURRENT_BINARY_DIR}/libwsutil.abi.tar.gz
-       COMMAND rm -rf ${ABICHECK_TMPDIR}/* ${CMAKE_CURRENT_BINARY_DIR}/abi_dumps
+       COMMAND rm -rf ${ABICHECK_TMPDIR} ${CMAKE_CURRENT_BINARY_DIR}/abi_dumps
        DEPENDS ${HEADERS} wsutil)
 
-target_link_libraries(wsutil ${wsutil_LIBS})
+target_link_libraries(wsutil
+       PUBLIC
+       ${CMAKE_DL_LIBS}
+       ${APPLE_CORE_FOUNDATION_LIBRARY}
+       ${GMODULE2_LIBRARIES}
+       ${GLIB2_LIBRARIES}
+       ${PCAP_LIBRARIES}
+       ${GCRYPT_LIBRARIES}
+       ${WIN_WSOCK32_LIBRARY}
+       ${GNUTLS_LIBRARIES}
+)
 
-if(NOT ${ENABLE_STATIC})
-       install(TARGETS wsutil
-               LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
-               RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}
-               ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
-       )
-endif()
+if(WIN32)
+       target_link_libraries(wsutil PRIVATE "iphlpapi.lib" "ws2_32.lib")
+endif(WIN32)
+
+target_include_directories(wsutil SYSTEM
+       PUBLIC
+               ${PCAP_INCLUDE_DIRS}
+               ${GCRYPT_INCLUDE_DIRS}
+               ${GNUTLS_INCLUDE_DIRS}
+)
+
+install(TARGETS wsutil
+       EXPORT WiresharkTargets
+       RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+       LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+)
+
+install(FILES ${WSUTIL_PUBLIC_HEADERS}
+       DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${CPACK_PACKAGE_NAME}/wsutil"
+)
+
+CHECKAPI(
+       NAME
+         wsutil
+       SWITCHES
+         --group termoutput:2 --summary-group termoutput --build
+       SOURCES
+         ${WSUTIL_COMMON_FILES}
+)
 
-add_definitions( -DTOP_SRCDIR=\"${CMAKE_SOURCE_DIR}\" )
+set_source_files_properties(jsmn.c PROPERTIES COMPILE_DEFINITIONS "JSMN_STRICT")
 
 #
 # Editor modelines  -  http://www.wireshark.org/tools/modelines.html