From 437083ce423887b9c143dbe1281c09b396380b57 Mon Sep 17 00:00:00 2001 From: Stefan Profanter Date: Tue, 23 Jun 2020 15:15:53 +0200 Subject: [PATCH] fix: CMake improvements as suggested in #18 Credit to @madebr --- CMakeLists.txt | 27 +++++++++++++++---------- libmdnsd/CMakeLists.txt | 44 +++++++++++++++++++++-------------------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cd232be..c48f798 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,9 @@ cmake_minimum_required(VERSION 2.8) project(mdnsd) -set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/tools/cmake") +list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/tools/cmake") + +include(GNUInstallDirs) option(MDNSD_BUILD_OSS_FUZZ "Special build switch used in oss-fuzz" OFF) mark_as_advanced(MDNSD_BUILD_OSS_FUZZ) @@ -13,13 +15,21 @@ if(MDNSD_BUILD_FUZZING) add_definitions(-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) endif() +set(BUILD_SHARED_LIBS_DEFAULT ON) +if(MDNSD_BUILD_OSS_FUZZ) + set(BUILD_SHARED_LIBS_DEFAULT OFF) +endif() +option(BUILD_SHARED_LIBS "Build libmdnsd as a shared library" ${BUILD_SHARED_LIBS_DEFAULT}) + if(MDNSD_BUILD_FUZZING_CORPUS) add_definitions(-DMDNSD_DEBUG_DUMP_PKGS_FILE) endif() +option(MDNSD_ENABLE_SANITIZERS "enable sanitizers for mdnsd ON)" ON) + # Debug string(TOLOWER "${CMAKE_BUILD_TYPE}" BUILD_TYPE_LOWER_CASE) -if(BUILD_TYPE_LOWER_CASE STREQUAL "debug" AND UNIX) +if(MDNSD_ENABLE_SANITIZERS AND BUILD_TYPE_LOWER_CASE STREQUAL "debug" AND UNIX) if("x${CMAKE_C_COMPILER_ID}" STREQUAL "xClang") # Add default sanitizer settings when using clang and Debug build. # This allows e.g. CLion to find memory locations for SegFaults @@ -42,17 +52,14 @@ if(MDNSD_BUILD_FUZZING OR MDNSD_BUILD_OSS_FUZZ) endif() add_executable(mdnsd mdnsd.c) -target_link_libraries(mdnsd libmdnsd) -if(WIN32 OR MINGW) - target_link_libraries(mdnsd wsock32 ws2_32) -endif() +target_link_libraries(mdnsd PRIVATE libmdnsd) add_executable(mquery mquery.c) -target_link_libraries(mquery libmdnsd) -if(WIN32 OR MINGW) - target_link_libraries(mquery wsock32 ws2_32) -endif() +target_link_libraries(mquery PRIVATE libmdnsd) +install(TARGETS mdnsd mquery + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" +) #if(MDNSD_BUILD_UNIT_TESTS) # enable_testing() diff --git a/libmdnsd/CMakeLists.txt b/libmdnsd/CMakeLists.txt index bb55338..52eb61d 100644 --- a/libmdnsd/CMakeLists.txt +++ b/libmdnsd/CMakeLists.txt @@ -8,6 +8,8 @@ set(MDNSD_LOGLEVEL 300 CACHE STRING "Level at which logs shall be reported") option(MDNSD_COMPILE_AS_CXX "Force compilation with a C++ compiler" OFF) mark_as_advanced(MDNSD_COMPILE_AS_CXX) +option(CMAKE_POSITION_INDEPENDENT_CODE "Build mdnsd using -fPIC" ON) + if(NOT MDNSD_COMPILE_AS_CXX AND (CMAKE_COMPILER_IS_GNUCC OR "x${CMAKE_C_COMPILER_ID}" STREQUAL "xClang")) add_definitions(-std=c99 -pipe -Wall -Wextra -Werror @@ -25,10 +27,13 @@ if(NOT MDNSD_COMPILE_AS_CXX AND (CMAKE_COMPILER_IS_GNUCC OR "x${CMAKE_C_COMPILER add_definitions(-Wpedantic) endif() if(NOT WIN32 AND NOT CYGWIN) - add_definitions(-Wshadow -Wconversion -fvisibility=hidden -fPIC) + add_definitions(-Wshadow -Wconversion) endif() endif() +set(CMAKE_C_VISIBILITY_PRESET hidden) +set(CMAKE_CXX_VISIBILITY_PRESET hidden) + option(MDNSD_ENABLE_COVERAGE "Enable gcov coverage" OFF) if(MDNSD_ENABLE_COVERAGE) set(CMAKE_BUILD_TYPE DEBUG) @@ -47,7 +52,7 @@ configure_file("mdnsd_config.h.in" "${PROJECT_BINARY_DIR}/mdnsd_config.h") include_directories(${PROJECT_BINARY_DIR}) set(PUBLIC_INCLUDES mdnsd.h 1035.h sdtxt.h xht.h) -if(WIN32) +if(CMAKE_C_COMPILER_ID MATCHES MSVC) list(APPEND PUBLIC_INCLUDES ms_stdint.h) endif() @@ -63,37 +68,34 @@ if (MDNSD_BUILD_FUZZING_CORPUS) endif() if(MDNSD_COMPILE_AS_CXX) - set_source_files_properties(${LIBRARY_FILES} PROPERTIES LANGUAGE CXX) + set_source_files_properties(${LIBRARY_FILES} PROPERTIES LANGUAGE CXX) endif() -if(MDNSD_BUILD_OSS_FUZZ) - add_library(libmdnsd ${LIBRARY_FILES} ${PUBLIC_INCLUDES}) -else() - add_library(libmdnsd SHARED ${LIBRARY_FILES} ${PUBLIC_INCLUDES}) -endif() +add_library(libmdnsd ${LIBRARY_FILES} ${PUBLIC_INCLUDES}) +set_property(TARGET libmdnsd PROPERTY OUTPUT_NAME "mdnsd") +set_property(TARGET libmdnsd PROPERTY DEFINE_SYMBOL "MDNSD_DYNAMIC_LINKING_EXPORT") -if(WIN32 OR MINGW) - target_link_libraries(libmdnsd wsock32 ws2_32) +if(WIN32) + target_link_libraries(libmdnsd PUBLIC wsock32 ws2_32) endif() -target_compile_definitions(libmdnsd PRIVATE -DMDNSD_DYNAMIC_LINKING_EXPORT) - -include(GNUInstallDirs) - install( TARGETS ${PROJECT_NAME} - EXPORT ${PROJECT_NAME}Targets - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ) install( FILES ${PUBLIC_INCLUDES} - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}" ) install( - FILES ${PROJECT_BINARY_DIR}/mdnsd_config.h - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} + FILES ${PROJECT_BINARY_DIR}/mdnsd_config.h + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}" +) +install( + FILES "${PROJECT_SOURCE_DIR}/LICENSE" + DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}" )