############################################################################# # # 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))