Bump GLib requirement to >= 2.62
[platform/upstream/gstreamer.git] / subprojects / gst-editing-services / meson.build
1 project('gst-editing-services', 'c',
2   version : '1.21.0.1',
3   meson_version : '>= 0.60',
4   default_options : [ 'warning_level=1',
5                       'buildtype=debugoptimized' ])
6
7 gst_version = meson.project_version()
8 version_arr = gst_version.split('.')
9 gst_version = meson.project_version()
10 version_arr = gst_version.split('.')
11 gst_version_major = version_arr[0].to_int()
12 gst_version_minor = version_arr[1].to_int()
13 gst_version_micro = version_arr[2].to_int()
14  if version_arr.length() == 4
15   gst_version_nano = version_arr[3].to_int()
16 else
17   gst_version_nano = 0
18 endif
19 gst_version_is_stable = gst_version_minor.is_even()
20 gst_version_is_dev = gst_version_minor.is_odd() and gst_version_micro < 90
21
22 apiversion = '1.0'
23 soversion = 0
24 # maintaining compatibility with the previous libtool versioning
25 # current = minor * 100 + micro
26 curversion = gst_version_minor * 100 + gst_version_micro
27 libversion = '@0@.@1@.0'.format(soversion, curversion)
28 osxversion = curversion + 1
29
30 glib_req = '>= 2.62.0'
31
32 if gst_version_is_stable
33   gst_req = '>= @0@.@1@.0'.format(gst_version_major, gst_version_minor)
34 else
35   gst_req = '>= ' + gst_version
36 endif
37
38 cc = meson.get_compiler('c')
39 mathlib = cc.find_library('m', required : false)
40
41 cdata = configuration_data()
42
43 prefix = get_option('prefix')
44 datadir = prefix / get_option('datadir')
45
46 if cc.get_id() == 'msvc'
47   msvc_args = [
48       # Ignore several spurious warnings for things gstreamer does very commonly
49       # If a warning is completely useless and spammy, use '/wdXXXX' to suppress it
50       # If a warning is harmless but hard to fix, use '/woXXXX' so it's shown once
51       # NOTE: Only add warnings here if you are sure they're spurious
52       '/wd4018', # implicit signed/unsigned conversion
53       '/wd4146', # unary minus on unsigned (beware INT_MIN)
54       '/wd4244', # lossy type conversion (e.g. double -> int)
55       '/wd4305', # truncating type conversion (e.g. double -> float)
56       cc.get_supported_arguments(['/utf-8']), # set the input encoding to utf-8
57
58       # Enable some warnings on MSVC to match GCC/Clang behaviour
59       '/w14062', # enumerator 'identifier' in switch of enum 'enumeration' is not handled
60       '/w14101', # 'identifier' : unreferenced local variable
61       '/w14189', # 'identifier' : local variable is initialized but not referenced
62   ]
63   add_project_arguments(msvc_args, language: 'c')
64 endif
65
66 if cc.has_link_argument('-Wl,-Bsymbolic-functions')
67   add_project_link_arguments('-Wl,-Bsymbolic-functions', language : 'c')
68 endif
69
70 # Symbol visibility
71 if cc.get_id() == 'msvc'
72   export_define = '__declspec(dllexport) extern'
73 elif cc.has_argument('-fvisibility=hidden')
74   add_project_arguments('-fvisibility=hidden', language: 'c')
75   export_define = 'extern __attribute__ ((visibility ("default")))'
76 else
77   export_define = 'extern'
78 endif
79
80 # Passing this through the command line would be too messy
81 cdata.set('GST_API_EXPORT', export_define)
82
83 # Disable strict aliasing
84 if cc.has_argument('-fno-strict-aliasing')
85   add_project_arguments('-fno-strict-aliasing', language: 'c')
86 endif
87
88 cdata.set('VERSION', '"@0@"'.format(gst_version))
89 cdata.set('PACKAGE', '"gst-editing-services"')
90 cdata.set('PACKAGE_VERSION', '"@0@"'.format(gst_version))
91 cdata.set('PACKAGE_BUGREPORT', '"https://gitlab.freedesktop.org/gstreamer/gst-editing-services/issues/new"')
92 cdata.set('PACKAGE_NAME', '"GStreamer Editing Services"')
93 cdata.set('GST_PACKAGE_NAME', '"GStreamer Editing Services"')
94 cdata.set('GST_PACKAGE_ORIGIN', '"Unknown package origin"')
95 cdata.set('GST_LICENSE', '"LGPL"')
96
97 # Mandatory GST deps
98 gst_dep = dependency('gstreamer-' + apiversion, version : gst_req,
99     fallback : ['gstreamer', 'gst_dep'])
100 gstpbutils_dep = dependency('gstreamer-pbutils-' + apiversion, version : gst_req,
101     fallback : ['gst-plugins-base', 'pbutils_dep'])
102 gstvideo_dep = dependency('gstreamer-video-' + apiversion, version : gst_req,
103     fallback : ['gst-plugins-base', 'video_dep'])
104 gstaudio_dep = dependency('gstreamer-audio-' + apiversion, version : gst_req,
105     fallback : ['gst-plugins-base', 'audio_dep'])
106 gstbase_dep = dependency('gstreamer-base-1.0', version : gst_req,
107     fallback : ['gstreamer', 'gst_base_dep'])
108 if host_machine.system() != 'windows'
109   gstcheck_dep = dependency('gstreamer-check-1.0', version : gst_req,
110     required : get_option('tests'),
111     fallback : ['gstreamer', 'gst_check_dep'])
112 endif
113 gstcontroller_dep = dependency('gstreamer-controller-1.0', version : gst_req,
114   fallback : ['gstreamer', 'gst_controller_dep'])
115 gstvalidate_dep = dependency('gst-validate-1.0', version : gst_req, required : get_option('validate'),
116   fallback : ['gst-devtools', 'validate_dep'])
117
118 gio_dep = dependency('gio-2.0', version: glib_req)
119 gmodule_dep = dependency('gmodule-no-export-2.0')
120 libxml_dep = dependency('libxml-2.0', required: get_option('xptv'))
121 cdata.set('DISABLE_XPTV', not libxml_dep.found())
122
123 # TODO Properly port to Gtk 3
124 # gtk_dep = dependency('gtk+-3.0', required : false)
125
126 libges_deps = [gst_dep, gstbase_dep, gstvideo_dep, gstpbutils_dep,
127                gstcontroller_dep, gio_dep, libxml_dep, mathlib]
128
129 if gstvalidate_dep.found()
130     libges_deps = libges_deps + [gstvalidate_dep]
131     cdata.set('HAVE_GST_VALIDATE', 1)
132 endif
133
134 gir = find_program('g-ir-scanner', required : get_option('introspection'))
135 gnome = import('gnome')
136
137 # Fixme, not very elegant.
138 build_gir = gir.found() and (not meson.is_cross_build() or get_option('introspection').enabled())
139 gir_init_section = [ '--add-init-section=' + \
140     'extern void gst_init(gint*,gchar**);' + \
141     'extern void ges_init(void);' + \
142     'g_setenv("GST_REGISTRY_1.0", "/no/way/this/exists.reg", TRUE);' + \
143     'g_setenv("GST_PLUGIN_PATH_1_0", "", TRUE);' + \
144     'g_setenv("GST_PLUGIN_SYSTEM_PATH_1_0", "", TRUE);' + \
145     'g_setenv("GST_DEBUG", "0", TRUE);' + \
146     'gst_init(NULL,NULL);' + \
147     'ges_init();', '--quiet']
148
149 has_python = false
150 static_build = get_option('default_library') == 'static'
151 if static_build
152   if get_option('python').enabled()
153     error('Want to build python based modules but it is not supported while static building')
154   else
155     message('Disabling python support as it is not supported on static builds')
156   endif
157 elif build_gir
158   pymod = import('python')
159   python = pymod.find_installation(required: get_option('python'))
160   if python.found()
161     # Workaround for https://github.com/mesonbuild/meson/issues/5629
162     pythonver = python.language_version()
163     python_dep = dependency('python-@0@-embed'.format(pythonver), version: '>=3', required: false)
164     if not python_dep.found()
165       python_dep = python.dependency(required : get_option('python'))
166     endif
167   else
168     python_dep = dependency('', required: false)
169   endif
170   if python_dep.found()
171     python_abi_flags = python.get_variable('ABIFLAGS', '')
172     pylib_loc = get_option('libpython-dir')
173
174     error_msg = ''
175     if not cc.compiles('#include <Python.h>', dependencies: [python_dep])
176       error_msg = 'Could not compile a simple program against python'
177     elif pylib_loc == ''
178       fsmod = import('fs')
179       pylib_loc = python.get_variable('LIBPL', '')
180       if host_machine.system() != 'windows' and host_machine.system() != 'darwin'
181         pylib_ldlibrary = python.get_variable('LDLIBRARY', '')
182         if not fsmod.exists(pylib_loc / pylib_ldlibrary)
183           # Workaround for Fedora
184           pylib_loc = python.get_variable('LIBDIR', '')
185           message('pylib_loc = @0@'.format(pylib_loc))
186         endif
187
188         if not fsmod.exists(pylib_loc / pylib_ldlibrary)
189           error_msg = '@0@ doesn\' exist, can\'t use python'.format(join_paths(pylib_loc, pylib_ldlibrary))
190         endif
191       endif
192       if error_msg == ''
193         pylib_suffix = 'so'
194         if host_machine.system() == 'windows'
195           pylib_suffix = 'dll'
196         elif host_machine.system() == 'darwin'
197           pylib_suffix = 'dylib'
198         endif
199
200         libges_deps = libges_deps + [python_dep, gmodule_dep]
201         has_python = true
202         message('python_abi_flags = @0@'.format(python_abi_flags))
203         message('pylib_loc = @0@'.format(pylib_loc))
204         cdata.set('HAS_PYTHON', true)
205         cdata.set('PY_LIB_LOC', '"@0@"'.format(pylib_loc))
206         cdata.set('PY_ABI_FLAGS', '"@0@"'.format(python_abi_flags))
207         cdata.set('PY_LIB_SUFFIX', '"@0@"'.format(pylib_suffix))
208         cdata.set('PYTHON_VERSION', '"@0@"'.format(python_dep.version()))
209       else
210           if get_option('python').enabled()
211             error(error_msg)
212           else
213             message(error_msg)
214           endif
215       endif
216     endif
217   endif
218 endif
219
220 ges_c_args = ['-DHAVE_CONFIG_H', '-DG_LOG_DOMAIN="GES"']
221 plugins_install_dir = '@0@/gstreamer-1.0'.format(get_option('libdir'))
222
223 pkgconfig = import('pkgconfig')
224 plugins_pkgconfig_install_dir = join_paths(plugins_install_dir, 'pkgconfig')
225 if get_option('default_library') == 'shared'
226   # If we don't build static plugins there is no need to generate pc files
227   plugins_pkgconfig_install_dir = disabler()
228 endif
229
230 if gst_dep.type_name() == 'internal'
231   gst_debug_disabled = not subproject('gstreamer').get_variable('gst_debug')
232 else
233   # We can't check that in the case of subprojects as we won't
234   # be able to build against an internal dependency (which is not built yet)
235   gst_debug_disabled = cc.has_header_symbol('gst/gstconfig.h', 'GST_DISABLE_GST_DEBUG', dependencies: gst_dep)
236 endif
237
238 if gst_debug_disabled and cc.has_argument('-Wno-unused')
239   add_project_arguments('-Wno-unused', language: 'c')
240 endif
241
242 warning_flags = [
243   '-Wmissing-declarations',
244   '-Wmissing-prototypes',
245   '-Wredundant-decls',
246   '-Wundef',
247   '-Wwrite-strings',
248   '-Wformat',
249   '-Wformat-security',
250   '-Winit-self',
251   '-Wmissing-include-dirs',
252   '-Waddress',
253   '-Wno-multichar',
254   '-Wdeclaration-after-statement',
255   '-Wvla',
256   '-Wpointer-arith',
257 ]
258
259 foreach extra_arg : warning_flags
260   if cc.has_argument (extra_arg)
261     add_project_arguments([extra_arg], language: 'c')
262   endif
263 endforeach
264
265 python3 = import('python').find_installation()
266 pkgconfig = import('pkgconfig')
267 pkgconfig_subdirs = ['gstreamer-1.0']
268
269 configinc = include_directories('.')
270 libraries = []
271
272 subdir('ges')
273 subdir('plugins')
274 subdir('tools')
275
276 subdir('tests')
277 if not get_option('examples').disabled()
278   subdir('examples')
279 endif
280 subdir('docs')
281
282 override_detector = '''
283 import sys
284 import os
285
286 prefix = sys.argv[1]
287 version = sys.version_info
288
289 # If we are installing in the same prefix as PyGobject
290 # make sure to install in the right place.
291 import gi.overrides
292
293 overrides_path = os.path.dirname(gi.overrides.__file__)
294 if os.path.commonprefix([overrides_path, prefix]) == prefix:
295     print(overrides_path)
296     exit(0)
297
298 # Otherwise follow python's way of install site packages inside
299 # the provided prefix
300 if os.name == 'posix':
301     print(os.path.join(
302         prefix, 'lib', 'python%d.%d' % (version.major, version.minor),
303         'site-packages', 'gi', 'overrides'))
304 else:
305     print(os.path.join(
306         prefix, 'Lib', 'Python%d%d' % (version.major, version.minor),
307         'site-packages', 'gi', 'overrides'))
308 '''
309 pygi_override_dir = get_option('pygi-overrides-dir')
310 if pygi_override_dir == ''
311     cres = run_command(python3, '-c', override_detector, get_option('prefix'), check: false)
312     if cres.returncode() == 0
313       pygi_override_dir = cres.stdout().strip()
314     endif
315     if cres.stderr() != ''
316         message(cres.stderr())
317     endif
318 endif
319
320 if pygi_override_dir != ''
321   message('pygobject overrides directory ' + pygi_override_dir)
322   subdir('bindings/python')
323 endif
324
325 # Set release date
326 if gst_version_nano == 0
327   extract_release_date = find_program('scripts/extract-release-date-from-doap-file.py')
328   run_result = run_command(extract_release_date, gst_version, files('gst-editing-services.doap'), check: true)
329   release_date = run_result.stdout().strip()
330   cdata.set_quoted('GST_PACKAGE_RELEASE_DATETIME', release_date)
331   message('Package release date: ' + release_date)
332 endif
333
334 if gio_dep.version().version_compare('< 2.67.4')
335   cdata.set('g_memdup2(ptr,sz)', '(G_LIKELY(((guint64)(sz)) < G_MAXUINT)) ? g_memdup(ptr,sz) : (g_abort(),NULL)')
336 endif
337
338 configure_file(output: 'config.h', configuration: cdata)
339
340 plugin_names = []
341 foreach plugin: plugins
342   if plugin.name().startswith('gst')
343     plugin_names += [plugin.name().substring(3)]
344   else
345     plugin_names += [plugin.name()]
346   endif
347 endforeach
348
349 summary({
350     'Plugins': plugin_names,
351 }, list_sep: ', ')