tools: Add support for building gstreamer tools against gst-full
[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.56.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, fallback: ['glib', 'libgio_dep'])
119 libxml_dep = dependency('libxml-2.0', required: get_option('xptv'))
120 cdata.set('DISABLE_XPTV', not libxml_dep.found())
121
122 # TODO Properly port to Gtk 3
123 # gtk_dep = dependency('gtk+-3.0', required : false)
124
125 libges_deps = [gst_dep, gstbase_dep, gstvideo_dep, gstpbutils_dep,
126                gstcontroller_dep, gio_dep, libxml_dep, mathlib]
127
128 if gstvalidate_dep.found()
129     libges_deps = libges_deps + [gstvalidate_dep]
130     cdata.set('HAVE_GST_VALIDATE', 1)
131 endif
132
133 gir = find_program('g-ir-scanner', required : get_option('introspection'))
134 gnome = import('gnome')
135
136 # Fixme, not very elegant.
137 build_gir = gir.found() and (not meson.is_cross_build() or get_option('introspection').enabled())
138 gir_init_section = [ '--add-init-section=' + \
139     'extern void gst_init(gint*,gchar**);' + \
140     'extern void ges_init(void);' + \
141     'g_setenv("GST_REGISTRY_1.0", "/no/way/this/exists.reg", TRUE);' + \
142     'g_setenv("GST_PLUGIN_PATH_1_0", "", TRUE);' + \
143     'g_setenv("GST_PLUGIN_SYSTEM_PATH_1_0", "", TRUE);' + \
144     'g_setenv("GST_DEBUG", "0", TRUE);' + \
145     'gst_init(NULL,NULL);' + \
146     'ges_init();', '--quiet']
147
148 has_python = false
149 static_build = get_option('default_library') == 'static'
150 if static_build
151   if get_option('python').enabled()
152     error('Want to build python based modules but it is not supported while static building')
153   else
154     message('Disabling python support as it is not supported on static builds')
155   endif
156 elif build_gir
157   pymod = import('python')
158   python = pymod.find_installation(required: get_option('python'))
159   if python.found()
160     # Workaround for https://github.com/mesonbuild/meson/issues/5629
161     pythonver = python.language_version()
162     python_dep = dependency('python-@0@-embed'.format(pythonver), version: '>=3', required: false)
163     if not python_dep.found()
164       python_dep = python.dependency(required : get_option('python'))
165     endif
166   else
167     python_dep = dependency('', required: false)
168   endif
169   if python_dep.found()
170     python_abi_flags = python.get_variable('ABIFLAGS', '')
171     pylib_loc = get_option('libpython-dir')
172
173     error_msg = ''
174     if not cc.compiles('#include <Python.h>', dependencies: [python_dep])
175       error_msg = 'Could not compile a simple program against python'
176     elif pylib_loc == ''
177       fsmod = import('fs')
178       pylib_loc = python.get_variable('LIBPL', '')
179       if host_machine.system() != 'windows' and host_machine.system() != 'darwin'
180         pylib_ldlibrary = python.get_variable('LDLIBRARY', '')
181         if not fsmod.exists(pylib_loc / pylib_ldlibrary)
182           # Workaround for Fedora
183           pylib_loc = python.get_variable('LIBDIR', '')
184           message('pylib_loc = @0@'.format(pylib_loc))
185         endif
186
187         if not fsmod.exists(pylib_loc / pylib_ldlibrary)
188           error_msg = '@0@ doesn\' exist, can\'t use python'.format(join_paths(pylib_loc, pylib_ldlibrary))
189         endif
190       endif
191       if error_msg == ''
192         pylib_suffix = 'so'
193         if host_machine.system() == 'windows'
194           pylib_suffix = 'dll'
195         elif host_machine.system() == 'darwin'
196           pylib_suffix = 'dylib'
197         endif
198
199         gmodule_dep = dependency('gmodule-2.0')
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: ', ')