| project('libepoxy', 'c', version: '1.4.3', |
| 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 |
| |
| enable_egl = get_option('enable-egl') |
| if enable_egl == 'auto' |
| if host_system == 'windows' |
| build_egl = false |
| elif host_system == 'darwin' |
| build_egl = false |
| elif host_system == 'android' |
| build_egl = true |
| else |
| build_egl = true |
| endif |
| elif enable_egl == 'yes' |
| build_egl = true |
| elif enable_egl == 'no' |
| build_egl = 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_apple = false |
| build_wgl = true |
| has_znow = true |
| elif host_system == 'darwin' |
| build_apple = true |
| build_wgl = false |
| has_znow = false |
| else |
| build_apple = false |
| build_wgl = false |
| has_znow = true |
| endif |
| |
| conf.set10('ENABLE_GLX', build_glx) |
| conf.set10('ENABLE_EGL', build_egl) |
| |
| # 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) |
| conf.set('EPOXY_PUBLIC', '__declspec(dllexport) extern') |
| if cc.get_id() != 'msvc' |
| 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 |