From a3f749ca5b86e6a27c1ad36f1b54febad3befe63 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Wed, 9 Nov 2022 21:25:48 +0200 Subject: Use autotools-like macros with CMake --- CMakeLists.txt | 60 ++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 21 deletions(-) (limited to 'CMakeLists.txt') diff --git a/CMakeLists.txt b/CMakeLists.txt index 62ad616..c08467d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,4 @@ cmake_minimum_required(VERSION 3.1) -cmake_policy(SET CMP0054 NEW) project(FileSender) @@ -8,37 +7,56 @@ include(CheckIncludeFiles) include(CheckLibraryExists) include(CheckStructHasMember) -macro(CMAKE_SEARCH_LIBS v_func v_lib func) - check_function_exists(${func} ${v_func}) - if(NOT ${v_func}) +macro(CX_SEARCH_LIBS func) + string(TOUPPER ${func} _FUNC) + check_function_exists(${func} HAVE_${_FUNC}) + if(NOT HAVE_${_FUNC}) foreach(lib ${ARGN}) - check_library_exists(${lib} ${func} "" HAVE_${func}_IN_${lib}) - if(HAVE_${func}_IN_${lib}) - set(${v_func} TRUE) - set(${v_lib} "${lib}" CACHE INTERNAL "Library providing ${func}") + unset(HAVE_${_FUNC} CACHE) + check_library_exists(${lib} ${func} "" HAVE_${_FUNC}) + if(HAVE_${_FUNC}) + set("${_FUNC}_LIB" "${lib}" CACHE INTERNAL "Library providing `${func}'") break() endif() endforeach() endif() + if(HAVE_${_FUNC}) + add_compile_definitions("HAVE_${_FUNC}") + endif() endmacro() +macro(CX_CHECK_HEADERS) + foreach(h ${ARGN}) + string(TOUPPER ${h} _HDR) + string(REGEX REPLACE "[/.-]" "_" _HDR ${_HDR}) + check_include_files(${h} HAVE_${_HDR}) + if(HAVE_${_HDR}) + add_compile_definitions("HAVE_${_HDR}") + endif() + endforeach() +endmacro() -check_include_files(sys/sendfile.h HAVE_SYS_SENDFILE_H) -if(HAVE_SYS_SENDFILE_H) - add_compile_definitions(HAVE_SYS_SENDFILE_H) -endif() +macro(CX_CHECK_MEMBERS _members) + foreach(s ${_members}) + string(STRIP "${s}" s) + string(REGEX REPLACE "[ \t]+" " " s ${s}) + string(REGEX REPLACE "([^.]+)\.([^.]+)$" "\\1" struct ${s}) + string(REGEX REPLACE "([^.]+)\.([^.]+)$" "\\2" field ${s}) + string(REGEX REPLACE "[ .]" "_" M ${s}) + string(TOUPPER "HAVE_${M}" HAVE) + check_struct_has_member("${struct}" "${field}" "${ARGN}" ${HAVE}) + if(${HAVE}) + add_compile_definitions(${HAVE}) + endif() + endforeach() +endmacro() -cmake_search_libs(HAVE_SENDFILE SENDFILE_LIB sendfile sendfile) -cmake_search_libs(HAVE_SOCKET SOCKET_LIB socket socket) +cx_check_headers(fcntl.h netinet/in.h stddef.h stdlib.h string.h sys/socket.h unistd.h sys/sendfile.h) -if(HAVE_SENDFILE) - add_compile_definitions(HAVE_SENDFILE) -endif() +cx_search_libs(sendfile sendfile) +cx_search_libs(socket socket) -check_struct_has_member("struct sf_hdtr" hdr_cnt sys/socket.h HAVE_STRUCT_SF_HDTR_HDR_CNT) -if(HAVE_STRUCT_SF_HDTR_HDR_CNT) - add_compile_definitions(HAVE_STRUCT_SF_HDTR_HDR_CNT) -endif() +cx_check_members("struct sf_hdtr.hdr_cnt" sys/socket.h) add_executable(server server.c utils.c utils.h) target_link_libraries(server ${SOCKET_LIB}) -- cgit v1.2.3