From 0e1bf9f558da28449b0bdc310c382d62c241f2a4 Mon Sep 17 00:00:00 2001 From: Dan Cross Date: Thu, 4 Sep 2025 15:10:53 +0000 Subject: [PATCH] FreeBSD: link against libpcap On FreeBSD, one must actually link against libpcap (or give the path to a shared object at link time). That is, it is not a header-only library on that platform. Account for this by adding a new boolean variable in `platform-quirks.cmake`: `NEED_PCAP_LIBRARY`, which defaults to false. Condition pcap library discovery and link argument modifications on that variable in `FindPCAP.cmake` and `dep-link.cmake`. --- cmake/FindPCAP.cmake | 40 ++++++++++++++++++++++++------------- cmake/dep-link.cmake | 4 ++++ cmake/platform-quirks.cmake | 5 +++++ 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/cmake/FindPCAP.cmake b/cmake/FindPCAP.cmake index c3250046f..0d5ab6c62 100644 --- a/cmake/FindPCAP.cmake +++ b/cmake/FindPCAP.cmake @@ -32,18 +32,20 @@ find_path(PCAP_INCLUDE_DIR # set(LIB_PATH_SUFFIXES x86) # endif () -# find_library(PCAP_LIBRARY -# NAMES -# pcap pcap_static libpcap libpcap_static -# HINTS -# ENV PCAP_DIR -# PATH_SUFFIXES -# ${LIB_PATH_SUFFIXES} -# PATHS -# ${PCAP_PATH} -# ) -# ## message(STATUS "LIB_PATH_SUFFIXES ${LIB_PATH_SUFFIXES}") -# ## message(STATUS "PCAP_LIBRARY is ${PCAP_LIBRARY}") +if (NEED_PCAP_LIBRARY) + find_library(PCAP_LIBRARY + NAMES + pcap pcap_static libpcap libpcap_static + HINTS + ENV PCAP_DIR + PATH_SUFFIXES + ${LIB_PATH_SUFFIXES} + PATHS + ${PCAP_PATH} + ) + message(STATUS "LIB_PATH_SUFFIXES ${LIB_PATH_SUFFIXES}") + message(STATUS "PCAP_LIBRARY is ${PCAP_LIBRARY}") +endif() # if (WIN32 AND PCAP_LIBRARY) # ## Only worry about the packet library on Windows. @@ -62,15 +64,25 @@ find_path(PCAP_INCLUDE_DIR # endif (WIN32 AND PCAP_LIBRARY) # ## message(STATUS "PACKET_LIBRARY is ${PACKET_LIBRARY}") -# set(PCAP_LIBRARIES ${PCAP_LIBRARY} ${PACKET_LIBRARY}) +if (NEED_PCAP_LIBRARY) + set(PCAP_LIBRARIES ${PCAP_LIBRARY} ${PACKET_LIBRARY}) +endif() set(PCAP_INCLUDE_DIRS ${PCAP_INCLUDE_DIR}) unset(PCAP_LIBRARY) unset(PCAP_INCLUDE_DIR) include(FindPackageHandleStandardArgs) +if (NEED_PCAP_LIBRARY) +find_package_handle_standard_args( + PCAP + REQUIRED_VARS + PCAP_LIBRARIES + PCAP_INCLUDE_DIRS +) +else() find_package_handle_standard_args( PCAP REQUIRED_VARS - ## PCAP_LIBRARIES PCAP_INCLUDE_DIRS ) +endif() diff --git a/cmake/dep-link.cmake b/cmake/dep-link.cmake index 90c7707e0..325fa31af 100644 --- a/cmake/dep-link.cmake +++ b/cmake/dep-link.cmake @@ -308,6 +308,10 @@ if (WITH_NETWORK) endforeach() target_include_directories(simh_network INTERFACE "${PCAP_INCLUDE_DIRS}") + if (NEED_PCAP_LIBRARY) + target_link_directories(simh_network INTERFACE "${PCAP_LIBRARY_DIRS}") + target_link_libraries(simh_network INTERFACE "${PCAP_LIBRARIES}") + endif () target_compile_definitions(simh_network INTERFACE HAVE_PCAP_NETWORK) endif () endif () diff --git a/cmake/platform-quirks.cmake b/cmake/platform-quirks.cmake index 2113fec9b..bd9148247 100644 --- a/cmake/platform-quirks.cmake +++ b/cmake/platform-quirks.cmake @@ -264,3 +264,8 @@ if (CMAKE_HOST_APPLE) set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64") endif () endif() + +set(NEED_PCAP_LIBRARY FALSE) +if (${CMAKE_HOST_SYSTEM_NAME} MATCHES "FreeBSD") + set(NEED_PCAP_LIBRARY TRUE) +endif()