aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2022-11-09 21:25:48 +0200
committerIgor Pashev <pashev.igor@gmail.com>2022-11-09 21:25:48 +0200
commita3f749ca5b86e6a27c1ad36f1b54febad3befe63 (patch)
treebccbef5e8e81fff1114d0ffec623e05ee2a5ec80 /CMakeLists.txt
parentdedfce3ccf6a5606a378e1c7a1bd934fedeb6955 (diff)
downloadtcp-a3f749ca5b86e6a27c1ad36f1b54febad3befe63.tar.gz
Use autotools-like macros with CMake
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt60
1 files changed, 39 insertions, 21 deletions
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})