# coding: utf-8 ## ## Setup.py - SCons build: setup, definitions and compiler flags ## # Copyright (C) # 2012-2025 Hermann Vosseler # # **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.04~rc.1' 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' installDoc = '$DESTDIR/share/doc/lumiera/' #-------------------------------------------------------Configuration buildSetup = Record(locals()) # passed to LumieraEnvironment() -> env.path.xxxx 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') # NOTE: could define optional copile features here.... 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 ]"