ZMQSourceRunChecks.cmake 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. macro(zmq_check_sock_cloexec)
  2. message(STATUS "Checking whether SOCK_CLOEXEC is supported")
  3. check_c_source_runs(
  4. "
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. int main(int argc, char *argv [])
  8. {
  9. int s = socket(PF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
  10. return(s == -1);
  11. }
  12. "
  13. ZMQ_HAVE_SOCK_CLOEXEC)
  14. endmacro()
  15. macro(zmq_check_efd_cloexec)
  16. message(STATUS "Checking whether EFD_CLOEXEC is supported")
  17. check_c_source_runs(
  18. "
  19. #include <sys/eventfd.h>
  20. int main(int argc, char *argv [])
  21. {
  22. int s = eventfd (0, EFD_CLOEXEC);
  23. return(s == -1);
  24. }
  25. "
  26. ZMQ_HAVE_EVENTFD_CLOEXEC)
  27. endmacro()
  28. macro(zmq_check_o_cloexec)
  29. message(STATUS "Checking whether O_CLOEXEC is supported")
  30. check_c_source_runs(
  31. "
  32. #include <sys/types.h>
  33. #include <sys/stat.h>
  34. #include <fcntl.h>
  35. int main(int argc, char *argv [])
  36. {
  37. int s = open (\"/dev/null\", O_CLOEXEC | O_RDONLY);
  38. return s == -1;
  39. }
  40. "
  41. ZMQ_HAVE_O_CLOEXEC)
  42. endmacro()
  43. macro(zmq_check_so_bindtodevice)
  44. message(STATUS "Checking whether SO_BINDTODEVICE is supported")
  45. check_c_source_runs(
  46. "
  47. #include <sys/socket.h>
  48. int main(int argc, char *argv [])
  49. {
  50. /* Actually making the setsockopt() call requires CAP_NET_RAW */
  51. #ifndef SO_BINDTODEVICE
  52. return 1;
  53. #else
  54. return 0;
  55. #endif
  56. }
  57. "
  58. ZMQ_HAVE_SO_BINDTODEVICE)
  59. endmacro()
  60. # TCP keep-alives Checks.
  61. macro(zmq_check_so_keepalive)
  62. message(STATUS "Checking whether SO_KEEPALIVE is supported")
  63. check_c_source_runs(
  64. "
  65. #include <sys/types.h>
  66. #include <sys/socket.h>
  67. int main(int argc, char *argv [])
  68. {
  69. int s, rc, opt = 1;
  70. return(
  71. ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) ||
  72. ((rc = setsockopt(s, SOL_SOCKET, SO_KEEPALIVE,(char*) &opt, sizeof(int))) == -1)
  73. );
  74. }
  75. "
  76. ZMQ_HAVE_SO_KEEPALIVE)
  77. endmacro()
  78. macro(zmq_check_tcp_keepcnt)
  79. message(STATUS "Checking whether TCP_KEEPCNT is supported")
  80. check_c_source_runs(
  81. "
  82. #include <sys/types.h>
  83. #include <sys/socket.h>
  84. #include <netinet/in.h>
  85. #include <netinet/tcp.h>
  86. int main(int argc, char *argv [])
  87. {
  88. int s, rc, opt = 1;
  89. return(
  90. ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) ||
  91. ((rc = setsockopt(s, SOL_SOCKET, SO_KEEPALIVE,(char*) &opt, sizeof(int))) == -1) ||
  92. ((rc = setsockopt(s, IPPROTO_TCP, TCP_KEEPCNT,(char*) &opt, sizeof(int))) == -1)
  93. );
  94. }
  95. "
  96. ZMQ_HAVE_TCP_KEEPCNT)
  97. endmacro()
  98. macro(zmq_check_tcp_keepidle)
  99. message(STATUS "Checking whether TCP_KEEPIDLE is supported")
  100. check_c_source_runs(
  101. "
  102. #include <sys/types.h>
  103. #include <sys/socket.h>
  104. #include <netinet/in.h>
  105. #include <netinet/tcp.h>
  106. int main(int argc, char *argv [])
  107. {
  108. int s, rc, opt = 1;
  109. return(
  110. ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) ||
  111. ((rc = setsockopt(s, SOL_SOCKET, SO_KEEPALIVE,(char*) &opt, sizeof(int))) == -1) ||
  112. ((rc = setsockopt(s, IPPROTO_TCP, TCP_KEEPIDLE,(char*) &opt, sizeof(int))) == -1)
  113. );
  114. }
  115. "
  116. ZMQ_HAVE_TCP_KEEPIDLE)
  117. endmacro()
  118. macro(zmq_check_tcp_keepintvl)
  119. message(STATUS "Checking whether TCP_KEEPINTVL is supported")
  120. check_c_source_runs(
  121. "
  122. #include <sys/types.h>
  123. #include <sys/socket.h>
  124. #include <netinet/in.h>
  125. #include <netinet/tcp.h>
  126. int main(int argc, char *argv [])
  127. {
  128. int s, rc, opt = 1;
  129. return(
  130. ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) ||
  131. ((rc = setsockopt(s, SOL_SOCKET, SO_KEEPALIVE,(char*) &opt, sizeof(int))) == -1) ||
  132. ((rc = setsockopt(s, IPPROTO_TCP, TCP_KEEPINTVL,(char*) &opt, sizeof(int))) == -1)
  133. );
  134. }
  135. "
  136. ZMQ_HAVE_TCP_KEEPINTVL)
  137. endmacro()
  138. macro(zmq_check_tcp_keepalive)
  139. message(STATUS "Checking whether TCP_KEEPALIVE is supported")
  140. check_c_source_runs(
  141. "
  142. #include <sys/types.h>
  143. #include <sys/socket.h>
  144. #include <netinet/in.h>
  145. #include <netinet/tcp.h>
  146. int main(int argc, char *argv [])
  147. {
  148. int s, rc, opt = 1;
  149. return(
  150. ((s = socket(PF_INET, SOCK_STREAM, 0)) == -1) ||
  151. ((rc = setsockopt(s, SOL_SOCKET, SO_KEEPALIVE,(char*) &opt, sizeof(int))) == -1) ||
  152. ((rc = setsockopt(s, IPPROTO_TCP, TCP_KEEPALIVE,(char*) &opt, sizeof(int))) == -1)
  153. );
  154. }
  155. "
  156. ZMQ_HAVE_TCP_KEEPALIVE)
  157. endmacro()
  158. macro(zmq_check_tcp_tipc)
  159. message(STATUS "Checking whether TIPC is supported")
  160. check_c_source_runs(
  161. "
  162. #include <stdlib.h>
  163. #include <string.h>
  164. #include <fcntl.h>
  165. #include <errno.h>
  166. #include <sys/socket.h>
  167. #include <linux/tipc.h>
  168. int main(int argc, char *argv [])
  169. {
  170. struct sockaddr_tipc topsrv;
  171. int sd = socket(AF_TIPC, SOCK_SEQPACKET, 0);
  172. memset(&topsrv, 0, sizeof(topsrv));
  173. topsrv.family = AF_TIPC;
  174. topsrv.addrtype = TIPC_ADDR_NAME;
  175. topsrv.addr.name.name.type = TIPC_TOP_SRV;
  176. topsrv.addr.name.name.instance = TIPC_TOP_SRV;
  177. fcntl(sd, F_SETFL, O_NONBLOCK);
  178. }
  179. "
  180. ZMQ_HAVE_TIPC)
  181. endmacro()
  182. macro(zmq_check_pthread_setname)
  183. message(STATUS "Checking pthread_setname signature")
  184. set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
  185. set(CMAKE_REQUIRED_FLAGS "-D_GNU_SOURCE -Werror -pthread")
  186. check_c_source_runs(
  187. "
  188. #include <pthread.h>
  189. int main(int argc, char *argv [])
  190. {
  191. pthread_setname_np (\"foo\");
  192. return 0;
  193. }
  194. "
  195. ZMQ_HAVE_PTHREAD_SETNAME_1)
  196. check_c_source_runs(
  197. "
  198. #include <pthread.h>
  199. int main(int argc, char *argv [])
  200. {
  201. pthread_setname_np (pthread_self(), \"foo\");
  202. return 0;
  203. }
  204. "
  205. ZMQ_HAVE_PTHREAD_SETNAME_2)
  206. check_c_source_runs(
  207. "
  208. #include <pthread.h>
  209. int main(int argc, char *argv [])
  210. {
  211. pthread_setname_np (pthread_self(), \"foo\", (void *)0);
  212. return 0;
  213. }
  214. "
  215. ZMQ_HAVE_PTHREAD_SETNAME_3)
  216. check_c_source_runs(
  217. "
  218. #include <pthread.h>
  219. int main(int argc, char *argv [])
  220. {
  221. pthread_set_name_np (pthread_self(), \"foo\");
  222. return 0;
  223. }
  224. "
  225. ZMQ_HAVE_PTHREAD_SET_NAME)
  226. set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
  227. endmacro()
  228. macro(zmq_check_pthread_setaffinity)
  229. message(STATUS "Checking pthread_setaffinity signature")
  230. set(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
  231. set(CMAKE_REQUIRED_FLAGS "-D_GNU_SOURCE -Werror -pthread")
  232. check_c_source_runs(
  233. "
  234. #include <pthread.h>
  235. int main(int argc, char *argv [])
  236. {
  237. cpu_set_t test;
  238. pthread_setaffinity_np (pthread_self(), sizeof(cpu_set_t), &test);
  239. return 0;
  240. }
  241. "
  242. ZMQ_HAVE_PTHREAD_SET_AFFINITY)
  243. set(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
  244. endmacro()
  245. macro(zmq_check_getrandom)
  246. message(STATUS "Checking whether getrandom is supported")
  247. check_c_source_runs(
  248. "
  249. #include <sys/random.h>
  250. int main (int argc, char *argv [])
  251. {
  252. char buf[4];
  253. int rc = getrandom(buf, 4, 0);
  254. return rc == -1 ? 1 : 0;
  255. }
  256. "
  257. ZMQ_HAVE_GETRANDOM)
  258. endmacro()
  259. macro(zmq_check_noexcept)
  260. message(STATUS "Checking whether noexcept is supported")
  261. check_cxx_source_compiles(
  262. "
  263. struct X
  264. {
  265. X(int i) noexcept {}
  266. };
  267. int main(int argc, char *argv [])
  268. {
  269. X x(5);
  270. return 0;
  271. }
  272. "
  273. ZMQ_HAVE_NOEXCEPT)
  274. endmacro()