meson.build 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. # Project definition
  2. project('usrsctplib', 'c',
  3. version: '0.9.5.0',
  4. default_options: [
  5. 'c_std=c99',
  6. 'warning_level=2',
  7. ],
  8. meson_version: '>=0.49.0')
  9. # Shared library API and ABI versions
  10. # Notice: shared library version must be in X.Y.Z format only
  11. soversion_full = '2.0.0'
  12. soversion_short = '2'
  13. # Set compiler warning flags
  14. compiler = meson.get_compiler('c')
  15. if compiler.get_argument_syntax() == 'msvc'
  16. compiler_args = compiler.get_supported_arguments([
  17. '/wd4100', # 'identifier' : unreferenced formal parameter
  18. '/wd4127', # conditional expression is constant
  19. '/wd4200', # nonstandard extension used : zero-sized array in struct/union
  20. '/wd4214', # bit field types other than int
  21. '/wd4706', # assignment within conditional expression
  22. '/wd4245', # 'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch
  23. '/wd4389', # 'operator' : signed/unsigned mismatch
  24. '/wd4702', # unreachable code
  25. '/wd4701', # Potentially uninitialized local variable 'name' used
  26. '/wd4244', # 'conversion' conversion from 'type1' to 'type2', possible loss of data
  27. ])
  28. else
  29. compiler_args = compiler.get_supported_arguments([
  30. '-pedantic',
  31. '-Wfloat-equal',
  32. '-Wshadow',
  33. '-Wpointer-arith',
  34. '-Winit-self',
  35. '-Wno-unused-function',
  36. '-Wno-unused-parameter',
  37. '-Wno-unreachable-code',
  38. '-Wstrict-prototypes',
  39. ])
  40. endif
  41. add_project_arguments(compiler_args, language: 'c')
  42. # Configuration
  43. compile_args = []
  44. # Dependency: Threads
  45. thread_dep = dependency('threads', required: true)
  46. # Dependencies list
  47. dependencies = [
  48. thread_dep,
  49. ]
  50. # Global settings
  51. add_project_arguments([
  52. '-D__Userspace__',
  53. '-DSCTP_SIMPLE_ALLOCATOR',
  54. '-DSCTP_PROCESS_LEVEL_LOCKS',
  55. ], language: 'c')
  56. # OS-specific settings
  57. system = host_machine.system()
  58. if system in ['linux', 'android']
  59. add_project_arguments([
  60. '-D_GNU_SOURCE',
  61. ], language: 'c')
  62. elif system == 'freebsd'
  63. add_project_arguments(compiler.get_supported_arguments([
  64. '-Wno-address-of-packed-member',
  65. ]), language: 'c')
  66. elif system in ['darwin', 'ios']
  67. add_project_arguments([
  68. '-D__APPLE_USE_RFC_2292',
  69. ] + compiler.get_supported_arguments([
  70. '-Wno-address-of-packed-member',
  71. '-Wno-deprecated-declarations',
  72. ]), language: 'c')
  73. elif system == 'qnx'
  74. add_project_arguments([
  75. '-D_QNX_SOURCE',
  76. ], language: 'c')
  77. elif system == 'windows'
  78. dependencies += compiler.find_library('ws2_32', required: true)
  79. dependencies += compiler.find_library('iphlpapi', required: true)
  80. if compiler.get_id() == 'gcc'
  81. add_project_arguments(compiler.get_supported_arguments([
  82. '-Wno-format',
  83. '-D_WIN32_WINNT=0x601', # Enables inet_ntop and friends
  84. ]), language: 'c')
  85. endif
  86. else
  87. error('Unknown system: @0@'.format(system))
  88. endif
  89. # Feature: sys/queue
  90. if system != 'qnx' and compiler.has_header('sys/queue.h')
  91. add_project_arguments('-DHAVE_SYS_QUEUE_H', language: 'c')
  92. endif
  93. # Feature: sys/socket, linux/ifaddr, linux/rtnetlink
  94. if compiler.has_header('sys/socket.h')
  95. if compiler.has_header('linux/if_addr.h')
  96. add_project_arguments('-DHAVE_LINUX_IF_ADDR_H', language: 'c')
  97. endif
  98. if compiler.has_header('linux/rtnetlink.h')
  99. add_project_arguments('-DHAVE_LINUX_RTNETLINK_H', language: 'c')
  100. endif
  101. endif
  102. # Feature: ICMP
  103. have_sys_types = compiler.has_header('sys/types.h')
  104. have_netinet_in = compiler.has_header('netinet/in.h')
  105. have_netinet_ip = compiler.has_header('netinet/ip.h')
  106. have_netinet_ip_icmp = compiler.has_header('netinet/ip_icmp.h')
  107. if have_sys_types and have_netinet_in and have_netinet_ip and have_netinet_ip_icmp
  108. add_project_arguments('-DHAVE_NETINET_IP_ICMP_H', language: 'c')
  109. endif
  110. # Feature: net/route
  111. if compiler.has_header('net/route.h')
  112. add_project_arguments('-DHAVE_NET_ROUTE_H', language: 'c')
  113. endif
  114. # Feature: stdatomic
  115. if compiler.has_header('stdatomic.h')
  116. add_project_arguments('-DHAVE_STDATOMIC_H', language: 'c')
  117. endif
  118. # Feature: sockaddr.sa_len
  119. prefix = '''
  120. #include <sys/types.h>
  121. #include <sys/socket.h>
  122. '''
  123. have_sa_len = compiler.has_member('struct sockaddr', 'sa_len', prefix: prefix)
  124. if have_sa_len
  125. add_project_arguments('-DHAVE_SA_LEN', language: 'c')
  126. endif
  127. # Feature: sockaddr_in.sin_len / sockaddr_in6.sin6_len / sockaddr_conn.sconn_len
  128. prefix = '''
  129. #include <sys/types.h>
  130. #include <netinet/in.h>
  131. '''
  132. have_sin_len = compiler.has_member('struct sockaddr_in', 'sin_len', prefix: prefix)
  133. if have_sin_len
  134. add_project_arguments('-DHAVE_SIN_LEN', language: 'c')
  135. endif
  136. have_sin6_len = compiler.has_member('struct sockaddr_in6', 'sin6_len', prefix: prefix)
  137. if have_sin6_len
  138. add_project_arguments('-DHAVE_SIN6_LEN', language: 'c')
  139. endif
  140. have_sconn_len = compiler.has_member('struct sockaddr_conn', 'sconn_len', prefix: '#include "usrsctp.h"', include_directories: include_directories('usrsctplib'))
  141. if have_sconn_len
  142. add_project_arguments('-DHAVE_SCONN_LEN', language: 'c')
  143. endif
  144. # Options
  145. if get_option('sctp_invariants')
  146. add_project_arguments('-DINVARIANTS', language: 'c')
  147. endif
  148. if get_option('sctp_debug')
  149. add_project_arguments('-DSCTP_DEBUG', language: 'c')
  150. compile_args += '-DSCTP_DEBUG'
  151. endif
  152. if get_option('sctp_inet')
  153. add_project_arguments('-DINET', language: 'c')
  154. endif
  155. if get_option('sctp_inet6')
  156. add_project_arguments('-DINET6', language: 'c')
  157. endif
  158. # Library
  159. subdir('usrsctplib')
  160. # Build library
  161. if compiler.get_id() == 'msvc' and get_option('default_library') == 'shared'
  162. # Needed by usrsctp_def
  163. find_program('dumpbin')
  164. usrsctp_static = static_library('usrsctp-static', sources,
  165. dependencies: dependencies,
  166. include_directories: include_dirs)
  167. usrsctp_def = custom_target('usrsctp.def',
  168. command: [find_program('gen-def.py'), '@INPUT@'],
  169. input: usrsctp_static,
  170. output: 'usrsctp.def',
  171. capture: true)
  172. usrsctp = shared_library('usrsctp',
  173. link_whole: usrsctp_static,
  174. dependencies: dependencies,
  175. vs_module_defs: usrsctp_def,
  176. install: true,
  177. version: meson.project_version())
  178. else
  179. usrsctp = library('usrsctp', sources,
  180. dependencies: dependencies,
  181. include_directories: include_dirs,
  182. install: true,
  183. version: soversion_full,
  184. soversion: soversion_short)
  185. endif
  186. # Declare dependency
  187. usrsctp_dep = declare_dependency(
  188. compile_args: compile_args,
  189. include_directories: include_dirs,
  190. link_with: usrsctp)
  191. # Generate pkg-config file
  192. pkg = import('pkgconfig')
  193. pkg.generate(usrsctp,
  194. name: 'usrsctp',
  195. description: 'A portable SCTP userland stack',
  196. url: 'https://github.com/sctplab/usrsctp',
  197. extra_cflags: compile_args)
  198. # Programs (optional)
  199. if get_option('sctp_build_programs')
  200. subdir('programs')
  201. # Build executables
  202. foreach name, sources : programs
  203. executable(
  204. name,
  205. programs_helper_sources + sources,
  206. dependencies: dependencies,
  207. link_with: usrsctp,
  208. include_directories: include_dirs)
  209. endforeach
  210. endif