summaryrefslogtreecommitdiffstats
path: root/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'meson.build')
-rw-r--r--meson.build418
1 files changed, 418 insertions, 0 deletions
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000000..0f5198bac72
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,418 @@
+# Copyright © 2017 Intel Corporation
+
+# 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('mesa', ['c', 'cpp'], version : '17.3.0-devel', license : 'MIT',
+ default_options : ['c_std=c99'])
+
+with_dri3 = true # XXX: need a switch for this
+with_vulkan_icd_dir = get_option('vulkan_icd_dir')
+with_tests = get_option('build-tests')
+with_valgrind = get_option('valgrind')
+
+# TODO: there are more platforms required for non-vulkan drivers
+with_platform_wayland = false
+with_platform_x11 = false
+_platforms = get_option('platforms')
+if _platforms != ''
+ _split = _platforms.split(',')
+ with_platform_x11 = _split.contains('x11')
+ with_platform_wayland = _split.contains('wayland')
+endif
+
+if with_vulkan_icd_dir == ''
+ with_vulkan_icd_dir = join_paths(get_option('datadir'), 'vulkan/icd.d')
+endif
+
+with_intel_vk = false
+with_amd_vk = false
+_vulkan_drivers = get_option('vulkan-drivers')
+if _vulkan_drivers != ''
+ _split = _vulkan_drivers.split(',')
+ with_intel_vk = _split.contains('intel')
+ with_amd_vk = _split.contains('amd')
+ if not (with_platform_x11 or with_platform_wayland)
+ error('Vulkan requires at least one platform (x11, wayland)')
+ endif
+endif
+
+prog_python2 = find_program('python2')
+
+cc = meson.get_compiler('c')
+if cc.get_id() == 'gcc' and cc.version().version_compare('< 4.4.6')
+ error('When using GCC version 4.2.0 or later required.')
+endif
+
+# Arguments for the preprocessor, put these in a separate array from the C and
+# C++ (cpp in meson terminology) arguments since they need to be added to the
+# default arguments for both C and C++.
+pre_args = ['-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS',
+ '-D__STDC_LIMIT_MACROS',
+ '-DVERSION="@0@"'.format(meson.project_version())]
+
+# Define DEBUG for debug and debugoptimized builds
+if get_option('buildtype').startswith('debug')
+ pre_args += '-DDEBUG'
+endif
+
+# Check for GCC style builtins
+foreach b : ['bswap32', 'bswap64', 'clz', 'clzll', 'ctz', 'expect', 'ffs',
+ 'ffsll', 'popcount', 'popcountll', 'unreachable']
+ if cc.has_function(b)
+ pre_args += '-DHAVE___BUILTIN_@0@'.format(b.to_upper())
+ endif
+endforeach
+
+# check for GCC __attribute__ s
+foreach a : ['const', 'flatten', 'malloc', 'pure', 'unused',
+ 'warn_unused_result', 'weak',]
+ if cc.compiles('int foo(void) __attribute__((@0@));'.format(a),
+ name : '__attribute__((@0@))'.format(a))
+ pre_args += '-DHAVE_FUNC_ATTRIBUTE_@0@'.format(a.to_upper())
+ endif
+endforeach
+if cc.compiles('int foo(const char *p, ...) __attribute__((format(printf, 1, 2)));',
+ name : '__attribute__((format(...)))')
+ pre_args += '-DHAVE_FUNC_ATTRIBUTE_FORMAT'
+endif
+if cc.compiles('struct __attribute__((packed)) foo { int bar; };',
+ name : '__attribute__((packed))')
+ pre_args += '-DHAVE_FUNC_ATTRIBUTE_PACKED'
+endif
+if cc.compiles('int *foo(void) __attribute__((returns_nonnull));',
+ name : '__attribute__((returns_nonnull))')
+ pre_args += '-DHAVE_FUNC_ATTRIBUTE_NONNULL'
+endif
+if cc.compiles('''int foo_def(void) __attribute__((visibility("default")));
+ int foo_hid(void) __attribute__((visibility("hidden")));
+ int foo_int(void) __attribute__((visibility("internal")));
+ int foo_pro(void) __attribute__((visibility("protected")));''',
+ name : '__attribute__((visibility(...)))')
+ pre_args += '-DHAVE_FUNC_ATTRIBUTE_VISBILITY'
+endif
+if cc.compiles('int foo(void) { return 0; } int bar(void) __attribute__((alias("foo")));',
+ name : '__attribute__((alias(...)))')
+ pre_args += '-DHAVE_FUNC_ATTRIBUTE_ALIAS'
+endif
+
+# TODO: this is very incomplete
+if host_machine.system() == 'linux'
+ pre_args += '-D_GNU_SOURCE'
+endif
+
+# Check for generic C arguments
+c_args = []
+foreach a : ['-Wall', '-Werror=implicit-function-declaration',
+ '-Werror=missing-prototypes', '-fno-math-errno',
+ '-fno-trapping-math', '-Qunused-arguments']
+ if cc.has_argument(a)
+ c_args += a
+ endif
+endforeach
+c_vis_args = []
+if cc.has_argument('-fvisibility=hidden')
+ c_vis_args += '-fvisibility=hidden'
+endif
+
+# Check for generic C++ arguments
+cpp = meson.get_compiler('cpp')
+cpp_args = []
+foreach a : ['-Wall', '-fno-math-errno', '-fno-trapping-math',
+ '-Qunused-arguments', '-Wno-non-virtual-dtor']
+ if cpp.has_argument(a)
+ cpp_args += a
+ endif
+endforeach
+cpp_vis_args = []
+if cpp.has_argument('-fvisibility=hidden')
+ cpp_vis_args += '-fvisibility=hidden'
+endif
+
+# Check for C and C++ arguments for MSVC2013 compatibility. These are only used
+# in parts of the mesa code base that need to compile with old versions of
+# MSVC, mainly common code
+c_msvc_compat_args = []
+cpp_msvc_compat_args = []
+foreach a : ['-Werror=pointer-arith', '-Werror=vla']
+ if cc.has_argument(a)
+ c_msvc_compat_args += a
+ endif
+ if cpp.has_argument(a)
+ cpp_msvc_compat_args += a
+ endif
+endforeach
+
+no_override_init_args = []
+foreach a : ['-Wno-override-init', '-Wno-initializer-overrides']
+ if cc.has_argument(a)
+ no_override_init_args += a
+ endif
+endforeach
+
+# TODO: SSE41 (which is only required for core mesa)
+
+# Check for GCC style atomics
+if cc.compiles('int main() { int n; return __atomic_load_n(&n, __ATOMIC_ACQUIRE); }',
+ name : 'GCC atomic builtins')
+ pre_args += '-DUSE_GCC_ATOMIC_BUILTINS'
+endif
+if not cc.links('''#include <stdint.h>
+ uint64_t v;
+ int main() {
+ return __sync_add_and_fetch(&v, (uint64_t)1);
+ }''',
+ name : 'GCC 64bit atomics')
+ pre_args += '-DMISSING_64_BIT_ATOMICS'
+endif
+
+# TODO: endian
+# TODO: powr8
+# TODO: shared/static? Is this even worth doing?
+
+# I don't think that I need to set any of the debug stuff, I think meson
+# handles that for us
+
+# TODO: ldflags
+
+# TODO: texture-float (gallium/mesa only)
+
+# TODO: cross-compiling. I don't think this is relavent to meson
+
+# TODO: assembly support. mesa and vc4
+
+# Check for standard headers and functions
+if cc.has_header_symbol('sys/sysmacros.h', 'major')
+ pre_args += '-DMAJOR_IN_SYSMACROS'
+elif cc.has_header_symbol('sys/mkdev.h', 'major')
+ pre_args += '-DMAJOR_IN_MKDEV'
+endif
+
+foreach h : ['xlocale.h', 'sys/sysctl.h']
+ if cc.has_header(h)
+ pre_args += '-DHAVE_@0@'.format(h.to_upper().underscorify())
+ endif
+endforeach
+
+foreach f : ['strtof', 'mkostemp', 'posix_memalign']
+ if cc.has_function(f)
+ pre_args += '-DHAVE_@0@'.format(f.to_upper())
+ endif
+endforeach
+
+# strtod locale support
+if cc.links('''
+ #define _GNU_SOURCE
+ #include <stdlib.h>
+ #include <locale.h>
+ #ifdef HAVE_XLOCALE_H
+ #include <xlocale.h>
+ #endif
+ int main() {
+ locale_t loc = newlocale(LC_CTYPE_MASK, "C", NULL);
+ const char *s = "1.0";
+ char *end;
+ double d = strtod_l(s, end, loc);
+ float f = strtod_l(s, end, loc);
+ freelocale(loc);
+ return 0;
+ }''',
+ extra_args : pre_args,
+ name : 'strtod has locale support')
+ pre_args += '-DHAVE_STRTOD_L'
+endif
+
+# Check for some linker flags
+ld_args_bsymbolic = []
+if cc.links('int main() { return 0; }', args : '-Wl,-Bsymbolic')
+ ld_args_bsymbolic += '-Wl,-Bsymbolic'
+endif
+ld_args_gc_sections = []
+if cc.links('static char unused() { return 5; } int main() { return 0; }',
+ args : '-Wl,--gc-sections')
+ ld_args_gc_sections += '-Wl,--gc-sections'
+endif
+
+# check for dl support
+if cc.has_function('dlopen')
+ dep_dl = []
+else
+ dep_dl = cc.find_library('dl')
+endif
+pre_args += '-DHAVE_DLOPEN'
+
+if not cc.has_function('dladdr', dependencies : dep_dl)
+ error('dl library doesn\'t have dladdr')
+endif
+
+if cc.has_function('dl_iterate_phdr')
+ pre_args += '-DHAVE_DL_ITERATE_PHDR'
+else
+ # TODO: this is required for vulkan
+endif
+
+# Determine whether or not the rt library is needed for time functions
+if cc.has_function('clock_gettime')
+ dep_clock = []
+else
+ dep_clock = cc.find_library('rt')
+endif
+
+# TODO: some of these may be conditional
+dep_zlib = dependency('zlib', version : '>= 1.2.3')
+dep_thread = dependency('threads')
+pre_args += '-DHAVE_PTHREAD'
+dep_elf = dependency('libelf')
+dep_expat = dependency('expat')
+# this only exists on linux so either this is linux and it will be found, or
+# its not linux and and wont
+dep_m = cc.find_library('m', required : false)
+
+# TODO: conditionalize libdrm requirement
+dep_libdrm = dependency('libdrm', version : '>= 2.4.75')
+pre_args += '-DHAVE_LIBDRM'
+
+# TODO: make this conditional
+dep_valgrind = dependency('valgrind', required : false)
+if dep_valgrind.found() and with_valgrind
+ pre_args += '-DHAVE_VALGRIND'
+endif
+
+# pthread stubs. Lets not and say we didn't
+
+# TODO: selinux
+
+# TODO: llvm-prefix and llvm-shared-libs
+
+# TODO: llvm dependency (that's all native now, yay!)
+
+# TODO: unwind (llvm [radeon, gallivm] and gallium)
+
+# TODO: flags for opengl, gles, dri
+
+# TODO: gallium-hud
+
+# TODO: glx provider
+
+# TODO: osmesa provider
+
+# TODO: flags for xa, egl, gbm, nin, xvmc, vdpau, omx, va, opencl,
+# gallium-tests,
+
+# TODO: gallium drivers
+
+# TODO: libglvnd
+
+# TODO: symbol mangling
+
+# TODO: dri handling
+
+# TODO: shared-glapi
+
+# TODO: libgl requirements
+
+# TODO: GLX configuration
+
+# TODO: egl configuration
+
+if with_platform_wayland
+ prog_wl_scanner = find_program('wayland-scanner')
+ dep_wl_protocols = dependency('wayland-protocols', version : '>= 1.8')
+ dep_wayland_client = dependency('wayland-client', version : '>=1.11')
+ dep_wayland_server = dependency('wayland-server', version : '>=1.11')
+else
+ prog_wl_scanner = []
+ dep_wl_protocols = []
+ dep_wayland_client = []
+ dep_wayland_server = []
+endif
+
+dep_xcb_dri2 = []
+dep_xcb_dri3 = []
+if with_platform_x11
+ dep_xcb_dri2 = [
+ dependency('x11-xcb'),
+ dependency('xcb'),
+ dependency('xcb-dri2', version : '>= 1.8'),
+ dependency('xcb-xfixes'),
+ ]
+ if with_dri3
+ dep_xcb_dri3 = [
+ dep_xcb_dri2,
+ dependency('xcb-dri3'),
+ dependency('xcb-present'),
+ dependency('xcb-sync'),
+ dependency('xshmfence', version : '>= 1.1'),
+ ]
+ else
+ # TODO: dri3 is required for vulkan
+ endif
+endif
+
+# TODO: platforms for !vulkan
+
+# TODO: dri paths
+
+# TODO: dri drivers
+
+# TODO: osmesa
+
+# TODO: egl
+
+# TODO: xa
+
+# TODO: vallium G3DVL
+
+# TODO: nine
+
+# TODO: clover
+
+# TODO: egl sans x11
+
+# TODO: xvmc
+
+# TODO: gallium tests
+
+# TODO: various libdirs
+
+# TODO: swr
+
+# TODO: gallium driver dirs
+
+# FIXME: this is a workaround for #2326
+prog_touch = find_program('touch')
+dummy_cpp = custom_target(
+ 'dummy_cpp',
+ output : 'dummy.cpp',
+ command : [prog_touch, '@OUTPUT@'],
+)
+
+foreach a : pre_args
+ add_project_arguments(a, language : ['c', 'cpp'])
+endforeach
+foreach a : c_args
+ add_project_arguments(a, language : ['c'])
+endforeach
+foreach a : cpp_args
+ add_project_arguments(a, language : ['cpp'])
+endforeach
+
+inc_include = include_directories('include')
+
+subdir('include')
+subdir('src')