blob: bbe7a77dd50f12e9f250b0f119f4675f1ac530d8 [file] [log] [blame]
# Detect a Windows build.
is_win = 'WIN32' in ' '.join(bld.env.keys())
# Detect MSVC
is_msvc = bld.env.CXX_NAME == 'msvc'
all_sources = bld.path.ant_glob('*.cpp scene-ideas/*.cc scene-terrain/*.cpp')
common_sources = [f for f in all_sources if f.name.find('canvas-') == -1 and
f.name.find('android') == -1 and
f.name.find('native-state-') == -1 and
f.name.find('gl-state-') == -1 and
f.name.find('main.cpp') == -1]
common_defines = ['USE_EXCEPTIONS']
libmatrix_sources = [f for f in bld.path.ant_glob('libmatrix/*.cc')
if not f.name.endswith('test.cc')]
common_flavor_sources = ['main.cpp', 'canvas-generic.cpp']
libpng_local_sources = [f for f in bld.path.ant_glob('libpng/*.c')]
zlib_local_sources = [f for f in bld.path.ant_glob('zlib/*.c')]
# Some c sources in libjpeg-turbo are included like headers. So we cannot use globs.
libjpeg_local_sources = [
'jcapimin', 'jcapistd', 'jccoefct', 'jccolor', 'jcdctmgr', 'jchuff', 'jcinit',
'jcmainct', 'jcmarker', 'jcmaster', 'jcomapi', 'jcparam', 'jcphuff', 'jcprepct',
'jcsample', 'jdapimin', 'jdapistd', 'jdatadst', 'jdatasrc', 'jdcoefct', 'jdcolor',
'jddctmgr', 'jdhuff', 'jdinput', 'jdmainct', 'jdmarker', 'jdmaster', 'jdmerge',
'jdphuff', 'jdpostct', 'jdsample', 'jerror', 'jfdctflt', 'jfdctfst', 'jfdctint',
'jidctflt', 'jidctfst', 'jidctint', 'jidctred', 'jmemmgr', 'jmemnobs', 'jquant1',
'jquant2', 'jsimd_none', 'jutils',
]
libjpeg_turbo_local_sources = ['libjpeg-turbo/%s.c' % f for f in libjpeg_local_sources]
platform_includes = []
platform_libs = []
platform_uselibs = []
if is_win:
platform_uselibs += ['libpng-local', 'zlib-local', 'libjpeg-turbo-local']
platform_libs = ['user32']
# On windows include some overrides for posix headers.
if is_msvc:
platform_includes += ['include']
else:
platform_uselibs += ['libpng']
platform_libs = ['m', 'jpeg', 'dl']
if 'WAYLAND_SCANNER_wayland_scanner' in bld.env.keys():
def wayland_scanner_cmd(arg, src):
return '%s %s < %s > ${TGT}' % (bld.env['WAYLAND_SCANNER_wayland_scanner'], arg, src)
def wayland_proto_src_path(proto, ver):
wp_dir = bld.env['WAYLAND_PROTOCOLS_pkgdatadir']
if ver == 'stable':
return '%s/stable/%s/%s.xml' % (wp_dir, proto, proto)
else:
return '%s/unstable/%s/%s-unstable-%s.xml' % (wp_dir, proto, proto, ver)
def wayland_client_protocol(proto, ver, dst_base):
src_path = wayland_proto_src_path(proto, ver)
out = '%s-client-protocol.h' % dst_base
return bld(rule = wayland_scanner_cmd('client-header', src_path),
target = out,
name = out,
ext_out = ['.h'])
def wayland_protocol_code(proto, ver, dst_base):
src_path = wayland_proto_src_path(proto, ver)
out = '%s-protocol.c' % dst_base
return bld(rule = wayland_scanner_cmd('private-code', src_path),
target = out,
name = out)
wayland_client_protocol('xdg-shell', 'stable', 'xdg-shell')
wayland_protocol_code('xdg-shell', 'stable', 'xdg-shell')
flavor_sources = {
'dispmanx-glesv2' : common_flavor_sources + ['native-state-dispmanx.cpp', 'gl-state-egl.cpp'],
'drm-gl' : common_flavor_sources + ['native-state-drm.cpp', 'gl-state-egl.cpp'],
'drm-glesv2' : common_flavor_sources + ['native-state-drm.cpp', 'gl-state-egl.cpp'],
'mir-gl' : common_flavor_sources + ['native-state-mir.cpp', 'gl-state-egl.cpp'],
'mir-glesv2' : common_flavor_sources + ['native-state-mir.cpp', 'gl-state-egl.cpp'],
'wayland-gl' : common_flavor_sources + ['native-state-wayland.cpp', 'gl-state-egl.cpp'],
'wayland-glesv2' : common_flavor_sources + ['native-state-wayland.cpp', 'gl-state-egl.cpp'],
'win32-gl': common_flavor_sources + ['native-state-win32.cpp', 'gl-state-wgl.cpp'],
'win32-glesv2': common_flavor_sources + ['native-state-win32.cpp', 'gl-state-egl.cpp'],
'x11-gl' : common_flavor_sources + ['native-state-x11.cpp', 'gl-state-glx.cpp'],
'x11-glesv2' : common_flavor_sources + ['native-state-x11.cpp', 'gl-state-egl.cpp'],
}
flavor_uselibs = {
'dispmanx-glesv2' : ['glad-egl-dispmanx', 'glad-glesv2', 'matrix-glesv2', 'common-glesv2', 'dispmanx'],
'drm-gl' : ['drm', 'gbm', 'udev', 'glad-egl-drm', 'glad-gl', 'matrix-gl', 'common-gl'],
'drm-glesv2' : ['drm', 'gbm', 'udev', 'glad-egl-drm', 'glad-glesv2', 'matrix-glesv2', 'common-glesv2'],
'mir-gl' : ['mirclient', 'glad-egl-mir', 'glad-gl', 'matrix-gl', 'common-gl'],
'mir-glesv2' : ['mirclient', 'glad-egl-mir', 'glad-glesv2', 'matrix-glesv2', 'common-glesv2'],
'wayland-gl' : ['wayland-client', 'wayland-egl', 'glad-egl-wayland', 'glad-gl', 'matrix-gl', 'common-gl'],
'wayland-glesv2' : ['wayland-client', 'wayland-egl', 'glad-egl-wayland', 'glad-glesv2', 'matrix-glesv2', 'common-glesv2'],
'win32-gl': ['glad-gl', 'glad-wgl', 'matrix-gl', 'common-gl'],
'win32-glesv2': ['glad-egl-win32', 'glad-glesv2', 'matrix-glesv2', 'common-glesv2'],
'x11-gl' : ['x11', 'glad-gl', 'glad-glx', 'matrix-gl', 'common-gl'],
'x11-glesv2' : ['x11', 'glad-egl-x11', 'glad-glesv2', 'matrix-glesv2', 'common-glesv2'],
}
flavor_defines = {
'dispmanx-glesv2' : ['GLMARK2_USE_DISPMANX', 'GLMARK2_USE_GLESv2', 'GLMARK2_USE_EGL'],
'drm-gl' : ['GLMARK2_USE_DRM', 'GLMARK2_USE_GL', 'GLMARK2_USE_EGL'],
'drm-glesv2' : ['GLMARK2_USE_DRM', 'GLMARK2_USE_GLESv2', 'GLMARK2_USE_EGL'],
'mir-gl' : ['GLMARK2_USE_MIR', 'GLMARK2_USE_GL', 'GLMARK2_USE_EGL'],
'mir-glesv2' : ['GLMARK2_USE_MIR', 'GLMARK2_USE_GLESv2', 'GLMARK2_USE_EGL'],
'wayland-gl' : ['GLMARK2_USE_WAYLAND', 'GLMARK2_USE_GL', 'GLMARK2_USE_EGL'],
'wayland-glesv2' : ['GLMARK2_USE_WAYLAND', 'GLMARK2_USE_GLESv2', 'GLMARK2_USE_EGL'],
'win32-gl': ['GLMARK2_USE_WIN32', 'GLMARK2_USE_WGL', 'GLMARK2_USE_GL'],
'win32-glesv2': ['GLMARK2_USE_WIN32', 'GLMARK2_USE_GLESv2', 'GLMARK2_USE_EGL'],
'x11-gl' : ['GLMARK2_USE_X11', 'GLMARK2_USE_GL', 'GLMARK2_USE_GLX'],
'x11-glesv2' : ['GLMARK2_USE_X11', 'GLMARK2_USE_GLESv2', 'GLMARK2_USE_EGL'],
}
flavor_libs = {
'dispmanx-glesv2' : [],
'drm-gl' : [],
'drm-glesv2' : [],
'mir-gl' : [],
'mir-glesv2' : [],
'wayland-gl' : [],
'wayland-glesv2' : [],
'win32-gl': ['opengl32', 'gdi32'],
'win32-glesv2' : [],
'x11-gl' : [],
'x11-glesv2' : [],
}
flavor_depends_on = {
'dispmanx-glesv2' : [],
'drm-gl' : [],
'drm-glesv2' : [],
'mir-gl' : [],
'mir-glesv2' : [],
'wayland-gl' : ['xdg-shell-client-protocol.h', 'xdg-shell-protocol.c'],
'wayland-glesv2' : ['xdg-shell-client-protocol.h', 'xdg-shell-protocol.c'],
'win32-gl': [],
'win32-glesv2' : [],
'x11-gl' : [],
'x11-glesv2' : [],
}
flavor_sources_gen = {
'dispmanx-glesv2' : [],
'drm-gl' : [],
'drm-glesv2' : [],
'mir-gl' : [],
'mir-glesv2' : [],
'wayland-gl' : [bld.path.find_or_declare('xdg-shell-protocol.c')],
'wayland-glesv2' : [bld.path.find_or_declare('xdg-shell-protocol.c')],
'win32-gl': [],
'win32-glesv2' : [],
'x11-gl' : [],
'x11-glesv2' : [],
}
egl_platform_defines = {
'dispmanx' : ['MESA_EGL_NO_X11_HEADERS'],
'drm' : ['__GBM__'],
'mir' : ['MESA_EGL_NO_X11_HEADERS'],
'wayland' : ['WL_EGL_PLATFORM'],
'win32' : [],
'x11' : [],
}
includes = ['.', 'scene-ideas', 'scene-terrain'] + platform_includes
all_uselibs = set()
for name in bld.env.keys():
if name.startswith('FLAVOR_') and bld.env[name]:
flavor = name.replace('FLAVOR_', '').lower().replace('_', '-')
egl_platform = flavor.split('-')[0]
target = bld.env[name]
node = bld(
features = ['cxx', 'cprogram'],
source = flavor_sources[flavor],
target = target,
use = platform_uselibs + flavor_uselibs[flavor],
lib = platform_libs + flavor_libs[flavor],
includes = ['.'] + platform_includes,
defines = common_defines + flavor_defines[flavor] +
egl_platform_defines[egl_platform],
depends_on = flavor_depends_on[flavor]
)
if flavor_sources_gen[flavor]:
node.source.extend(flavor_sources_gen[flavor])
all_uselibs |= set(flavor_uselibs[flavor] + platform_uselibs)
# Build glad-egl for all used EGL platforms
for egl_target in (v for v in all_uselibs if v.startswith('glad-egl')):
egl_platform = egl_target.split('-')[2]
bld(
features = ['c'],
source = ['glad/src/egl.c'],
target = egl_target,
includes = ['glad/include'],
export_includes = 'glad/include',
defines = egl_platform_defines[egl_platform]
)
if 'glad-glx' in all_uselibs:
bld(
features = ['c'],
source = ['glad/src/glx.c'],
target = 'glad-glx',
includes = ['glad/include'],
export_includes = 'glad/include'
)
if 'glad-gl' in all_uselibs:
bld(
features = ['c'],
source = ['glad/src/gl.c'],
target = 'glad-gl',
includes = ['glad/include'],
export_includes = 'glad/include'
)
if 'glad-wgl' in all_uselibs:
bld(
features = ['c'],
source = ['glad/src/wgl.c'],
target = 'glad-wgl',
includes = ['glad/include'],
export_includes = 'glad/include'
)
if 'glad-glesv2' in all_uselibs:
bld(
features = ['c'],
source = ['glad/src/gles2.c'],
target = 'glad-glesv2',
includes = ['glad/include'],
export_includes = 'glad/include'
)
if 'matrix-gl' in all_uselibs:
bld(
features = ['cxx', 'cxxstlib'],
source = libmatrix_sources,
target = 'matrix-gl',
use = ['glad-gl'],
lib = ['m'],
includes = ['.'] + platform_includes,
export_includes = 'libmatrix',
defines = ['GLMARK2_USE_GL', 'USE_EXCEPTIONS']
)
if 'matrix-glesv2' in all_uselibs:
bld(
features = ['cxx', 'cxxstlib'],
source = libmatrix_sources,
target = 'matrix-glesv2',
use = ['glad-glesv2'],
lib = ['m'],
includes = ['.'] + platform_includes,
export_includes = 'libmatrix',
defines = ['GLMARK2_USE_GLESv2', 'USE_EXCEPTIONS']
)
if 'libpng-local' in all_uselibs:
bld(
features = ['c'],
source = libpng_local_sources,
target = 'libpng-local',
use = ['zlib-local'],
export_includes = 'libpng'
)
if 'zlib-local' in all_uselibs:
bld(
features = ['c'],
source = zlib_local_sources,
target = 'zlib-local',
export_includes = 'zlib'
)
if 'libjpeg-turbo-local' in all_uselibs:
bld(
features = ['c'],
source = libjpeg_turbo_local_sources,
target = 'libjpeg-turbo-local',
export_includes = 'libjpeg-turbo'
)
if 'common-gl' in all_uselibs:
bld(
features = ['cxx', 'cxxstlib'],
source = common_sources,
target = 'common-gl',
use = platform_uselibs + ['glad-gl', 'matrix-gl'],
lib = ['m', 'jpeg', 'dl'],
includes = includes,
defines = ['GLMARK2_USE_GL', 'USE_EXCEPTIONS']
)
if 'common-glesv2' in all_uselibs:
bld(
features = ['cxx', 'cxxstlib'],
source = common_sources,
target = 'common-glesv2',
use = platform_uselibs + ['glad-glesv2', 'matrix-glesv2'],
lib = ['m', 'jpeg', 'dl'],
includes = includes,
defines = ['GLMARK2_USE_GLESv2', 'USE_EXCEPTIONS']
)