diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..4d9c27f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,150 @@ +project(QtZeroConf) +cmake_minimum_required(VERSION 2.8.11) + +find_package(Qt5 COMPONENTS Core Network) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(PUBLIC_HEADERS + qzeroconfservice.h + qzeroconfglobal.h + qzeroconf.h +) +add_library(QtZeroConf + ${PUBLIC_HEADERS} + qzeroconfservice.cpp +) + +if(BUILD_SHARED_LIBS) + target_compile_definitions(QtZeroConf PRIVATE QT_BUILD_ZEROCONF_LIB) +else() + target_compile_definitions(QtZeroConf PUBLIC QZEROCONF_STATIC) +endif() + +if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + target_sources(QtZeroConf PRIVATE + avahi-qt/qt-watch_p.h + avahi-qt/qt-watch.cpp + avahiclient.cpp + ) + list(APPEND ${PUBLIC_HEADERS} + avahi-qt/qt-watch.h + ) + target_link_libraries(QtZeroConf PRIVATE avahi-client) +endif() + +if(APPLE) + target_sources(QtZeroConf PRIVATE + bonjour_p.h + bonjour.cpp + ) + find_library(CoreServices CoreServices) + target_link_libraries(QtZeroConf PUBLIC ${CoreServices}) +endif() + +target_include_directories(QtZeroConf PUBLIC + $ + $ +) +target_link_libraries(QtZeroConf PUBLIC Qt5::Core Qt5::Network) + +if(WIN32) + target_sources(QtZeroConf PRIVATE + bonjour_p.h + bonjour.cpp + bonjour-sdk/dnssd_clientlib.c + bonjour-sdk/dnssd_clientstub.c + bonjour-sdk/dnssd_ipc.c + ) + target_link_libraries(QtZeroConf PUBLIC ws2_32) + if(MSVC) + target_link_libraries(QtZeroConf PUBLIC "legacy_stdio_definitions.lib") + endif() + target_compile_definitions(QtZeroConf PRIVATE + -DWIN32 + -D_USRDLL + -DMDNS_DEBUGMSGS=0 + -DWIN32_LEAN_AND_MEAN + -DUSE_TCP_LOOPBACK + -D_NO_CRT_STDIO_INLINE + -D_CRT_SECURE_NO_DEPRECATE + -D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 + -DNOT_HAVE_SA_LEN) + target_include_directories(QtZeroConf PRIVATE "${CMAKE_CURRENT_LIST_DIR}/bonjour-sdk") +endif() + + +if(ANDROID) + set(ACM "${CMAKE_CURRENT_LIST_DIR}/avahi-common") + set(ACR "${CMAKE_CURRENT_LIST_DIR}/avahi-core") + target_sources(QtZeroConf PRIVATE + qzeroconf.h + avahi-qt/qt-watch.h + avahi-qt/qt-watch_p.h + avahicore.cpp + avahi-qt/qt-watch.cpp + ${ACM}/address.c + ${ACM}/alternative.c + ${ACM}/domain.c + ${ACM}/error.c + ${ACM}/i18n.c + ${ACM}/malloc.c + ${ACM}/rlist.c + ${ACM}/simple-watch.c + ${ACM}/strlst.c + ${ACM}/thread-watch.c + ${ACM}/timeval.c + ${ACM}/utf8.c + ${ACR}/addr-util.c + ${ACR}/announce.c + ${ACR}/browse.c + ${ACR}/browse-dns-server.c + ${ACR}/browse-domain.c + ${ACR}/browse-service.c + ${ACR}/browse-service-type.c + ${ACR}/cache.c + ${ACR}/dns.c + ${ACR}/domain-util.c + ${ACR}/entry.c + ${ACR}/fdutil.c + ${ACR}/hashmap.c + ${ACR}/iface.c + ${ACR}/iface-linux.c + ${ACR}/log.c + ${ACR}/multicast-lookup.c + ${ACR}/netlink.c + ${ACR}/prioq.c + ${ACR}/probe-sched.c + ${ACR}/querier.c + ${ACR}/query-sched.c + ${ACR}/resolve-address.c + ${ACR}/resolve-host-name.c + ${ACR}/resolve-service.c + ${ACR}/response-sched.c + ${ACR}/rr.c + ${ACR}/rrlist.c + ${ACR}/server.c + ${ACR}/socket.c + ${ACR}/timeeventq.c + ${ACR}/util.c + ${ACR}/wide-area.c + ) + list(APPEND ${PUBLIC_HEADERS} + avahi-qt/qt-watch.h + ) + target_compile_definitions(QtZeroConf PRIVATE HAVE_STRLCPY GETTEXT_PACKAGE HAVE_NETLINK) +endif() + +# install +set_target_properties(QtZeroConf PROPERTIES PUBLIC_HEADER + "${PUBLIC_HEADERS}" +) +install(TARGETS QtZeroConf + LIBRARY DESTINATION lib + PUBLIC_HEADER DESTINATION include/QtZeroConf +) + +if(BUILD_EXAMPLE) + add_subdirectory(example) +endif() diff --git a/README.md b/README.md index 6a9c9c0..ce5285d 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,13 @@ QZeroConf can be built directly into your project if your project is [LGPL3](htt 1. Clone or download QZeroConf. If you download, unzip. 2. Enter the qtzeroconf directory, run qmake and then make. +#### Building with CMake +Use `BUILD_SHARED_LIBS` to control whether QZeroConf should be built as static (`-DBUILD_SHARED_LIBS=OFF`) or as shared (`-DBUILD_SHARED_LIBS=ON`) library. +The default is `OFF`. + +You can also build the included example project by setting `BUILD_EXAMPLE` to `ON`. +The default for this is `OFF` + ### API #### Service Publishing diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt new file mode 100644 index 0000000..1216105 --- /dev/null +++ b/example/CMakeLists.txt @@ -0,0 +1,25 @@ +project(QtZeroConfExample) +cmake_minimum_required(VERSION 2.8.11) + +find_package(Qt5 COMPONENTS Gui Widgets REQUIRED) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +# Find QtZeroConf library if we're building standalone +if(NOT TARGET QtZeroConf) + find_package(QtZeroConf CONFIG REQUIRED) +endif() + +add_executable(QtZeroConfExample + window.h + window.cpp + main.cpp +) + +target_link_libraries(QtZeroConfExample + QtZeroConf + Qt5::Gui Qt5::Widgets +)