meson: use python.get_install_dir() to find the pygobject overrides dir
[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   '-Wvla',
255   '-Wpointer-arith',
256 ]
257
258 foreach extra_arg : warning_flags
259   if cc.has_argument (extra_arg)
260     add_project_arguments([extra_arg], language: 'c')
261   endif
262 endforeach
263
264 python3 = import('python').find_installation()
265 pkgconfig = import('pkgconfig')
266 pkgconfig_subdirs = ['gstreamer-1.0']
267
268 configinc = include_directories('.')
269 gst_libraries = []
270
271 subdir('ges')
272 subdir('plugins')
273 subdir('tools')
274
275 subdir('tests')
276 if not get_option('examples').disabled()
277   subdir('examples')
278 endif
279 subdir('docs')
280
281 pygi_override_dir = get_option('pygi-overrides-dir')
282 if pygi_override_dir == ''
283   pygi_override_dir = python3.get_install_dir(
284     subdir : join_paths('gi', 'overrides')
285   )
286 endif
287
288 message('pygobject overrides directory = @0@'.format(pygi_override_dir))
289 subdir('bindings/python')
290
291 # Set release date
292 if gst_version_nano == 0
293   extract_release_date = find_program('scripts/extract-release-date-from-doap-file.py')
294   run_result = run_command(extract_release_date, gst_version, files('gst-editing-services.doap'), check: true)
295   release_date = run_result.stdout().strip()
296   cdata.set_quoted('GST_PACKAGE_RELEASE_DATETIME', release_date)
297   message('Package release date: ' + release_date)
298 endif
299
300 if gio_dep.version().version_compare('< 2.67.4')
301   cdata.set('g_memdup2(ptr,sz)', '(G_LIKELY(((guint64)(sz)) < G_MAXUINT)) ? g_memdup(ptr,sz) : (g_abort(),NULL)')
302 endif
303
304 configure_file(output: 'config.h', configuration: cdata)
305
306 plugin_names = []
307 gst_plugins = []
308 foreach plugin: plugins
309   pkgconfig.generate(plugin, install_dir: plugins_pkgconfig_install_dir)
310   dep = declare_dependency(link_with: plugin, variables: {'full_path': plugin.full_path()})
311   meson.override_dependency(plugin.name(), dep)
312   gst_plugins += [dep]
313   if plugin.name().startswith('gst')
314     plugin_names += [plugin.name().substring(3)]
315   else
316     plugin_names += [plugin.name()]
317   endif
318 endforeach
319
320 summary({
321     'Plugins': plugin_names,
322 }, list_sep: ', ')