The Lumiera »Reference Platform« is now upgraded to Debian/Buster, which provides GCC-14 and Clang-20. Thus the compiler support for C++20 language features seems solid enough, and C++23, while still in ''experimental stage'' can be seen as a complement and addendum. This changeset * upgrades the compile switches for the build system * provides all the necessary adjustments to keep the code base compilable Notable changes: * λ-capture by value now requires explicit qualification how to handle `this` * comparison operators are now handled transparently by the core language, largely obsoleting boost::operators. This change incurs several changes to implicit handling rules and causes lots of ambiguities — which typically pinpoint some long standing design issues, especially related to MObjects and the ''time entities''. Most tweaks done here can be ''considered preliminary'' * unfortunately the upgraded standard ''fails'' to handle **tuple-like** entities in a satisfactory way — rather an ''exposition-only'' concept is introduced, which applies solely to some containers from the STL, thereby breaking some very crucial code in the render entities, which was built upon the notion of ''tuple-like'' entities and the ''tuple protocol''. The solution is to abandon the STL in this respect and **provide an alternative implementation** of the `apply` function and related elements.
131 lines
4.8 KiB
Python
131 lines
4.8 KiB
Python
# coding: utf-8
|
||
##
|
||
## Setup.py - SCons build: setup, definitions and compiler flags
|
||
##
|
||
|
||
# Copyright (C)
|
||
# 2012, Hermann Vosseler <Ichthyostega@web.de>
|
||
#
|
||
# **Lumiera** is free software; you can redistribute it and/or modify it
|
||
# under the terms of the GNU General Public License as published by the
|
||
# Free Software Foundation; either version 2 of the License, or (at your
|
||
# option) any later version. See the file COPYING for further details.
|
||
#####################################################################
|
||
|
||
from SCons.Script import EnsurePythonVersion, EnsureSConsVersion, Variables, Decider
|
||
|
||
from LumieraEnvironment import *
|
||
from Buildhelper import *
|
||
import Options
|
||
|
||
|
||
|
||
#-------------------------------------------------------Configuration
|
||
TARGDIR = 'target'
|
||
VERSION = '0.pre.03'
|
||
TOOLDIR = './admin/scons' # SCons plugins
|
||
OPTCACHE = 'optcache'
|
||
CUSTOPTFILE = 'custom-options'
|
||
|
||
# these are accessible via env.path.xxxx
|
||
buildExe = '#$TARGDIR'
|
||
buildLib = '#$TARGDIR/modules'
|
||
buildPlug = '#$TARGDIR/modules'
|
||
buildIcon = '#$TARGDIR/gui/icons' # for IconResource() and IconRender()
|
||
buildUIRes = '#$TARGDIR/gui/' # for GuiResource()
|
||
buildConf = '#$TARGDIR/config' # for ConfigData()
|
||
installExe = '#$DESTDIR/lib/lumiera'
|
||
installLib = '#$DESTDIR/lib/lumiera/modules'
|
||
installPlug = '#$DESTDIR/lib/lumiera/modules'
|
||
installIcon = '#$DESTDIR/share/lumiera/icons'
|
||
installUIRes = '#$DESTDIR/share/lumiera/'
|
||
installConf = '#$DESTDIR/lib/lumiera/config'
|
||
|
||
#-------------------------------------------------------Configuration
|
||
buildSetup = Record(locals())
|
||
|
||
|
||
|
||
|
||
|
||
def defineBuildEnvironment():
|
||
""" create a custom build environment,
|
||
define the basic compiler and linker flags,
|
||
define locations in source and target tree,
|
||
parse the commandline and pick up options
|
||
"""
|
||
EnsureSConsVersion(2,0)
|
||
EnsurePythonVersion(2,6)
|
||
Decider('MD5-timestamp') # detect changed files by timestamp, then do a MD5
|
||
|
||
buildVars = Variables([OPTCACHE, CUSTOPTFILE])
|
||
Options.defineCmdlineVariables(buildVars)
|
||
env = LumieraEnvironment(buildSetup, buildVars)
|
||
|
||
env.Replace( CPPPATH =["#src"] # used to find includes, "#" means always absolute to build-root
|
||
, CPPDEFINES=['LUMIERA_VERSION='+VERSION ] # note: it's a list to append further defines
|
||
, CCFLAGS='-Wall -Wextra -Wformat-security'
|
||
, CXXFLAGS='-std=gnu++23 -Wno-enum-compare'
|
||
, CFLAGS='-std=gnu99'
|
||
)
|
||
env.Append(LINKFLAGS='-Wl,--no-undefined') # require every dependency is given on link, in the right order
|
||
env.Append(LINKFLAGS='-Wl,--as-needed') # by default only link against dependencies actually needed to resolve symbols
|
||
handleVerboseMessages(env)
|
||
handleNoBugSwitches(env)
|
||
|
||
env.Append(CPPDEFINES = '_GNU_SOURCE')
|
||
appendCppDefine(env,'DEBUG','DEBUG', 'NDEBUG')
|
||
# appendCppDefine(env,'OPENGL','USE_OPENGL')
|
||
appendVal(env,'ARCHFLAGS','CCFLAGS') # for both C and C++
|
||
appendVal(env,'OPTIMIZE', 'CCFLAGS', val=' -O3')
|
||
appendVal(env,'DEBUG', 'CCFLAGS', val=' -ggdb')
|
||
|
||
# setup search path for Lumiera plugins
|
||
appendCppDefine(env,'PKGLIBDIR','LUMIERA_PLUGIN_PATH=\\"$PKGLIBDIR/:ORIGIN/modules\\"'
|
||
,'LUMIERA_PLUGIN_PATH=\\"ORIGIN/modules\\"')
|
||
appendCppDefine(env,'PKGDATADIR','LUMIERA_CONFIG_PATH=\\"$PKGLIBDIR/:.\\"'
|
||
,'LUMIERA_CONFIG_PATH=\\"$DESTDIR/share/lumiera/:.\\"')
|
||
|
||
Options.prepareOptionsHelp(buildVars,env)
|
||
buildVars.Save(OPTCACHE, env)
|
||
return env
|
||
|
||
|
||
|
||
def appendCppDefine(env,var,cppVar, elseVal=''):
|
||
if env[var]:
|
||
env.Append(CPPDEFINES = env.subst(cppVar) )
|
||
elif elseVal:
|
||
env.Append(CPPDEFINES = env.subst(elseVal))
|
||
|
||
def appendVal(env,var,targetVar,val=None):
|
||
if env[var]:
|
||
env.Append( **{targetVar: env.subst(val) or env[var]})
|
||
|
||
|
||
def handleNoBugSwitches(env):
|
||
""" set the build level for NoBug.
|
||
Release builds imply no DEBUG
|
||
whereas ALPHA and BETA require DEBUG
|
||
"""
|
||
level = env['BUILDLEVEL']
|
||
if level in ['ALPHA', 'BETA']:
|
||
if not env['DEBUG']:
|
||
print('Warning: NoBug ALPHA or BETA builds requires DEBUG=yes, switching DEBUG on!')
|
||
env.Replace( DEBUG = 1 )
|
||
env.Append(CPPDEFINES = 'EBUG_'+level)
|
||
elif level == 'RELEASE':
|
||
env.Replace( DEBUG = 0 )
|
||
|
||
|
||
def handleVerboseMessages(env):
|
||
""" toggle verbose build output """
|
||
if not env['VERBOSE']:
|
||
# SetOption('silent', True)
|
||
env['CCCOMSTR'] = env['SHCCCOMSTR'] = " Compiling $SOURCE"
|
||
env['CXXCOMSTR'] = env['SHCXXCOMSTR'] = " Compiling++ $SOURCE"
|
||
env['LINKCOMSTR'] = " Linking --> $TARGET"
|
||
env['LDMODULECOMSTR'] = " creating module [ $TARGET ]"
|
||
|
||
|
||
|