diff options
Diffstat (limited to 'meson.build')
-rw-r--r-- | meson.build | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..77b9d06 --- /dev/null +++ b/meson.build @@ -0,0 +1,257 @@ +project('libepoxy', 'c', version: '1.4.2', + default_options: [ + 'buildtype=debugoptimized', + 'c_std=gnu99', + 'warning_level=1', + ], + license: 'MIT', + meson_version: '>= 0.39.1') + +epoxy_version = meson.project_version().split('.') +epoxy_major_version = epoxy_version[0].to_int() +epoxy_minor_version = epoxy_version[1].to_int() +epoxy_micro_version = epoxy_version[2].to_int() + +epoxy_prefix = get_option('prefix') +epoxy_libdir = join_paths(epoxy_prefix, get_option('libdir')) +epoxy_datadir = join_paths(epoxy_prefix, get_option('datadir')) +epoxy_includedir = join_paths(epoxy_prefix, get_option('includedir')) + +cc = meson.get_compiler('c') +host_system = host_machine.system() + +conf = configuration_data() +conf.set_quoted('PACKAGE_NAME', meson.project_name()) +conf.set_quoted('PACKAGE_VERSION', meson.project_version()) +conf.set_quoted('PACKAGE_STRING', '@0@-@1@'.format(meson.project_name(), meson.project_version())) +conf.set_quoted('PACKAGE_DATADIR', join_paths(get_option('prefix'), get_option('datadir'))) +conf.set_quoted('PACKAGE_LIBDIR', join_paths(get_option('prefix'), get_option('libdir'))) +conf.set_quoted('PACKAGE_LOCALEDIR', join_paths(get_option('prefix'), get_option('datadir'), 'locale')) +conf.set_quoted('PACKAGE_LIBEXECDIR', join_paths(get_option('prefix'), get_option('libexecdir'))) +conf.set('HAVE_KHRPLATFORM_H', cc.has_header('KHR/khrplatform.h', required: false)) + +# GLX can be used on different platforms, so we expose a +# configure time switch to enable or disable it; in case +# the "auto" default value is set, we only enable GLX +# support on Linux and Unix +enable_glx = get_option('enable-glx') +if enable_glx == 'auto' + if host_system == 'windows' + build_glx = false + elif host_system == 'darwin' + build_glx = false + elif host_system == 'android' + build_glx = false + elif host_system == 'haiku' + build_glx = false + else + build_glx = true + endif +elif enable_glx == 'yes' + build_glx = true +elif enable_glx == 'no' + build_glx = false +endif + +# The remaining platform specific API for GL/GLES are enabled +# depending on the platform we're building for +if host_system == 'windows' + build_egl = false + build_apple = false + build_wgl = true + has_znow = true +elif host_system == 'darwin' + build_egl = false + build_apple = true + build_wgl = false + has_znow = false +else + build_egl = true + build_apple = false + build_wgl = false + has_znow = true +endif + +conf.set10('ENABLE_GLX', build_glx) + +# Compiler flags, taken from the Xorg macros +if cc.get_id() == 'msvc' + # Compiler options taken from msvc_recommended_pragmas.h + # in GLib, based on _Win32_Programming_ by Rector and Newcomer + test_cflags = [ + '-we4002', # too many actual parameters for macro + '-we4003', # not enough actual parameters for macro + '-w14010', # single-line comment contains line-continuation character + '-we4013', # 'function' undefined; assuming extern returning int + '-w14016', # no function return type; using int as default + '-we4020', # too many actual parameters + '-we4021', # too few actual parameters + '-we4027', # function declared without formal parameter list + '-we4029', # declared formal parameter list different from definition + '-we4033', # 'function' must return a value + '-we4035', # 'function' : no return value + '-we4045', # array bounds overflow + '-we4047', # different levels of indirection + '-we4049', # terminating line number emission + '-we4053', # an expression of type void was used as an operand + '-we4071', # no function prototype given + '-we4819', # the file contains a character that cannot be represented in the current code page + ] +elif cc.get_id() == 'gcc' or cc.get_id() == 'clang' + test_cflags = [ + '-Wpointer-arith', + '-Wmissing-declarations', + '-Wformat=2', + '-Wstrict-prototypes', + '-Wmissing-prototypes', + '-Wnested-externs', + '-Wbad-function-cast', + '-Wold-style-definition', + '-Wdeclaration-after-statement', + '-Wunused', + '-Wuninitialized', + '-Wshadow', + '-Wmissing-noreturn', + '-Wmissing-format-attribute', + '-Wredundant-decls', + '-Wlogical-op', + '-Werror=implicit', + '-Werror=nonnull', + '-Werror=init-self', + '-Werror=main', + '-Werror=missing-braces', + '-Werror=sequence-point', + '-Werror=return-type', + '-Werror=trigraphs', + '-Werror=array-bounds', + '-Werror=write-strings', + '-Werror=address', + '-Werror=int-to-pointer-cast', + '-Werror=pointer-to-int-cast', + '-fno-strict-aliasing', + '-Wno-int-conversion', + ] +else + test_cflags = [] +endif + +common_cflags = [] +foreach cflag: test_cflags + if cc.has_argument(cflag) + common_cflags += [ cflag ] + endif +endforeach + +libtype = get_option('default_library') + +# Visibility compiler flags; we only use this for shared libraries +if libtype == 'shared' + visibility_cflags = [] + if host_system == 'windows' + conf.set('DLL_EXPORT', true) + if cc.get_id() == 'msvc' + conf.set('EPOXY_PUBLIC', '__declspec(dllexport) extern') + else + conf.set('EPOXY_PUBLIC', '__attribute__((visibility("default"))) __declspec(dllexport) extern') + visibility_cflags += [ '-fvisibility=hidden' ] + endif + else + conf.set('EPOXY_PUBLIC', '__attribute__((visibility("default"))) extern') + visibility_cflags += [ '-fvisibility=hidden' ] + endif +endif + +# The inline keyword is available only for C++ in MSVC. +# So we need to use Microsoft specific __inline. +if host_system == 'windows' + if cc.get_id() == 'msvc' + conf.set('inline', '__inline') + endif +endif + +# Dependencies +dl_dep = cc.find_library('dl', required: false) +gl_dep = dependency('gl', required: false) +egl_dep = dependency('egl', required: false) + +# Optional dependencies for tests +x11_dep = dependency('x11', required: false) + +# GLES v2 and v1 may have pkg-config files, courtesy of downstream +# packagers; let's check those first, and fall back to find_library() +# if we fail +gles2_dep = dependency('glesv2', required: false) +if not gles2_dep.found() + gles2_dep = cc.find_library('libGLESv2', required: false) +endif + +gles1_dep = dependency('glesv1_cm', required: false) +if not gles1_dep.found() + gles1_dep = cc.find_library('libGLESv1_CM', required: false) +endif + +# On windows, the DLL has to have all of its functions +# resolved at link time, so we have to link directly aginst +# opengl32. But that's the only GL provider, anyway. +if host_system == 'windows' + opengl32_dep = cc.find_library('opengl32', required: true) + + # When building against static libraries, we need to control + # the order of the dependencies, and gdi32 provides symbols + # needed when using opengl32, like SetPixelFormat and + # ChoosePixelFormat. This is mostly a workaround for older + # versions of Meson. + gdi32_dep = cc.find_library('gdi32', required: true) +endif + +# PkgConfig file +pkgconf = configuration_data() +pkgconf.set('prefix', epoxy_prefix) +pkgconf.set('exec_prefix', epoxy_prefix) +pkgconf.set('libdir', epoxy_libdir) +pkgconf.set('includedir', epoxy_includedir) +pkgconf.set10('epoxy_has_glx', build_glx) +pkgconf.set10('epoxy_has_egl', build_egl) +pkgconf.set10('epoxy_has_wgl', build_wgl) +pkgconf.set('PACKAGE_VERSION', meson.project_version()) +if dl_dep.found() + pkgconf.set('DLOPEN_LIBS', '-ldl') +endif + +configure_file(input: 'epoxy.pc.in', + output: 'epoxy.pc', + configuration: pkgconf, + install: true, + install_dir: join_paths(epoxy_libdir, 'pkgconfig')) + +# Python +python = import('python3').find_python() +if not python.found() + python = find_program('python', required: true) +endif + +# Generates the dispatch tables +gen_dispatch_py = files('src/gen_dispatch.py') + +gl_registry = files('registry/gl.xml') +egl_registry = files('registry/egl.xml') +glx_registry = files('registry/glx.xml') +wgl_registry = files('registry/wgl.xml') + +libepoxy_inc = [ + include_directories('include'), + include_directories('src'), +] + +subdir('include/epoxy') +subdir('src') +subdir('test') + +if get_option('enable-docs') + doxygen = find_program('doxygen', required: false) + if doxygen.found() + subdir('doc') + else + message('Documentation disabled without doxygen') + endif +endif |