pandemonium_engine/platform/frt/detect.py

200 lines
5.5 KiB
Python
Raw Normal View History

import os
import sys
import version
if version.major > 2:
yes = True
no = False
else:
yes = 'yes'
no = 'no'
def has_wrapper_for(lib):
if version.major == 2:
return False
if version.minor > 2:
return True
return False
def is_active():
return True
def get_name():
return 'FRT'
def can_build():
if os.name != 'posix':
return False
return True
def get_opts():
if version.major > 2:
from SCons.Variables import BoolVariable
else:
def BoolVariable(a,b,c): return (a,b,c)
return [
('frt_arch', 'Architecture (no/arm32v6/arm32v7/arm64v8)', 'no'),
('frt_cross', 'Cross compilation (no/auto/<triple>)', 'no'),
BoolVariable('use_llvm', 'Use llvm compiler', no),
BoolVariable('use_lto', 'Use link time optimization', no),
BoolVariable('use_static_cpp', 'Link libgcc and libstdc++ statically', yes),
BoolVariable('pulseaudio', 'Detect and use pulseaudio', yes),
]
def get_flags():
return [
('tools', no),
]
def check(env, key):
if not (key in env):
return False
if version.major > 2:
return env[key]
else:
return env[key] == 'yes'
def configure(env):
import methods
env.Append(CPPPATH=['#platform/frt'])
if check(env, 'use_llvm'):
if 'clang++' not in env['CXX']:
env['CC'] = 'clang'
env['CXX'] = 'clang++'
env['LD'] = 'clang++'
2022-03-27 13:48:18 +02:00
env.Append(CPPFLAGS=['-DTYPED_METHOD_BIND'])
env.extra_suffix += '.llvm'
if check(env, 'use_lto'):
if check(env, 'use_llvm'):
env.Append(CCFLAGS=['-flto=thin'])
env.Append(LINKFLAGS=['-fuse-ld=lld', '-flto=thin'])
env['AR'] = 'llvm-ar'
env['RANLIB'] = 'llvm-ranlib'
else:
env.Append(CCFLAGS=['-flto'])
env.Append(LINKFLAGS=['-flto'])
2022-03-27 13:48:18 +02:00
env.extra_suffix += '.lto'
if env['frt_cross'] != 'no':
if env['frt_cross'] == 'auto':
triple = {
'arm32v7': 'arm-linux-gnueabihf',
'arm64v8': 'aarch64-linux-gnu',
}[env['frt_arch']]
else:
triple = env['frt_cross']
if check(env, 'use_llvm'):
env.Append(CCFLAGS=['-target', triple])
env.Append(LINKFLAGS=['-target', triple])
else:
env['CC'] = triple + '-gcc'
env['CXX'] = triple + '-g++'
pkg_config = triple + '-pkg-config'
else:
pkg_config = 'pkg-config'
env.Append(CCFLAGS=['-pipe'])
env.Append(LINKFLAGS=['-pipe'])
if os.system(pkg_config + ' --exists alsa') == 0:
print('Enabling ALSA')
env.Append(CPPFLAGS=['-DALSA_ENABLED'])
if has_wrapper_for('alsa'):
env['alsa'] = True
else:
env.ParseConfig(pkg_config + ' alsa --cflags --libs')
else:
print('ALSA libraries not found, disabling driver')
if check(env, 'pulseaudio'):
if os.system(pkg_config + ' --exists libpulse') == 0:
print('Enabling PulseAudio')
env.Append(CPPDEFINES=['PULSEAUDIO_ENABLED'])
if version.major == 2:
env.ParseConfig(pkg_config + ' --cflags --libs libpulse-simple')
elif has_wrapper_for('libpulse'):
env.ParseConfig(pkg_config + ' --cflags libpulse')
else:
env.ParseConfig(pkg_config + ' --cflags --libs libpulse')
else:
print('PulseAudio libraries not found, disabling driver')
# pkg-config returns 0 when the lib exists...
found_udev = not os.system(pkg_config + ' --exists libudev')
if found_udev:
print('Enabling udev support')
env.Append(CPPFLAGS=['-DUDEV_ENABLED'])
if has_wrapper_for('udev'):
env.Append(FRT_MODULES=['include/libudev-so_wrap.c'])
else:
env.ParseConfig(pkg_config + ' libudev --cflags --libs')
env.Append(CPPFLAGS=['-DJOYDEV_ENABLED'])
env.Append(FRT_MODULES=['include/joypad_linux.cpp'])
else:
print('libudev development libraries not found, disabling udev support')
if env['target'] == 'release':
env.Append(CCFLAGS=['-O3', '-fomit-frame-pointer'])
elif env['target'] == 'release_debug':
env.Append(CCFLAGS=['-O3', '-DDEBUG_ENABLED'])
elif env['target'] == 'debug':
env.Append(CCFLAGS=['-g2', '-DDEBUG_ENABLED', '-DDEBUG_MEMORY_ENABLED'])
if env['target'].startswith('release'):
if version.major == 2 or (version.major == 3 and version.minor == 0):
env.Append(CCFLAGS=['-ffast-math'])
if env['frt_arch'] == 'arm32v6':
env.Append(CCFLAGS=['-march=armv6', '-mfpu=vfp', '-mfloat-abi=hard'])
env.extra_suffix += '.arm32v6'
elif env['frt_arch'] == 'arm32v7':
env.Append(CCFLAGS=['-march=armv7-a', '-mfpu=neon-vfpv4', '-mfloat-abi=hard'])
env.extra_suffix += '.arm32v7'
elif env['frt_arch'] == 'arm64v8':
env.Append(CCFLAGS=['-march=armv8-a'])
env.extra_suffix += '.arm64v8'
env.Append(CFLAGS=['-std=gnu11']) # for libwebp (maybe more in the future)
env.Append(CPPFLAGS=['-DFRT_ENABLED', '-DUNIX_ENABLED', '-DGLES2_ENABLED', '-DGLES_ENABLED'])
env.Append(LIBS=['pthread'])
if env['frt_arch'] == 'arm32v6' and version.major == 3 and version.minor >= 4: # TODO find out exact combination
env.Append(LIBS=['atomic'])
env.Append(FRT_MODULES=['envprobe.cpp'])
env.Append(FRT_MODULES=['video_fbdev.cpp', 'keyboard_linux_input.cpp', 'mouse_linux_input.cpp'])
env.Append(FRT_MODULES=['video_x11.cpp', 'keyboard_x11.cpp', 'mouse_x11.cpp'])
2022-03-27 13:48:18 +02:00
env.Append(FRT_MODULES=['import/key_mapping_x11_3.cpp'])
env.Append(FRT_MODULES=['dl/x11.gen.cpp', 'dl/egl.gen.cpp'])
if os.path.isfile('/opt/vc/include/bcm_host.h'):
env.Append(FRT_MODULES=['video_bcm.cpp', 'dl/bcm.gen.cpp'])
if os.path.isfile('/usr/include/gbm.h'):
env.Append(FRT_MODULES=['video_kmsdrm.cpp', 'dl/gbm.gen.cpp', 'dl/drm.gen.cpp'])
2022-03-27 13:48:18 +02:00
env.Append(FRT_MODULES=['dl/gles2.gen.cpp'])
2022-03-27 13:48:18 +02:00
env.Append(LIBS=['dl'])