summaryrefslogtreecommitdiff
path: root/meson.build
diff options
context:
space:
mode:
Diffstat (limited to 'meson.build')
-rw-r--r--meson.build257
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