|
|
|
#############################################################################
|
|
|
|
#
|
|
|
|
# Copyright (C) 2019 Collabora Ltd
|
|
|
|
#
|
|
|
|
# Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
# copy of this software and associated documentation files (the "Software"),
|
|
|
|
# to deal in the Software without restriction, including without limitation
|
|
|
|
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
# and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
# Software is furnished to do so, subject to the following conditions:
|
|
|
|
#
|
|
|
|
# The above copyright notice and this permission notice shall be included
|
|
|
|
# in all copies or substantial portions of the Software.
|
|
|
|
#
|
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
|
|
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
|
|
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
|
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
|
|
# OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
#
|
|
|
|
|
|
|
|
project(
|
|
|
|
'virglrenderer', 'c',
|
|
|
|
version: '0.9.0',
|
|
|
|
license : 'MIT',
|
|
|
|
meson_version : '>= 0.49',
|
|
|
|
default_options : ['buildtype=release', 'b_ndebug=if-release',
|
|
|
|
'warning_level=3', 'c_std=gnu11']
|
|
|
|
)
|
|
|
|
|
|
|
|
# To change only before doing a release:
|
|
|
|
#
|
|
|
|
# 1. Incrememnt the revision
|
|
|
|
# 2. If the interface was changed in an compatible way increment the
|
|
|
|
# interface age
|
|
|
|
# 3. If the ABI has changed in an incompatible way increment the binary_age
|
|
|
|
# and set revision and interface_age to zero
|
|
|
|
|
|
|
|
binary_age = 1
|
|
|
|
interface_age = 5
|
|
|
|
revision = 3
|
|
|
|
|
|
|
|
cc = meson.get_compiler('c')
|
|
|
|
|
|
|
|
if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.1')
|
|
|
|
error('When using GCC, version 4.1 or later is required.')
|
|
|
|
endif
|
|
|
|
|
|
|
|
warnings = [
|
|
|
|
'-Werror=implicit-function-declaration',
|
|
|
|
'-Werror=missing-prototypes',
|
|
|
|
'-Wmissing-prototypes',
|
|
|
|
'-Werror=int-to-pointer-cast',
|
|
|
|
'-Wno-overlength-strings',
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach w : warnings
|
|
|
|
if cc.has_argument(w)
|
|
|
|
add_project_arguments(w, language : 'c')
|
|
|
|
endif
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
flags = [
|
|
|
|
'-fvisibility=hidden',
|
|
|
|
]
|
|
|
|
|
|
|
|
foreach f : flags
|
|
|
|
if cc.has_argument(f)
|
|
|
|
add_project_arguments(f, language : 'c')
|
|
|
|
endif
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
prog_python = import('python').find_installation('python3')
|
|
|
|
|
|
|
|
thread_dep = dependency('threads')
|
|
|
|
epoxy_dep = dependency('epoxy', version: '>= 1.5.4')
|
|
|
|
m_dep = cc.find_library('m')
|
|
|
|
|
|
|
|
conf_data = configuration_data()
|
|
|
|
conf_data.set('VERSION', '0.8.1')
|
|
|
|
conf_data.set('_GNU_SOURCE', 1)
|
|
|
|
conf_data.set('VIRGL_RENDERER_UNSTABLE_APIS', 1)
|
|
|
|
|
|
|
|
with_tracing = get_option('tracing')
|
|
|
|
|
|
|
|
if with_tracing != 'none'
|
|
|
|
if not cc.compiles('void f(void* v){} int main () { void *dummy __attribute__((cleanup (f))) = 0;}')
|
|
|
|
error('Tracing requires compiler support for __attribute__((cleanup))')
|
|
|
|
endif
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
if with_tracing == 'percetto'
|
|
|
|
# percetto uses C++ internally, so we need to link with C++.
|
|
|
|
# TODO: remove -lstdc++ when percetto is a shared library.
|
|
|
|
add_project_link_arguments('-lstdc++', language : 'c')
|
|
|
|
percetto_dep = dependency('percetto', version : '>=0.0.8')
|
|
|
|
conf_data.set('ENABLE_TRACING', 'TRACE_WITH_PERCETTO')
|
|
|
|
endif
|
|
|
|
|
|
|
|
if with_tracing == 'perfetto'
|
|
|
|
vperfetto_min_dep = dependency('vperfetto_min')
|
|
|
|
conf_data.set('ENABLE_TRACING', 'TRACE_WITH_PERFETTO')
|
|
|
|
endif
|
|
|
|
|
|
|
|
if with_tracing == 'stderr'
|
|
|
|
conf_data.set('ENABLE_TRACING', 'TRACE_WITH_STDERR')
|
|
|
|
endif
|
|
|
|
|
|
|
|
if cc.has_header('sys/uio.h')
|
|
|
|
conf_data.set('HAVE_SYS_UIO_H', 1)
|
|
|
|
endif
|
|
|
|
|
|
|
|
if cc.has_header('dlfcn.h')
|
|
|
|
conf_data.set('HAVE_DLFCN_H', 1)
|
|
|
|
endif
|
|
|
|
|
|
|
|
if cc.has_header('pthread.h')
|
|
|
|
conf_data.set('HAVE_PTHREAD', 1)
|
|
|
|
if cc.has_function('pthread_setaffinity_np', dependencies: thread_dep)
|
|
|
|
conf_data.set('HAVE_PTHREAD_SETAFFINITY', 1)
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
if cc.has_header('sys/eventfd.h')
|
|
|
|
conf_data.set('HAVE_EVENTFD_H', 1)
|
|
|
|
endif
|
|
|
|
|
|
|
|
if cc.has_header('sys/select.h')
|
|
|
|
conf_data.set('HAVE_SYS_SELECT_H', 1)
|
|
|
|
endif
|
|
|
|
|
|
|
|
foreach b : ['bswap32', 'bswap64', 'clz', 'clzll', 'expect', 'ffs', 'ffsll',
|
|
|
|
'popcount', 'popcountll', 'types_compatible_p', 'unreachable']
|
|
|
|
if cc.has_function(b)
|
|
|
|
conf_data.set('HAVE___BUILTIN_@0@'.format(b.to_upper()), 1)
|
|
|
|
endif
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
supported_function_attributes = cc.get_supported_function_attributes([
|
|
|
|
'const', 'flatten', 'format', 'malloc', 'noreturn', 'packed', 'pure',
|
|
|
|
'returns_nonnull', 'unused', 'warn_unused_result', 'weak',
|
|
|
|
])
|
|
|
|
foreach a : supported_function_attributes
|
|
|
|
conf_data.set('HAVE_FUNC_ATTRIBUTE_@0@'.format(a.to_upper()), 1)
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
foreach f : ['memfd_create', 'strtok_r', 'timespec_get']
|
|
|
|
if cc.has_function(f)
|
|
|
|
conf_data.set('HAVE_@0@'.format(f.to_upper()), 1)
|
|
|
|
endif
|
|
|
|
endforeach
|
|
|
|
|
|
|
|
if host_machine.endian() == 'little'
|
|
|
|
conf_data.set('UTIL_ARCH_LITTLE_ENDIAN', 1)
|
|
|
|
conf_data.set('UTIL_ARCH_BIG_ENDIAN', 0)
|
|
|
|
elif host_machine.endian() == 'big'
|
|
|
|
conf_data.set('UTIL_ARCH_LITTLE_ENDIAN', 0)
|
|
|
|
conf_data.set('UTIL_ARCH_BIG_ENDIAN', 1)
|
|
|
|
else
|
|
|
|
error('It wasn\'t possible to figure out the endianess of the machine')
|
|
|
|
endif
|
|
|
|
|
|
|
|
pipe_arch = host_machine.cpu_family()
|
|
|
|
|
|
|
|
if pipe_arch == 'x86'
|
|
|
|
conf_data.set('PIPE_ARCH_X86', true)
|
|
|
|
elif pipe_arch == 'x86_64'
|
|
|
|
conf_data.set('PIPE_ARCH_X86_64', true)
|
|
|
|
elif pipe_arch == 'ppc'
|
|
|
|
conf_data.set('PIPE_ARCH_PPC', true)
|
|
|
|
elif pipe_arch == 'ppc64'
|
|
|
|
conf_data.set('PIPE_ARCH_PPC_64', true)
|
|
|
|
elif pipe_arch == 's390x'
|
|
|
|
conf_data.set('PIPE_ARCH_S390', true)
|
|
|
|
elif pipe_arch == 'arm'
|
|
|
|
conf_data.set('PIPE_ARCH_ARM', true)
|
|
|
|
elif pipe_arch == 'aarch64'
|
|
|
|
conf_data.set('PIPE_ARCH_AARCH64', true)
|
|
|
|
else
|
|
|
|
warning('Arch used is not supported')
|
|
|
|
endif
|
|
|
|
|
|
|
|
if get_option('buildtype') == 'debug'
|
|
|
|
add_global_arguments('-DDEBUG=1', language : 'c')
|
|
|
|
endif
|
|
|
|
|
|
|
|
platforms = get_option('platforms')
|
|
|
|
|
|
|
|
require_egl = platforms.contains('egl')
|
|
|
|
require_glx = platforms.contains('glx')
|
|
|
|
auto_egl_glx = platforms.contains('auto')
|
|
|
|
|
|
|
|
with_egl = require_egl or auto_egl_glx
|
|
|
|
with_glx = require_glx or auto_egl_glx
|
|
|
|
|
|
|
|
have_egl = false
|
|
|
|
have_glx = false
|
|
|
|
|
|
|
|
with_minigbm_allocation = get_option('minigbm_allocation')
|
|
|
|
if with_minigbm_allocation
|
|
|
|
conf_data.set('ENABLE_MINIGBM_ALLOCATION', 1)
|
|
|
|
_gbm_ver = '18.0.0'
|
|
|
|
else
|
|
|
|
_gbm_ver = '0.0.0'
|
|
|
|
endif
|
|
|
|
|
|
|
|
if with_egl
|
|
|
|
if cc.has_header('epoxy/egl.h', dependencies: epoxy_dep) and epoxy_dep.get_pkgconfig_variable('epoxy_has_egl') == '1'
|
|
|
|
libdrm_dep = dependency('libdrm', required: require_egl, version : '>=2.4.50')
|
|
|
|
gbm_dep = dependency('gbm', version: '>= ' + _gbm_ver, required: require_egl)
|
|
|
|
have_egl = libdrm_dep.found() and gbm_dep.found()
|
|
|
|
if (have_egl)
|
|
|
|
conf_data.set('HAVE_EPOXY_EGL_H', 1)
|
|
|
|
else
|
|
|
|
assert(not require_egl,
|
|
|
|
'egl was explicitely requested which requires gbm, and this is not available')
|
|
|
|
endif
|
|
|
|
else
|
|
|
|
assert(not require_egl,
|
|
|
|
'egl was explicitely requested but it is not supported by epoxy')
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
if with_glx
|
|
|
|
if cc.has_header('epoxy/glx.h', dependencies: epoxy_dep) and epoxy_dep.get_pkgconfig_variable('epoxy_has_glx') == '1'
|
|
|
|
glx_dep = dependency('x11', required: require_glx)
|
|
|
|
have_glx = glx_dep.found()
|
|
|
|
conf_data.set('HAVE_EPOXY_GLX_H', 1)
|
|
|
|
else
|
|
|
|
assert(not require_glx,
|
|
|
|
'glx was explicitely requested but it is not supported by epoxy')
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
with_venus = get_option('venus-experimental')
|
|
|
|
with_venus_validate = get_option('venus-validate')
|
|
|
|
if with_venus
|
|
|
|
venus_dep = dependency('vulkan')
|
|
|
|
conf_data.set('ENABLE_VENUS', 1)
|
|
|
|
|
|
|
|
if with_venus_validate
|
|
|
|
conf_data.set('ENABLE_VENUS_VALIDATE', 1)
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
with_render_server = get_option('render-server')
|
|
|
|
with_render_server_worker = get_option('render-server-worker')
|
|
|
|
render_server_install_dir = get_option('prefix') / get_option('libexecdir')
|
|
|
|
if with_render_server
|
|
|
|
if not with_venus
|
|
|
|
error('render server makes no sense without venus currently')
|
|
|
|
endif
|
|
|
|
|
|
|
|
conf_data.set('ENABLE_RENDER_SERVER', 1)
|
|
|
|
conf_data.set('RENDER_SERVER_EXEC_PATH',
|
|
|
|
'"' + render_server_install_dir / 'virgl_render_server' + '"')
|
|
|
|
|
|
|
|
if with_render_server_worker == 'process'
|
|
|
|
conf_data.set('ENABLE_RENDER_SERVER_WORKER_PROCESS', 1)
|
|
|
|
elif with_render_server_worker == 'thread'
|
|
|
|
conf_data.set('ENABLE_RENDER_SERVER_WORKER_THREAD', 1)
|
|
|
|
elif with_render_server_worker == 'minijail'
|
|
|
|
conf_data.set('ENABLE_RENDER_SERVER_WORKER_MINIJAIL', 1)
|
|
|
|
minijail_dep = dependency('libminijail')
|
|
|
|
else
|
|
|
|
error('unknown render server worker ' + with_render_server_worker)
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
if cc.compiles('void __attribute__((hidden)) func() {}')
|
|
|
|
conf_data.set('HAVE_FUNC_ATTRIBUTE_VISIBILITY', 1)
|
|
|
|
endif
|
|
|
|
|
|
|
|
configure_file(input : 'config.h.meson',
|
|
|
|
output : 'config.h',
|
|
|
|
configuration : conf_data)
|
|
|
|
|
|
|
|
add_project_arguments('-imacros', meson.build_root() / 'config.h', language : 'c')
|
|
|
|
add_project_arguments('-DHAVE_CONFIG_H=1', language : 'c')
|
|
|
|
|
|
|
|
pkgconf_data = configuration_data()
|
|
|
|
pkgconf_data.set('PACKAGE_VERSION', meson.project_version())
|
|
|
|
pkgconf_data.set('prefix', get_option('prefix'))
|
|
|
|
pkgconf_data.set('exec_prefix', '${prefix}')
|
|
|
|
pkgconf_data.set('libdir', '${prefix}/' + get_option('libdir'))
|
|
|
|
pkgconf_data.set('includedir', '${prefix}/' + get_option('includedir'))
|
|
|
|
|
|
|
|
pkg_config = configure_file(input : 'virglrenderer.pc.in',
|
|
|
|
output : 'virglrenderer.pc',
|
|
|
|
configuration : pkgconf_data)
|
|
|
|
|
|
|
|
install_data(pkg_config,
|
|
|
|
install_dir: get_option('libdir') + '/pkgconfig')
|
|
|
|
|
|
|
|
inc_configuration = include_directories(['.', 'src'])
|
|
|
|
|
|
|
|
with_fuzzer = get_option('fuzzer')
|
|
|
|
with_tests = get_option('tests')
|
|
|
|
with_valgrind = get_option('valgrind')
|
|
|
|
|
|
|
|
subdir('src')
|
|
|
|
subdir('vtest')
|
|
|
|
|
|
|
|
if with_render_server
|
|
|
|
subdir('server')
|
|
|
|
endif
|
|
|
|
|
|
|
|
if with_tests
|
|
|
|
assert(have_egl, 'Tests require EGL, but it is not available')
|
|
|
|
subdir('tests')
|
|
|
|
endif
|
|
|
|
|
|
|
|
lines = [
|
|
|
|
'',
|
|
|
|
'prefix: ' + get_option('prefix'),
|
|
|
|
'libdir: ' + get_option('libdir'),
|
|
|
|
'',
|
|
|
|
'c_args: ' + (' ').join(get_option('c_args')),
|
|
|
|
'',
|
|
|
|
]
|
|
|
|
|
|
|
|
lines += 'egl: ' + (have_egl ? 'yes' : 'no')
|
|
|
|
lines += 'glx: ' + (have_glx ? 'yes' : 'no')
|
|
|
|
lines += ''
|
|
|
|
lines += 'minigbm_alloc: ' + (with_minigbm_allocation ? 'yes' : 'no' )
|
|
|
|
lines += ''
|
|
|
|
lines += 'venus: ' + (with_venus ? 'yes' : 'no' )
|
|
|
|
lines += ''
|
|
|
|
lines += 'render server: ' + (with_render_server ? 'yes' : 'no')
|
|
|
|
if with_render_server
|
|
|
|
lines += 'render server worker: ' + with_render_server_worker
|
|
|
|
endif
|
|
|
|
lines += ''
|
|
|
|
lines += 'tests: ' + (with_tests ? 'yes' : 'no' )
|
|
|
|
lines += 'fuzzer: ' + (with_fuzzer ? 'yes' : 'no' )
|
|
|
|
lines += 'tracing: ' + with_tracing
|
|
|
|
|
|
|
|
indent = ' '
|
|
|
|
summary = indent + ('\n' + indent).join(lines)
|
|
|
|
message('\n\nConfiguration summary:\n@0@\n'.format(summary))
|