Many versions enforced with this changeset are chosen such as to support Ubuntu/Noble (24.04) and otherwise use versions reasonably close to Debian-Trixie (≙reference-platform) Since we now require a fairly modern compiler for C++23, I have added now an explicit version check, which however is performed only if the defined compiler is named `g++*` Furthermore, I combed through all of our build tutorials and documentation pages and updated a lot of information regarding dependencies and build practices...
130 lines
4.6 KiB
Python
130 lines
4.6 KiB
Python
# coding: utf-8
|
||
##
|
||
## Setup.py - SCons build: setup, definitions and compiler flags
|
||
##
|
||
|
||
# Copyright (C)
|
||
# 2012-2025 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.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(4,0)
|
||
EnsurePythonVersion(3,10)
|
||
Decider('content-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 compile 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 ]"
|
||
|
||
|
||
|