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