Fix build with nettle disabled.
[pidgin-git.git] / meson.build
blobe7aec6e3dddcabee667bf311ce4c798095ca81e9
1 project('pidgin', 'c', meson_version : '>=0.37.0')
3 # UPDATING VERSION NUMBERS FOR RELEASES
5 # purple_micro_version += 1
7 # If any functions have been added to libpurple, Pidgin, or Finch:
8 #   purple_micro_version = 0
9 #   purple_minor_version += 1
10 #   purple_lt_current += 1
12 # If backwards compatibility has been broken in libpurple, Pidgin, or Finch:
13 #   purple_micro_version = 0
14 #   purple_minor_version = 0
15 #   purple_major_version += 1;
16 #   purple_lt_current += 1
18 # purple_version_suffix should be similar to one of the following:
19 #   For beta releases:          'beta2'
20 #   For code under development: 'devel'
21 #   For production releases:    ''
23 # Make sure to update finch/libgnt/meson.build with libgnt version changes.
25 purple_lt_current = 20
26 purple_major_version = 3
27 purple_minor_version = 0
28 purple_micro_version = 0
29 purple_version_suffix = 'devel'
30 purple_version = '@0@.@1@.@2@'.format(purple_major_version,
31                                       purple_minor_version,
32                                       purple_micro_version)
33 purple_display_version = '@0@@1@'.format(purple_version,
34                                          purple_version_suffix)
36 add_project_arguments('-DHAVE_CONFIG_H=1', language : 'c')
37 conf = configuration_data()
38 man_conf = configuration_data()
39 purple_h_conf = configuration_data()
40 version_conf = configuration_data()
42 conf.set_quoted('PACKAGE', meson.project_name())
43 conf.set_quoted('PACKAGE_NAME', meson.project_name())
44 conf.set_quoted('VERSION', purple_display_version)
46 version_conf.set('PURPLE_MAJOR_VERSION', purple_major_version)
47 version_conf.set('PURPLE_MINOR_VERSION', purple_minor_version)
48 version_conf.set('PURPLE_MICRO_VERSION', purple_micro_version)
49 version_conf.set('PURPLE_VERSION', purple_display_version)
50 version_conf.set('PURPLE_API_VERSION',
51                  purple_lt_current - purple_minor_version)
53 PURPLE_LIB_VERSION = '@0@.@1@.@2@'.format(purple_lt_current - purple_minor_version,
54                                           purple_minor_version,
55                                           purple_micro_version)
57 package_revision = vcs_tag(
58     input : 'package_revision.h.in',
59     output : 'package_revision.h',
60     fallback : meson.project_version())
62 # For man pages.
63 man_conf.set('VERSION', purple_display_version)
64 man_conf.set('prefix', get_option('prefix'))
66 # Used for pkg-config files.
67 pkgconfig = import('pkgconfig')
69 sedpath = find_program('sed')
71 # Storing build arguments
72 if meson.version().version_compare('>=0.42.0')
73         meson.add_postconf_script('mkmesonconf.py')
74         conf.set('HAVE_MESON_CONFIG', true)
75 endif
77 # Checks for programs.
78 compiler = meson.get_compiler('c')
80 # Check for Sun compiler
81 SUNCC = compiler.compiles('void main() {__SUNPRO_C;};')
83 # Check for Win32
84 if host_machine.system() == 'windows'
85         windows = import('windows')
87         IS_WIN32 = true
88         ws2_32 = compiler.find_library('ws2_32')
89         dnsapi = compiler.find_library('dnsapi')
90         if build_machine.system() != 'windows'
91                 conf.set('IS_WIN32_CROSS_COMPILED', true)
92         endif
93         conf.set('WIN32_LEAN_AND_MEAN', true)
95         conf.set('LIBPIDGIN_DLL_NAMEW',
96             'L"libpidgin-@0@.dll"'.format(purple_lt_current))
97 else
98         IS_WIN32 = false
99         ws2_32 = []
100         dnsapi = []
101 endif
103 # Checks for header files.
104 # AC_HEADER_SYS_WAIT:
105 conf.set('HAVE_SYS_WAIT_H', compiler.has_header('sys/wait.h'))
107 foreach h : ['fcntl.h', 'unistd.h', 'stdint.h']
108         if compiler.has_header(h)
109                 conf.set('HAVE_' + h.to_upper().underscorify(), true)
110         else
111                 error(h + ' is required.')
112         endif
113 endforeach
115 # Checks for typedefs, structures, and compiler characteristics.
116 time_t_size = compiler.sizeof('time_t',
117     prefix : '''
118 #include <stdio.h>
119 #include <time.h>
120 ''')
121 conf.set('SIZEOF_TIME_T', time_t_size)
123 conf.set('WORDS_BIGENDIAN', host_machine.endian() != 'little')
125 # Check for directories
126 if IS_WIN32
127         foreach dir : ['bin', 'lib', 'data', 'sysconf', 'locale']
128                 path = join_paths(get_option('prefix'), get_option(dir + 'dir'))
129                 conf.set_quoted('WIN32_FHS_@0@DIR'.format(dir.to_upper()), path)
130         endforeach
132         conf.set('PURPLE_LIBDIR',
133                  'wpurple_lib_dir("purple-@0@")'.format(purple_major_version))
134         conf.set('PIDGIN_LIBDIR',
135                  'wpurple_lib_dir("pidgin-@0@")'.format(purple_major_version))
136         conf.set('FINCH_LIBDIR',
137                  'wpurple_lib_dir("finch-@0@")'.format(purple_major_version))
139         conf.set('PURPLE_DATADIR', 'wpurple_data_dir()')
140         conf.set('PURPLE_SYSCONFDIR', 'wpurple_sysconf_dir()')
141         conf.set('PURPLE_LOCALEDIR', 'wpurple_locale_dir()')
142 else
143         foreach dir : ['data', 'sysconf', 'locale']
144                 path = join_paths(get_option('prefix'), get_option(dir + 'dir'))
145                 conf.set_quoted('PURPLE_@0@DIR'.format(dir.to_upper()), path)
146         endforeach
148         common_libdir = join_paths(get_option('prefix'), get_option('libdir'))
149         conf.set_quoted('PURPLE_LIBDIR',
150                         join_paths(common_libdir,
151                                    'purple-@0@'.format(purple_major_version)))
152         conf.set_quoted('PIDGIN_LIBDIR',
153                         join_paths(common_libdir,
154                                    'pidgin-@0@'.format(purple_major_version)))
155         conf.set_quoted('FINCH_LIBDIR',
156                         join_paths(common_libdir,
157                                    'finch-@0@'.format(purple_major_version)))
158 endif
160 abslibdir = join_paths(get_option('prefix'), get_option('libdir'))
161 PURPLE_PLUGINDIR = join_paths(abslibdir, 'purple-@0@'.format(purple_major_version))
162 conf.set_quoted('PURPLE_PLUGINDIR', PURPLE_PLUGINDIR)
163 PIDGIN_PLUGINDIR = join_paths(abslibdir, 'pidgin-@0@'.format(purple_major_version))
164 conf.set_quoted('PIDGIN_PLUGINDIR', PIDGIN_PLUGINDIR)
165 FINCH_PLUGINDIR = join_paths(abslibdir, 'finch-@0@'.format(purple_major_version))
166 conf.set_quoted('FINCH_PLUGINDIR', FINCH_PLUGINDIR)
168 # Check for inet_aton
169 if not IS_WIN32
170         if not compiler.has_function('inet_aton')
171                 if not compiler.has_function('inet_aton', args : '-lresolv')
172                         # FIXME: Someone needs to link with -lresolv if needed.
173                         error('inet_aton not found')
174                 endif
175         endif
176 endif
177 if compiler.has_function('gethostent', args : '-lnsl')
178         conf.set('HAVE_LIBNSL', true)
179 endif
180 if IS_WIN32
181         conf.set('HAVE_GETADDRINFO', true)
182         conf.set('HAVE_INET_NTOP', true)
183 else
184         if not compiler.has_function('socket')
185                 if not compiler.has_function('socket', args : '-lsocket')
186                         error('socket not found')
187                 endif
188         endif
189         # If all goes well, by this point the previous two checks will have
190         # pulled in -lsocket and -lnsl if we need them.
191         if compiler.has_function('getaddrinfo')
192                 conf.set('HAVE_GETADDRINFO', true)
193         else
194                 if compiler.has_function('getaddrinfo', args : '-lsocket -lnsl')
195                         conf.set('HAVE_GETADDRINFO', true)
196                         # FIXME: LIBS += declare_dependency(link_with : ['socket', 'nsl'])
197                 endif
198         endif
199         conf.set('HAVE_INET_NTOP',
200             compiler.has_function('inet_ntop'))
201 endif
202 conf.set('HAVE_GETIFADDRS',
203     compiler.has_function('getifaddrs'))
205 # Check for socklen_t (in Unix98)
206 if IS_WIN32
207         socket_header = 'ws2tcpip.h'
208 else
209         socket_header = 'sys/socket.h'
210 endif
211 if not compiler.has_header_symbol(socket_header, 'socklen_t')
212         code = '''
213 #include <sys/types.h>
214 #include <@0@>
215 int accept(int, struct sockaddr *, size_t *);
216 int main() {}
217 '''.format(socket_header)
218         if compiler.compiles(code, name : 'socklen_t is size_t')
219                 conf.set('socklen_t', 'size_t')
220         else
221                 conf.set('socklen_t', 'int')
222         endif
223 endif
225 # Some systems do not have sa_len field for struct sockaddr.
226 conf.set('HAVE_STRUCT_SOCKADDR_SA_LEN',
227     compiler.has_member('struct sockaddr', 'sa_len',
228         prefix : '#include <@0@>'.format(socket_header)))
230 # Check for v6-only sockets
231 if IS_WIN32
232         header = 'ws2tcpip.h'
233 else
234         header = 'netinet/in.h'
235 endif
236 conf.set('HAVE_IPV6_V6ONLY',
237     compiler.has_header_symbol(header, 'IPV6_V6ONLY'))
239 # Windows and Haiku do not use libm for the math functions, they are part
240 # of the C library
241 math = compiler.find_library('m')
243 # before gettexting, in case iconv matters
244 IOKIT = []
245 if host_machine.system() == 'darwin'
246         if compiler.has_header('CoreFoundation/CoreFoundation.h')
247                 if compiler.has_header('IOKit/IOKitLib.h')
248                         conf.set('HAVE_IOKIT', true)
249                         IOKIT = dependency('appleframeworks',
250                                            modules : ['IOKit', 'CoreFoundation'])
251                 endif
252         endif
254         if run_command('test', '-d', '/sw').returncode() == 0
255                 # FIXME: Not done...
256                 #CPPFLAGS="$CPPFLAGS -I/sw/include"
257                 #LDFLAGS="$LDFLAGS -L/sw/lib"
258         endif
259 endif
261 # #######################################################################
262 # # Disable creation and installation of translation files
263 # #######################################################################
265 INSTALL_I18N = get_option('nls')
267 if INSTALL_I18N
268         conf.set('ENABLE_NLS', true)
270         i18n = import('i18n')
272         subdir('po')
273 endif
275 # #######################################################################
276 # # Check for GLib 2.40 (required)
277 # #######################################################################
278 glib = dependency('glib-2.0', version : '>= 2.40.0')
279 gio = dependency('gio-2.0')
280 gobject = dependency('gobject-2.0')
281 gthread = dependency('gthread-2.0')
282 gnome = import('gnome')
284 if get_option('extraversion') != ''
285         DISPLAY_VERSION = '@0@-@1@'.format(meson.project_version(),
286                                            get_option('extraversion'))
287 else
288         DISPLAY_VERSION = meson.project_version()
289 endif
290 conf.set_quoted('DISPLAY_VERSION', DISPLAY_VERSION)
292 force_deps = not get_option('missing-dependencies')
294 # #######################################################################
295 # # Check for GTK+ 2.18 and other things used by the GTK UI
296 # #######################################################################
297 enable_gestures = get_option('gestures')
298 enable_gcr = get_option('gcr')
300 # #######################################################################
301 # Check Pidgin dependencies
302 # #######################################################################
303 if get_option('gtkui')
304         gtk = dependency('gtk+-3.0', version : '>= 3.10.0')
305         # We only really need Pango >= 1.4 for decent RTL support
306         pango = dependency('pango', version : '>= 1.4.0')
307         conf.set('HAVE_PANGO14', pango.found())
309         webkit = dependency('webkitgtk-3.0', version : '>= 1.3.7')
311         #######################################################################
312         # Check if we should compile with enchant support
313         #######################################################################
314         # We need enchant for spell checking dictionary enumeration,
315         # because webkit1 doesn't have this.
316         enable_enchant = get_option('enchant')
317         if enable_enchant
318                 enchant = dependency('enchant', required : force_deps)
319                 enable_enchant = enchant.found()
320                 conf.set('USE_ENCHANT', enable_enchant)
321         else
322                 enchant = []
323         endif
325         #######################################################################
326         # Check for GCR for its certificate widgets
327         #######################################################################
328         if enable_gcr
329                 GCR = dependency('gcr-3', required : force_deps)
330                 if GCR.found()
331                         conf.set('ENABLE_GCR', true)
332                 else
333                         enable_gcr = false
334                 endif
335         else
336                 GCR = []
337         endif
340 else    # GTK
341         enable_gcr = false
342         enable_enchant = false
343 endif   # GTK
345 ENABLE_GTK = get_option('gtkui')
348 #######################################################################
349 # Check if we should compile with X support
350 #######################################################################
351 with_x = get_option('x') and not IS_WIN32
353 if with_x
354         x11 = dependency('x11')
355         if x11.found()
356                 conf.set('HAVE_X11', true)
357         else
358                 with_x = false
359                 if force_deps
360                         error('''
361 X11 development headers not found.
362 Use -Dx=false if you do not need X11 support.
363 ''')
364                 endif
365         endif
366 else
367         x11 = []
368 endif
369 if not get_option('gtkui') or not with_x
370         enable_gestures = false
371 endif
373 #######################################################################
374 # Check for LibXML2 (required)
375 #######################################################################
376 libxml = dependency('libxml-2.0', version : '>= 2.6.0')
377 if libxml.version().version_compare('<2.6.18')
378         message('Versions of libxml2 < 2.6.18 may contain bugs that could cause XMPP messages to be discarded.')
379 endif
381 #######################################################################
382 # Check for JSON-GLib (required)
383 #######################################################################
385 json = dependency('json-glib-1.0', version : '>= 0.14.0')
387 #######################################################################
388 # Check for GStreamer
389 #######################################################################
391 enable_gst = get_option('gstreamer')
392 if enable_gst
393         gstreamer = dependency('gstreamer-1.0', required : force_deps)
394         if gstreamer.found()
395                 conf.set('USE_GSTREAMER', true)
396         else
397                 enable_gst = false
398         endif
399 else
400         gstreamer = []
401 endif
403 #######################################################################
404 # Check for GStreamer Video
405 #######################################################################
406 enable_gstvideo = enable_gst and get_option('gstreamer-video')
407 if enable_gstvideo
408         gstreamer_video = dependency('gstreamer-video-1.0',
409                                      required : false)
410         if gstreamer_video.found()
411                 conf.set('USE_GSTVIDEO', true)
412         else
413                 enable_gstvideo = false
414         endif
415 else
416         gstreamer_video = []
417 endif
419 #######################################################################
420 # Check for Farstream
421 #######################################################################
422 if get_option('farstream')
423         farstream = dependency('farstream-0.2', version : '>= 0.2.7',
424                                required : false)
425         enable_farstream = farstream.found()
426 else
427         farstream = []
428         enable_farstream = false
429 endif
431 #######################################################################
432 # Check for Voice and Video support
433 #######################################################################
434 if get_option('vv')
435         if enable_gst and enable_gstvideo and enable_farstream
436                 conf.set('USE_VV', true)
437                 enable_vv = true
438         else
439                 if force_deps
440                         error('''
441 Dependencies for voice/video were not met.
442 Install the necessary gstreamer and farstream packages first.
443 Or use -Dvv=false if you do not need voice/video support.
444                         ''')
445                 endif
446                 enable_vv = false
447         endif
448 else
449         enable_vv = false
450 endif
452 #######################################################################
453 # Check for Raw data streams support in Farstream
454 #######################################################################
455 if enable_vv
456         gstreamer_app = dependency('gstreamer-app-1.0',
457                                    required : false)
458         if gstreamer_app.found()
459                 conf.set('USE_GSTAPP', true)
460                 conf.set('HAVE_MEDIA_APPLICATION', true)
461         endif
462 else
463         gstreamer_app = []
464 endif
466 #######################################################################
467 # Check for Internationalized Domain Name support
468 #######################################################################
470 if get_option('idn')
471         idn = dependency('libidn', version : '>= 0.0.0', required : force_deps)
472         conf.set('USE_IDN', idn.found())
473 else
474         idn = []
475 endif
477 #######################################################################
478 # Check for Meanwhile headers (for Sametime)
479 #######################################################################
480 if get_option('meanwhile')
481         meanwhile = dependency('meanwhile', version : ['>= 1.0.0', '< 2.0.0'], required : force_deps)
482         enable_meanwhile = meanwhile.found()
483 else
484         enable_meanwhile = false
485         meanwhile = []
486 endif
488 #######################################################################
489 # Check for Native Avahi headers (for Bonjour)
490 #######################################################################
492 enable_avahi = get_option('avahi')
493 avahi = []
494 if enable_avahi and IS_WIN32
495         # Just keep enabled.
496 elif enable_avahi
497         # Attempt to autodetect Avahi
498         avahi_client = dependency('avahi-client', required : false)
499         avahi_glib = dependency('avahi-glib', required : false)
500         if avahi_client.found() and avahi_glib.found()
501                 avahi = [avahi_client, avahi_glib]
502         else
503                 enable_avahi = false
504                 if force_deps
505                         error('''
506 avahi development package not found.
507 Use -Davahi=false if you do not need avahi (Bonjour) support.
508 ''')
509                 endif
510         endif
511 endif
514 #######################################################################
515 # Check for SILC client includes and libraries
516 #######################################################################
517 have_silc = false
518 if get_option('silc')
519         silc = dependency('silcclient', version : '>= 1.1', required : false)
520         if silc.found()
521                 have_silc = true
522                 # SILC Toolkit >= 1.0.1 has a new MIME API
523                 conf.set('HAVE_SILCMIME_H', true)
524         else
525                 if force_deps
526                         error('''
527 SILC development package not found.
528 Use -Dsilc=false if you do not need SILC support.
529 ''')
530                 endif
531         endif
532 endif
534 #######################################################################
535 # Check for Gadu-Gadu protocol library (libgadu)
536 #######################################################################
538 enable_libgadu = get_option('libgadu')
539 if enable_libgadu
540         libgadu = dependency('libgadu', version : '>= 1.12.0', required : false)
541         have_libgadu = libgadu.found()
543         if have_libgadu
544                 if not compiler.has_function('gg_is_gpl_compliant', dependencies : libgadu)
545                         have_libgadu = false
546                         message('''
547 libgadu is not compatible with the GPL when compiled with OpenSSL support.
549 To link against libgadu, please recompile it using:
550 ./configure --with-openssl=no
551 Then rerun this Meson build
552                         ''')
553                 endif
554         endif
556         if not have_libgadu and force_deps
557                 error('''
558 Libgadu development headers not found.
559 Use -Dlibgadu=false if you do not need GG (GaduGadu) support.
560 ''')
561         endif
562 else
563         have_libgadu = false
564 endif
567 DEFAULT_PRPLS = ['bonjour', 'facebook', 'gg', 'irc', 'jabber', 'novell',
568                  'oscar', 'sametime', 'silc', 'simple', 'zephyr']
569 ALL_PRPLS = DEFAULT_PRPLS + ['null']
571 dynamic_list = get_option('dynamic-prpls').split(',')
572 static_list = get_option('static-prpls').split(',')
573 if (static_list != [''] and static_list != []) and dynamic_list == ['all']
574         dynamic_list = []
575 endif
577 if static_list == ['all']
578         static_list = DEFAULT_PRPLS
579 endif
580 STATIC_PRPLS = []
581 foreach prpl : static_list
582         if prpl == ''
583                 # The list was empty; do nothing.
584         elif prpl == 'sametime' and not enable_meanwhile
585                 # Do nothing
586         elif prpl == 'bonjour' and not enable_avahi
587                 # Do nothing
588         elif prpl == 'silc' and not have_silc
589                 # Do nothing
590         elif prpl == 'gg' and not have_libgadu
591                 # Do nothing
592         elif prpl == 'zephyr' and IS_WIN32
593                 # Do nothing
594         else
595                 STATIC_PRPLS += [prpl]
596         endif
597 endforeach
598 STATIC_LINK_LIBS = []
599 extern_load = []
600 load_proto = []
601 extern_unload = []
602 unload_proto = []
603 foreach prpl : STATIC_PRPLS
604         # Ugly special case for 'libsilcpurple.la':
605         if prpl == 'silc'
606                 STATIC_LINK_LIBS.append('\$(top_builddir)/libpurple/protocols/@1@/lib@1@purple.la'.format(meson.build_root(), prpl))
607         else
608                 # FIXME: Shouldn't be libtool:
609                 STATIC_LINK_LIBS.append('\$(top_builddir)/libpurple/protocols/@1@/lib@1@.la'.format(meson.build_root(), prpl))
610         endif
611         extern_load.append('extern gboolean @0@_plugin_load();'.format(prpl))
612         load_proto.append('@0@_plugin_load();'.format(prpl))
613         extern_unload.append('extern gboolean @0@_plugin_unload();'.format(prpl))
614         unload_proto.append('@0@_plugin_unload();'.format(prpl))
615 endforeach
616 STATIC_BONJOUR = STATIC_PRPLS.contains('bonjour')
617 STATIC_FACEBOOK = STATIC_PRPLS.contains('facebook')
618 STATIC_GG = STATIC_PRPLS.contains('gg')
619 STATIC_IRC = STATIC_PRPLS.contains('irc')
620 STATIC_JABBER = STATIC_PRPLS.contains('jabber')
621 STATIC_NOVELL = STATIC_PRPLS.contains('novell')
622 STATIC_OSCAR = STATIC_PRPLS.contains('oscar') or STATIC_PRPLS.contains('aim') or STATIC_PRPLS.contains('icq')
623 STATIC_SAMETIME = STATIC_PRPLS.contains('sametime')
624 STATIC_SILC = STATIC_PRPLS.contains('silc')
625 STATIC_SIMPLE = STATIC_PRPLS.contains('simple')
626 STATIC_ZEPHYR = STATIC_PRPLS.contains('zephyr')
627 conf.set('STATIC_PROTO_LOAD',
628     ' '.join(extern_load) +
629     ' static void static_proto_load(void) { ' + ' '.join(load_proto) + ' }')
630 conf.set('STATIC_PROTO_UNLOAD',
631     ' '.join(extern_unload) +
632     ' static void static_proto_unload(void) { ' + ' '.join(unload_proto) + ' }')
634 if dynamic_list == ['all']
635         dynamic_list = DEFAULT_PRPLS
636 endif
637 DYNAMIC_PRPLS = []
638 foreach prpl : dynamic_list
639         if prpl == ''
640                 # The list was empty; do nothing.
641         elif prpl == 'sametime' and not enable_meanwhile
642                 # Do nothing.
643         elif prpl == 'bonjour' and not enable_avahi
644                 # Do nothing.
645         elif prpl == 'silc' and not have_silc
646                 # Do nothing.
647         elif prpl == 'gg' and not have_libgadu
648                 # Do nothing.
649         elif prpl == 'zephyr' and IS_WIN32
650                 # Do nothing.
651         else
652                 DYNAMIC_PRPLS += [prpl]
653         endif
654 endforeach
656 DYNAMIC_BONJOUR = DYNAMIC_PRPLS.contains('bonjour')
657 DYNAMIC_FACEBOOK = DYNAMIC_PRPLS.contains('facebook')
658 DYNAMIC_GG  = DYNAMIC_PRPLS.contains('gg')
659 DYNAMIC_IRC = DYNAMIC_PRPLS.contains('irc')
660 DYNAMIC_JABBER = DYNAMIC_PRPLS.contains('jabber')
661 DYNAMIC_NOVELL = DYNAMIC_PRPLS.contains('novell')
662 DYNAMIC_NULL = DYNAMIC_PRPLS.contains('null')
663 DYNAMIC_OSCAR = DYNAMIC_PRPLS.contains('oscar') or DYNAMIC_PRPLS.contains('aim') or DYNAMIC_PRPLS.contains('icq')
664 DYNAMIC_SAMETIME = DYNAMIC_PRPLS.contains('sametime')
665 DYNAMIC_SILC = DYNAMIC_PRPLS.contains('silc')
666 DYNAMIC_SIMPLE = DYNAMIC_PRPLS.contains('simple')
667 DYNAMIC_ZEPHYR = DYNAMIC_PRPLS.contains('zephyr')
669 conf.set('HAVE_SYS_UTSNAME_H',
670     compiler.has_header('sys/utsname.h'))
671 conf.set('HAVE_UNAME',
672     compiler.has_function('uname'))
675 add_project_arguments(
676     '-DPURPLE_DISABLE_DEPRECATED',
677     '-DPIDGIN_DISABLE_DEPRECATED',
678     '-DFINCH_DISABLE_DEPRECATED',
679     '-DGNT_DISABLE_DEPRECATED',
680     language : 'c')
681 if compiler.get_id() == 'gcc'
682         # We enable -Wall later.
683         # If it's set after the warning CFLAGS in the compiler invocation, it counteracts the -Wno... flags.
684         # This leads to warnings we don't want.
685 #       CFLAGS=`echo $CFLAGS |$sedpath 's/-Wall//'`
687         # ENABLE WARNINGS SUPPORTED BY THE VERSION OF GCC IN USE
688         #
689         # Future Possibilities
690         #
691         # Consider adding -Wbad-function-cast.
692         #       This leads to spurious warnings using GPOINTER_TO_INT(), et al. directly on a function call.
693         #               We'd need an intermediate variable.
694         #
695         foreach newflag : [
696                         '-Waggregate-return',
697                         '-Wcast-align',
698                         '-Wdeclaration-after-statement',
699                         '-Wendif-labels',
700                         '-Werror-implicit-function-declaration',
701                         '-Wextra -Wno-unused-parameter',
702                         '-Wformat',
703                         '-Wformat-security',
704                         '-Werror=format-security',
705                         '-Winit-self',
706                         '-Wmissing-declarations',
707                         '-Wmissing-noreturn',
708                         '-Wmissing-prototypes',
709                         '-Wpointer-arith',
710                         '-Wfloat-equal',
711                         '-Wundef']
712                 if compiler.has_argument(newflag)
713                         add_project_arguments(newflag, language : 'c')
714                 endif
715         endforeach
717         if get_option('fortify')
718 #               AC_MSG_CHECKING(for FORTIFY_SOURCE support)
719 #               AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <features.h>]], [[
720 #                       #if !(__GNUC_PREREQ (4, 1) \
721 #                               || (defined __GNUC_RH_RELEASE__ && __GNUC_PREREQ (4, 0)) \
722 #                               || (defined __GNUC_RH_RELEASE__ && __GNUC_PREREQ (3, 4) \
723 #                                       && __GNUC_MINOR__ == 4 \
724 #                                       && (__GNUC_PATCHLEVEL__ > 2 \
725 #                                               || (__GNUC_PATCHLEVEL__ == 2 && __GNUC_RH_RELEASE__ >= 8))))
726 #                       #error No FORTIFY_SOURCE support
727 #                       #endif
728 #                               return 0;
729 #               ]])], [
730 #                       AC_MSG_RESULT(yes)
731 #                       DEBUG_CFLAGS='$DEBUG_CFLAGS -Wp,-D_FORTIFY_SOURCE=2'
732 #               ], [
733 #                       AC_MSG_RESULT(no)
734 #               ])
735         endif
736 endif
737 if SUNCC
738         add_project_arguments('-features=extensions', language : 'c')
739 endif
741 pidginpath = find_program('pidgin', required : false)
743 if get_option('glib-errors-trace')
744         if compiler.get_id() == 'clang'
745                 error('--enable-glib-errors-trace doesn\'t work with clang')
746         endif
747         conf.set('ENABLE_GLIBTRACE', true)
748         add_project_arguments('-rdynamic', language : 'c')
749 endif
751 #######################################################################
752 # Check for D-Bus libraries
753 #######################################################################
755 # dbus doesn't compile for win32 at the moment
756 enable_dbus = get_option('dbus') and not IS_WIN32
758 if enable_dbus
759         dbus_binding_tool = find_program('dbus-binding-tool')
760         enable_dbus = dbus_binding_tool.found()
761 endif
763 if enable_dbus
764         dbus = dependency('dbus-1', version : '>= 0.60', required : force_deps)
765         dbus_glib = dependency('dbus-glib-1', version : '>= 0.60', required : force_deps)
766         enable_dbus = dbus.found() and dbus_glib.found()
767 else
768         dbus = []
769         dbus_glib = []
770 endif
772 if enable_dbus
773         conf.set('HAVE_DBUS', true)
774 endif
776 #######################################################################
777 # Check for Unity and Messaging Menu
778 # Remove when Ubuntu 16.04 is EOL
779 #######################################################################
780 enable_unity = get_option('unity-integration')
781 if enable_unity
782         UNITY = [
783                 dependency('unity', version : '>= 6.8'),
784                 dependency('messaging-menu', version : '>= 12.10')
785         ]
786         conf.set('USES_MM_CHAT_SECTION', 'X-MessagingMenu-UsesChatSection=true')
787 else
788         conf.set('USES_MM_CHAT_SECTION', '')
789 endif
791 #######################################################################
792 # Check for Secret Service headers
793 #######################################################################
795 enable_secret_service = get_option('secret-service') and not IS_WIN32
796 if enable_secret_service
797         secretservice = dependency('libsecret-1', required : force_deps)
798         if secretservice.found()
799         else
800                 enable_secret_service = false
801         endif
802 endif
804 #######################################################################
805 # Check for KWallet headers
806 #######################################################################
808 enable_kwallet = get_option('kwallet') and not IS_WIN32
809 enable_kwallet = false
811 if enable_kwallet
812         # Ensure C++ compiler works
813         add_languages('cpp')
814         cxx_compiler = meson.get_compiler('cpp')
816         qt4 = dependency('qt4', modules : 'Core', required : force_deps)
817         enable_kwallet = qt4.found()
818 endif
820 if enable_kwallet
821 #       AC_MSG_CHECKING([for metaobject compiler])
822 #       MOC=`$PKG_CONFIG --variable=moc_location QtCore`
823 #       AC_SUBST(MOC)
824 #       AC_MSG_RESULT([$MOC])
826 #       KWALLET_CXXFLAGS=''
827 #       KWALLET_LIBS=''
828 #       if test -z '$with_kwallet_includes' || test -z '$with_kwallet_libs'; then
829 #               AC_CHECK_PROG(KDE4_CONFIG, kde4-config, kde4-config, no)
830 #               if test 'x$KDE4_CONFIG' = 'xno'; then
831 #                       enable_kwallet = false
832 #                       if test 'x$force_deps' = 'xyes'; then
833 #                               AC_MSG_ERROR([
834 #kde4-config not found. $KDE4_CONFIG
835 #Use -Dkwallet=false if you do not need KWallet support.
837 #                       fi
838 #               fi
839 #       fi
840 endif
842 if enable_kwallet
843 #       if test 'x$KDE4_CONFIG' != 'xno'; then
844 #               KWALLET_CXXFLAGS='$QT4_CFLAGS -I`$KDE4_CONFIG --path include`'
845 #       fi
846 #       CPPFLAGS='$CPPFLAGS $KWALLET_CXXFLAGS'
847 #       AC_CHECK_HEADER([kwallet.h], , [
848 #               enable_kwallet = false
849 #               if test 'x$force_deps' = 'xyes'; then
850 #                       AC_MSG_ERROR([
851 #KWallet development headers not found.
852 #Use -Dkwallet=false if you do not need KWallet support.
854 #               fi
856 endif
858 if enable_kwallet
859 #       AC_MSG_CHECKING([for KWallet libraries])
860 #       if test 'x$KDE4_CONFIG' != 'xno'; then
861 #               KWALLET_LIBS='-L`$KDE4_CONFIG --install lib`/kde4/devel -lkdeui'
862 #       else
863 #               KWALLET_LIBS='-lkdeui'
864 #       fi
865 #       KWALLET_LIBS='$KWALLET_LIBS'
866 #       LIBS='$LIBS $KWALLET_LIBS $QT4_LIBS'
867 #       AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <kwallet.h>],
868 #               [KWallet::Wallet::LocalWallet();])], [AC_MSG_RESULT([yes])],
869 #               [
870 #                       AC_MSG_RESULT(no)
871 #                       enable_kwallet = false
872 #                       if test 'x$force_deps' = 'xyes'; then
873 #                               AC_MSG_ERROR([
874 #KWallet development libraries not found.
875 #Use -Dkwallet=false if you do not need KWallet support.
877 #                       fi
878 #               ])
879 endif
881 #######################################################################
882 # Check for GPlugin 0.0.17
883 #######################################################################
884 if get_option('plugins')
885         gplugin = dependency('gplugin', version : '>= 0.0.17')
886         # GPLUGIN_REQ sets pkg-config requirements in the .pc file
887         GPLUGIN_REQ = ['gplugin']
888 else
889         gplugin = []
890         GPLUGIN_REQ = []
891 endif
893 #######################################################################
894 # Check for GObject Introspection
895 #######################################################################
897 enable_introspection = get_option('introspection')
898 if enable_introspection
899         if dependency('gobject-introspection-1.0', version : '>= 1.30.0',
900                       required : force_deps).found()
901                 conf.set('ENABLE_INTROSPECTION', true)
902         else
903                 enable_introspection = false
904         endif
905 endif
907 #######################################################################
908 # Check for Python
909 #######################################################################
911 # Python scripts are used to auto-generate about 3000 lines of C
912 # and XML code that wraps (part of) the existing API so that
913 # it is now accessible through D-Bus.
915 if enable_dbus
916         if meson.version().version_compare('>=0.38.0')
917                 python3_mod = import('python3')
918                 python = python3_mod.find_python()
919         else
920                 python = find_program('python3')
921         endif
922 endif
924 #######################################################################
925 # SSL support
926 #######################################################################
928 ssl_certificates_dir = get_option('system-ssl-certs')
930 SSL_CERTIFICATES_DIR = ''
931 if ssl_certificates_dir != ''
932         if run_command('test', '-d', ssl_certificates_dir).returncode() != 0
933                 if IS_WIN32
934                         message(ssl_certificates_dir + ' does not exist. It may be OK when cross-compiling, but please make sure about it.')
935                 else
936                         error(ssl_certificates_dir + ' does not exist, if this is the correct location please make sure that it exists.')
937                 endif
938         endif
939         SSL_CERTIFICATES_DIR = ssl_certificates_dir
940 endif
941 if SSL_CERTIFICATES_DIR != ''
942         conf.set_quoted('SSL_CERTIFICATES_DIR', SSL_CERTIFICATES_DIR)
943 endif
944 INSTALL_SSL_CERTIFICATES = SSL_CERTIFICATES_DIR == ''
946 if get_option('plugins')
947         conf.set('PURPLE_PLUGINS', 1)
948         PLUGINS = true
949         purple_h_conf.set('PLUGINS_DEFINE', '#define PURPLE_PLUGINS 1')
950 else
951         PLUGINS = false
952         purple_h_conf.set('PLUGINS_DEFINE', '#undef PURPLE_PLUGINS')
953 endif
955 #######################################################################
956 # Check for Nettle (Crypto Library)
957 #######################################################################
959 enable_nettle = get_option('nettle')
961 if enable_nettle
962         nettle = dependency('nettle', version : '>= 3.0', required : false)
963         enable_nettle = nettle.found()
964         conf.set('HAVE_NETTLE', enable_nettle)
966         if not enable_nettle and force_deps
967                 error('''
968 Nettle development headers not found
969 Use -Dnettle=false if you do not need it.
970 ''')
971         endif
972 else
973         nettle = []
974 endif
976 #######################################################################
977 # Check for Cyrus-SASL (for xmpp/irc)
978 #######################################################################
979 foreach func : ['snprintf', 'connect']
980         conf.set('HAVE_' + func.to_upper(),
981             compiler.has_function(func))
982 endforeach
983 enable_cyrus_sasl = get_option('cyrus-sasl')
984 if enable_cyrus_sasl
985         sasl = dependency('libsasl2', version : '>= 2.0', required : false)
986         enable_cyrus_sasl = sasl.found()
987         conf.set('HAVE_CYRUS_SASL', enable_cyrus_sasl)
989         if not enable_cyrus_sasl and force_deps
990                 error('''
991 Cyrus SASL library not found
992 Use -Dcyrus-sasl=false if you do not need it.
993 ''')
994         endif
995 else
996         enable_cyrus_sasl = false
997         sasl = []
998 endif
1000 #######################################################################
1001 # Check for Kerberos (for Zephyr)
1002 #######################################################################
1003 conf.set('ZEPHYR_INT32', 'long')
1004 #AC_SUBST(KRB4_CFLAGS)
1005 #AC_SUBST(KRB4_LDFLAGS)
1006 #AC_SUBST(KRB4_LIBS)
1007 kerberos = get_option('krb4')
1008 if kerberos
1009         if kerberos != 'yes'
1010 #               KRB4_CFLAGS='-I${kerberos}/include'
1011 #               if test -d '$kerberos/include/kerberosIV' ; then
1012 #                       KRB4_CFLAGS='$KRB4_CFLAGS -I${kerberos}/include/kerberosIV'
1013 #               fi
1014 #               KRB4_LDFLAGS='-L${kerberos}/lib'
1015         elif run_command('test', '-d', '/usr/local/include/kerberosIV').returncode() == 0
1016 #               KRB4_CFLAGS='-I/usr/local/include/kerberosIV'
1017         elif run_command('test', '-d', '/usr/include/kerberosIV').returncode() == 0
1018 #               KRB4_CFLAGS='-I/usr/include/kerberosIV'
1019         endif
1020         conf.set('ZEPHYR_USES_KERBEROS', true)
1022 #       AC_CHECK_LIB(krb4, krb_rd_req,
1023 #                       [KRB4_LIBS='-lkrb4 -ldes425 -lkrb5 -lk5crypto -lcom_err'],
1024 #                       [AC_CHECK_LIB(krb, krb_rd_req,
1025 #                               [KRB4_LIBS='-lkrb -ldes'],
1026 #                               [AC_MSG_ERROR([Kerberos 4 libraries not found])],
1027 #                               -ldes)],
1028 #                       -ldes425 -lkrb5 -lk5crypto -lcom_err)
1029 #       AC_CHECK_FUNCS(krb_set_key krb_rd_req krb_get_lrealm)
1030 #       AC_CHECK_FUNCS(krb_get_err_text krb_log)
1031         krb4 = []
1032 endif
1033 if not kerberos
1034         krb4 = []
1035 endif
1037 #######################################################################
1038 # Check for external libzephyr
1039 #######################################################################
1040 zephyr = get_option('zephyr')
1041 if zephyr
1042         ext_zephyr = dependency('zephyr', required : force_deps)
1043         zephyr = ext_zephyr.found()
1044 else
1045         ext_zephyr = []
1046 endif
1047 EXTERNAL_LIBZEPHYR = zephyr
1048 conf.set('LIBZEPHYR_EXT', EXTERNAL_LIBZEPHYR)
1050 #AC_MSG_CHECKING(for me pot o' gold)
1051 #AC_MSG_RESULT(no)
1052 foreach func : ['gethostid', 'timegm']
1053         conf.set('HAVE_' + func.to_upper(),
1054             compiler.has_function(func))
1055 endforeach
1056 foreach header : 'paths.h sgtty.h sys/cdefs.h sys/file.h sys/filio.h sys/ioctl.h sys/msgbuf.h sys/select.h sys/uio.h sys/utsname.h sys/wait.h termios.h'.split()
1057         conf.set('HAVE_' + header.to_upper().underscorify(),
1058             compiler.has_header(header))
1059 endforeach
1061 # sys/sysctl.h on OpenBSD 4.2 requires sys/param.h
1062 # sys/sysctl.h on FreeBSD requires sys/types.h
1063 have_sys_param_h = compiler.has_header('sys/param.h')
1064 conf.set('HAVE_SYS_PARAM_H', have_sys_param_h)
1065 prefix = '''
1066 #include <sys/types.h>
1068 if have_sys_param_h
1069         prefix += '''
1070 #include <sys/param.h>
1072 endif
1073 conf.set('HAVE_SYS_SYSCTL_H',
1074     compiler.has_header('sys/sysctl.h', prefix : prefix))
1075 conf.set('HAVE_SYS_SOCKET_H',
1076     compiler.has_header('sys/socket.h'))
1077 #AC_VAR_TIMEZONE_EXTERNALS
1079 conf.set('HAVE_TM_GMTOFF',
1080     compiler.has_member('struct tm', 'tm_gmtoff',
1081         prefix : '#include<time.h>'))
1083 #######################################################################
1084 # Disable pixmap installation
1085 #######################################################################
1086 INSTALL_PIXMAPS = get_option('pixmaps-install')
1088 # check for gtk-doc
1089 ENABLE_DOC = get_option('doc')
1090 if ENABLE_DOC
1091         if meson.version().version_compare('<0.41.2')
1092                 if force_deps
1093                         error('Meson 0.41.2 or newer is required to build documentation.')
1094                 endif
1095                 ENABLE_DOC = false
1096         endif
1097 endif
1099 enable_debug = get_option('debug')
1100 conf.set('DEBUG', enable_debug)
1102 # So that config.h may be found.
1103 toplevel_inc = include_directories('.')
1105 subdir('libpurple')
1106 subdir('share/sounds')
1107 subdir('share/ca-certs')
1108 subdir('finch')
1109 subdir('pidgin')
1110 subdir('doc')
1112 configure_file(output : 'config.h',
1113     configuration : conf)
1115 message('')
1116 message('pidgin ' + purple_display_version)
1118 message('')
1119 message('Build GTK+ UI................. : ' + get_option('gtkui').to_string())
1120 message('Build console UI.............. : ' + enable_consoleui.to_string())
1121 message('Build for X11................. : ' + with_x.to_string())
1122 message('')
1123 message('Enable Gestures............... : ' + enable_gestures.to_string())
1124 message('Protocols to build dynamically : @0@'.format(DYNAMIC_PRPLS))
1125 message('Protocols to link statically.. : @0@'.format(STATIC_PRPLS))
1126 message('')
1127 message('Build with GStreamer support.. : ' + enable_gst.to_string())
1128 message('Build with D-Bus support...... : ' + enable_dbus.to_string())
1129 message('Build with voice and video.... : ' + enable_vv.to_string())
1130 message('Build with GNU Libidn......... : ' + get_option('idn').to_string())
1131 if SSL_CERTIFICATES_DIR != ''
1132         message('SSL CA certificates directory. : ' + SSL_CERTIFICATES_DIR)
1133 endif
1134 message('Build with Nettle support..... : ' + enable_nettle.to_string())
1135 message('Build with Cyrus SASL support. : ' + enable_cyrus_sasl.to_string())
1136 message('Use kerberos 4 with zephyr.... : ' + kerberos.to_string())
1137 message('Use external libzephyr........ : ' + zephyr.to_string())
1138 message('Install pixmaps............... : ' + INSTALL_PIXMAPS.to_string())
1139 message('Install translations.......... : ' + INSTALL_I18N.to_string())
1140 message('Has you....................... : yes')
1141 message('')
1142 message('Build with Enchant support.... : ' + enable_enchant.to_string())
1143 message('Build with GCR widgets........ : ' + enable_gcr.to_string())
1144 message('Build Unity integration plugin.: ' + enable_unity.to_string())
1145 message('')
1146 message('Build with KWallet............ : ' + enable_kwallet.to_string())
1147 message('Build with Secret Service..... : ' + enable_secret_service.to_string())
1148 message('')
1149 message('Build with plugin support..... : ' + PLUGINS.to_string())
1150 message('Enable Introspection...........: ' + enable_introspection.to_string())
1151 message('')
1152 message('Print debugging messages...... : ' + enable_debug.to_string())
1153 message('Generate documentation........ : ' + ENABLE_DOC.to_string())
1154 message('')
1155 bindir = join_paths(get_option('prefix'), get_option('bindir'))
1156 message('Pidgin will be installed in @0@.'.format(bindir))
1157 if pidginpath.found()
1158         message('Warning: You have an old copy of Pidgin at @0@.'.format(pidginpath.path()))
1159 endif
1160 if not INSTALL_PIXMAPS
1161         message('')
1162         message('Warning: You have disabled the installation of pixmap data, but Pidgin')
1163         message('still requires installed pixmaps.  Be sure you know what you are doing.')
1164 endif
1165 if not INSTALL_I18N
1166         message('')
1167         message('Warning: You have disabled the building and installation of translation')
1168         message('data.  This will prevent building Pidgin desktop files.')
1169         message('Be sure you know what you are doing.')
1170 endif
1171 message('')
1172 message('configure complete, now type \'ninja\'')
1173 message('')