Merge: change building to create modules
includes DistCC and CCache support, LUMIERA_PLUGIN_PATH and LUMIERA_CONFIG_PATH non-verbose build messages
This commit is contained in:
commit
f6209d99d3
30 changed files with 753 additions and 437 deletions
97
SConstruct
97
SConstruct
|
|
@ -27,6 +27,7 @@ OPTIONSCACHEFILE = 'optcache'
|
||||||
CUSTOPTIONSFILE = 'custom-options'
|
CUSTOPTIONSFILE = 'custom-options'
|
||||||
SRCDIR = 'src'
|
SRCDIR = 'src'
|
||||||
BINDIR = 'bin'
|
BINDIR = 'bin'
|
||||||
|
LIBDIR = '.libs'
|
||||||
TESTDIR = 'tests'
|
TESTDIR = 'tests'
|
||||||
ICONDIR = 'icons'
|
ICONDIR = 'icons'
|
||||||
VERSION = '0.1+pre.01'
|
VERSION = '0.1+pre.01'
|
||||||
|
|
@ -63,26 +64,37 @@ def setupBasicEnvironment():
|
||||||
,toolpath = [TOOLDIR]
|
,toolpath = [TOOLDIR]
|
||||||
,tools = ["default", "BuilderGCH", "BuilderDoxygen"]
|
,tools = ["default", "BuilderGCH", "BuilderDoxygen"]
|
||||||
)
|
)
|
||||||
|
env.Tool("ToolDistCC")
|
||||||
|
env.Tool("ToolCCache")
|
||||||
|
handleVerboseMessages(env)
|
||||||
|
|
||||||
env.Append ( CCCOM=' -std=gnu99') # workaround for a bug: CCCOM currently doesn't honor CFLAGS, only CCFLAGS
|
env.Append ( CCCOM=' -std=gnu99')
|
||||||
|
env.Append ( SHCCCOM=' -std=gnu99') # workaround for a bug: CCCOM currently doesn't honour CFLAGS, only CCFLAGS
|
||||||
env.Replace( VERSION=VERSION
|
env.Replace( VERSION=VERSION
|
||||||
, SRCDIR=SRCDIR
|
, SRCDIR=SRCDIR
|
||||||
, BINDIR=BINDIR
|
, BINDIR=BINDIR
|
||||||
|
, LIBDIR=LIBDIR
|
||||||
, ICONDIR=ICONDIR
|
, ICONDIR=ICONDIR
|
||||||
, CPPPATH=["#"+SRCDIR] # used to find includes, "#" means always absolute to build-root
|
, CPPPATH=["#"+SRCDIR] # used to find includes, "#" means always absolute to build-root
|
||||||
, CPPDEFINES=['-DLUMIERA_VERSION='+VERSION ] # note: it's a list to append further defines
|
, CPPDEFINES=['-DLUMIERA_VERSION='+VERSION ] # note: it's a list to append further defines
|
||||||
, CCFLAGS='-Wall ' # -fdiagnostics-show-option
|
, CCFLAGS='-Wall ' # -fdiagnostics-show-option
|
||||||
|
, CFLAGS='-std=gnu99'
|
||||||
)
|
)
|
||||||
|
|
||||||
RegisterIcon_Builder(env,SVGRENDERER)
|
RegisterIcon_Builder(env,SVGRENDERER)
|
||||||
handleNoBugSwitches(env)
|
handleNoBugSwitches(env)
|
||||||
|
|
||||||
env.Append(CPPDEFINES = '_GNU_SOURCE')
|
env.Append(CPPDEFINES = '_GNU_SOURCE')
|
||||||
appendCppDefine(env,'DEBUG','DEBUG', 'NDEBUG')
|
appendCppDefine(env,'DEBUG','DEBUG', 'NDEBUG')
|
||||||
# appendCppDefine(env,'OPENGL','USE_OPENGL')
|
# appendCppDefine(env,'OPENGL','USE_OPENGL')
|
||||||
appendVal(env,'ARCHFLAGS', 'CCFLAGS') # for both C and C++
|
appendVal(env,'ARCHFLAGS','CCFLAGS') # for both C and C++
|
||||||
appendVal(env,'OPTIMIZE', 'CCFLAGS', val=' -O3')
|
appendVal(env,'OPTIMIZE', 'CCFLAGS', val=' -O3')
|
||||||
appendVal(env,'DEBUG', 'CCFLAGS', val=' -ggdb')
|
appendVal(env,'DEBUG', 'CCFLAGS', val=' -ggdb')
|
||||||
|
|
||||||
|
# setup search path for Lumiera plugins
|
||||||
|
appendCppDefine(env,'PKGLIBDIR','LUMIERA_PLUGIN_PATH=\\"$PKGLIBDIR\\"'
|
||||||
|
,'LUMIERA_PLUGIN_PATH=\\"$DESTDIR/lib/lumiera\\"')
|
||||||
|
appendCppDefine(env,'PKGDATADIR','LUMIERA_CONFIG_PATH=\\"$PKGLIBDIR\\"'
|
||||||
|
,'LUMIERA_CONFIG_PATH=\\"$DESTDIR/share/lumiera\\"')
|
||||||
|
|
||||||
prepareOptionsHelp(opts,env)
|
prepareOptionsHelp(opts,env)
|
||||||
opts.Save(OPTIONSCACHEFILE, env)
|
opts.Save(OPTIONSCACHEFILE, env)
|
||||||
|
|
@ -90,13 +102,13 @@ def setupBasicEnvironment():
|
||||||
|
|
||||||
def appendCppDefine(env,var,cppVar, elseVal=''):
|
def appendCppDefine(env,var,cppVar, elseVal=''):
|
||||||
if env[var]:
|
if env[var]:
|
||||||
env.Append(CPPDEFINES = cppVar )
|
env.Append(CPPDEFINES = env.subst(cppVar) )
|
||||||
elif elseVal:
|
elif elseVal:
|
||||||
env.Append(CPPDEFINES = elseVal)
|
env.Append(CPPDEFINES = env.subst(elseVal))
|
||||||
|
|
||||||
def appendVal(env,var,targetVar,val=None):
|
def appendVal(env,var,targetVar,val=None):
|
||||||
if env[var]:
|
if env[var]:
|
||||||
env.Append( **{targetVar: val or env[var]})
|
env.Append( **{targetVar: env.subst(val) or env[var]})
|
||||||
|
|
||||||
|
|
||||||
def handleNoBugSwitches(env):
|
def handleNoBugSwitches(env):
|
||||||
|
|
@ -113,6 +125,15 @@ def handleNoBugSwitches(env):
|
||||||
elif level == 'RELEASE':
|
elif level == 'RELEASE':
|
||||||
env.Replace( DEBUG = 0 )
|
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 ]"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -123,19 +144,26 @@ def defineCmdlineOptions():
|
||||||
"""
|
"""
|
||||||
opts = Options([OPTIONSCACHEFILE, CUSTOPTIONSFILE])
|
opts = Options([OPTIONSCACHEFILE, CUSTOPTIONSFILE])
|
||||||
opts.AddOptions(
|
opts.AddOptions(
|
||||||
('ARCHFLAGS', 'Set architecture-specific compilation flags (passed literally to gcc)','')
|
('ARCHFLAGS', 'Set architecture-specific compilation flags (passed literally to gcc)','')
|
||||||
|
,('CC', 'Set the C compiler to use.', 'gcc')
|
||||||
|
,('CXX', 'Set the C++ compiler to use.', 'g++')
|
||||||
|
,PathOption('CCACHE', 'Integrate with CCache', '', PathOption.PathAccept)
|
||||||
|
,PathOption('DISTCC', 'Invoke C/C++ compiler commands through DistCC', '', PathOption.PathAccept)
|
||||||
,EnumOption('BUILDLEVEL', 'NoBug build level for debugging', 'ALPHA',
|
,EnumOption('BUILDLEVEL', 'NoBug build level for debugging', 'ALPHA',
|
||||||
allowed_values=('ALPHA', 'BETA', 'RELEASE'))
|
allowed_values=('ALPHA', 'BETA', 'RELEASE'))
|
||||||
,BoolOption('DEBUG', 'Build with debugging information and no optimizations', False)
|
,BoolOption('DEBUG', 'Build with debugging information and no optimisations', False)
|
||||||
,BoolOption('OPTIMIZE', 'Build with strong optimization (-O3)', False)
|
,BoolOption('OPTIMIZE', 'Build with strong optimisation (-O3)', False)
|
||||||
,BoolOption('VALGRIND', 'Run Testsuite under valgrind control', True)
|
,BoolOption('VALGRIND', 'Run Testsuite under valgrind control', True)
|
||||||
|
,BoolOption('VERBOSE', 'Print full build commands', False)
|
||||||
,('TESTSUITES', 'Run only Testsuites matching the given pattern', '')
|
,('TESTSUITES', 'Run only Testsuites matching the given pattern', '')
|
||||||
# ,BoolOption('OPENGL', 'Include support for OpenGL preview rendering', False)
|
# ,BoolOption('OPENGL', 'Include support for OpenGL preview rendering', False)
|
||||||
# ,EnumOption('DIST_TARGET', 'Build target architecture', 'auto',
|
# ,EnumOption('DIST_TARGET', 'Build target architecture', 'auto',
|
||||||
# allowed_values=('auto', 'i386', 'i686', 'x86_64' ), ignorecase=2)
|
# allowed_values=('auto', 'i386', 'i686', 'x86_64' ), ignorecase=2)
|
||||||
,PathOption('DESTDIR', 'Installation dir prefix', '/usr/local')
|
,PathOption('DESTDIR', 'Installation dir prefix', '/usr/local')
|
||||||
|
,PathOption('PKGLIBDIR', 'Installation dir for plugins, defaults to DESTDIR/lib/lumiera', '',PathOption.PathAccept)
|
||||||
|
,PathOption('PKGDATADIR', 'Installation dir for default config, usually DESTDIR/share/lumiera', '',PathOption.PathAccept)
|
||||||
,PathOption('SRCTAR', 'Create source tarball prior to compiling', '..', PathOption.PathAccept)
|
,PathOption('SRCTAR', 'Create source tarball prior to compiling', '..', PathOption.PathAccept)
|
||||||
,PathOption('DOCTAR', 'Create tarball with dev documentaionl', '..', PathOption.PathAccept)
|
,PathOption('DOCTAR', 'Create tarball with developer documentation', '..', PathOption.PathAccept)
|
||||||
)
|
)
|
||||||
|
|
||||||
return opts
|
return opts
|
||||||
|
|
@ -153,7 +181,7 @@ Special Targets:
|
||||||
build : just compile and link
|
build : just compile and link
|
||||||
testcode: additionally compile the Testsuite
|
testcode: additionally compile the Testsuite
|
||||||
check : build and run the Testsuite
|
check : build and run the Testsuite
|
||||||
doc : generate documetation (Doxygen)
|
doc : generate documentation (Doxygen)
|
||||||
install : install created artifacts at PREFIX
|
install : install created artifacts at PREFIX
|
||||||
src.tar : create source tarball
|
src.tar : create source tarball
|
||||||
doc.tar : create developer doc tarball
|
doc.tar : create developer doc tarball
|
||||||
|
|
@ -215,7 +243,6 @@ def configurePlatform(env):
|
||||||
if not conf.CheckLibWithHeader('boost_regex-mt','boost/regex.hpp','C++'):
|
if not conf.CheckLibWithHeader('boost_regex-mt','boost/regex.hpp','C++'):
|
||||||
problems.append('We need the boost regular expression lib (incl. binary lib for linking).')
|
problems.append('We need the boost regular expression lib (incl. binary lib for linking).')
|
||||||
|
|
||||||
# if not conf.CheckLibWithHeader('gavl', ['gavlconfig.h', 'gavl/gavl.h'], 'C'):
|
|
||||||
|
|
||||||
if not conf.CheckPkgConfig('gavl', 1.0):
|
if not conf.CheckPkgConfig('gavl', 1.0):
|
||||||
problems.append('Did not find Gmerlin Audio Video Lib [http://gmerlin.sourceforge.net/gavl.html].')
|
problems.append('Did not find Gmerlin Audio Video Lib [http://gmerlin.sourceforge.net/gavl.html].')
|
||||||
|
|
@ -232,13 +259,16 @@ def configurePlatform(env):
|
||||||
problems.append('Unable to configure Cairo--, exiting.')
|
problems.append('Unable to configure Cairo--, exiting.')
|
||||||
|
|
||||||
if not conf.CheckPkgConfig('gdl-1.0', '0.6.1'):
|
if not conf.CheckPkgConfig('gdl-1.0', '0.6.1'):
|
||||||
problems.append('Unable to configure the GNOME DevTool Library, exiting.')
|
problems.append('Unable to configure the GNOME DevTool Library.')
|
||||||
|
|
||||||
if not conf.CheckPkgConfig('librsvg-2.0', '2.18.1'):
|
if not conf.CheckPkgConfig('librsvg-2.0', '2.18.1'):
|
||||||
problems.append('Need rsvg Library for rendering icons.')
|
problems.append('Need rsvg Library for rendering icons.')
|
||||||
|
|
||||||
if not conf.CheckPkgConfig('xv'): problems.append('Need lib xv')
|
if not conf.CheckCHeader(['X11/Xutil.h', 'X11/Xlib.h'],'<>'):
|
||||||
# if not conf.CheckPkgConfig('xext'): Exit(1)
|
problems.append('Xlib.h and Xutil.h required. Please install libx11-dev.')
|
||||||
|
|
||||||
|
if not conf.CheckPkgConfig('xv') : problems.append('Need libXv...')
|
||||||
|
if not conf.CheckPkgConfig('xext'): problems.append('Need libXext.')
|
||||||
# if not conf.CheckPkgConfig('sm'): Exit(1)
|
# if not conf.CheckPkgConfig('sm'): Exit(1)
|
||||||
#
|
#
|
||||||
# obviously not needed?
|
# obviously not needed?
|
||||||
|
|
@ -287,23 +317,27 @@ def defineBuildTargets(env, artifacts):
|
||||||
# + env.PrecompiledHeader('$SRCDIR/pre_a.hpp')
|
# + env.PrecompiledHeader('$SRCDIR/pre_a.hpp')
|
||||||
# )
|
# )
|
||||||
|
|
||||||
objback = srcSubtree(env,'$SRCDIR/backend')
|
objapp = srcSubtree(env,'$SRCDIR/common')
|
||||||
objproc = srcSubtree(env,'$SRCDIR/proc')
|
objback = srcSubtree(env,'$SRCDIR/backend')
|
||||||
objlib = ( srcSubtree(env,'$SRCDIR/common')
|
objproc = srcSubtree(env,'$SRCDIR/proc')
|
||||||
+ srcSubtree(env,'$SRCDIR/lib')
|
objlib = srcSubtree(env,'$SRCDIR/lib')
|
||||||
)
|
|
||||||
objplug = srcSubtree(env,'$SRCDIR/plugin', isShared=True)
|
core = ( env.SharedLibrary('$LIBDIR/lumieracommon', objapp)
|
||||||
core = ( env.StaticLibrary('$BINDIR/lumiback.la', objback)
|
+ env.SharedLibrary('$LIBDIR/lumierabackend', objback)
|
||||||
+ env.StaticLibrary('$BINDIR/lumiproc.la', objproc)
|
+ env.SharedLibrary('$LIBDIR/lumieraproc', objproc)
|
||||||
+ env.StaticLibrary('$BINDIR/lumiera.la', objlib)
|
+ env.SharedLibrary('$LIBDIR/lumiera', objlib)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
artifacts['lumiera'] = env.Program('$BINDIR/lumiera', ['$SRCDIR/lumiera/main.cpp'], LIBS=core)
|
||||||
|
artifacts['corelib'] = core
|
||||||
|
|
||||||
|
|
||||||
|
artifacts['plugins'] = [] # currently none
|
||||||
|
|
||||||
artifacts['lumiera'] = env.Program('$BINDIR/lumiera', ['$SRCDIR/main.cpp']+ core )
|
|
||||||
artifacts['plugins'] = env.SharedLibrary('$BINDIR/lumiera-plugin', objplug)
|
|
||||||
|
|
||||||
# the Lumiera GTK GUI
|
# the Lumiera GTK GUI
|
||||||
envgtk = env.Clone().mergeConf(['gtkmm-2.4','cairomm-1.0','gdl-1.0','librsvg-2.0','xv','xext','sm'])
|
envgtk = env.Clone().mergeConf(['gtkmm-2.4','cairomm-1.0','gdl-1.0','librsvg-2.0','xv','xext','sm'])
|
||||||
|
envgtk.Append(CPPDEFINES='LUMIERA_PLUGIN', LIBS=core)
|
||||||
objgui = srcSubtree(envgtk,'$SRCDIR/gui')
|
objgui = srcSubtree(envgtk,'$SRCDIR/gui')
|
||||||
|
|
||||||
# render and install Icons
|
# render and install Icons
|
||||||
|
|
@ -313,7 +347,9 @@ def defineBuildTargets(env, artifacts):
|
||||||
+ [env.IconCopy(f) for f in scanSubtree(prerendered_icon_dir, ['*.png'])]
|
+ [env.IconCopy(f) for f in scanSubtree(prerendered_icon_dir, ['*.png'])]
|
||||||
)
|
)
|
||||||
|
|
||||||
artifacts['lumigui'] = ( envgtk.Program('$BINDIR/lumigui', objgui + core)
|
guimodule = envgtk.LoadableModule('$LIBDIR/gtk_gui', objgui, SHLIBPREFIX='', SHLIBSUFFIX='.lum')
|
||||||
|
artifacts['lumigui'] = ( guimodule
|
||||||
|
+ envgtk.Program('$BINDIR/lumigui', objgui )
|
||||||
+ env.Install('$BINDIR', env.Glob('$SRCDIR/gui/*.rc'))
|
+ env.Install('$BINDIR', env.Glob('$SRCDIR/gui/*.rc'))
|
||||||
+ artifacts['icons']
|
+ artifacts['icons']
|
||||||
)
|
)
|
||||||
|
|
@ -349,6 +385,7 @@ def defineInstallTargets(env, artifacts):
|
||||||
""" define some artifacts to be installed into target locations.
|
""" define some artifacts to be installed into target locations.
|
||||||
"""
|
"""
|
||||||
env.Install(dir = '$DESTDIR/bin', source=artifacts['lumiera'])
|
env.Install(dir = '$DESTDIR/bin', source=artifacts['lumiera'])
|
||||||
|
env.Install(dir = '$DESTDIR/lib', source=artifacts['corelib'])
|
||||||
env.Install(dir = '$DESTDIR/lib', source=artifacts['plugins'])
|
env.Install(dir = '$DESTDIR/lib', source=artifacts['plugins'])
|
||||||
env.Install(dir = '$DESTDIR/bin', source=artifacts['tools'])
|
env.Install(dir = '$DESTDIR/bin', source=artifacts['tools'])
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ Import('env','envgtk','artifacts','core')
|
||||||
vgsuppr = env.Program('#$BINDIR/vgsuppression',['vgsuppression.c']+core)
|
vgsuppr = env.Program('#$BINDIR/vgsuppression',['vgsuppression.c']+core)
|
||||||
rsvg = envgtk.Program('#$BINDIR/rsvg-convert','rsvg-convert.c')
|
rsvg = envgtk.Program('#$BINDIR/rsvg-convert','rsvg-convert.c')
|
||||||
|
|
||||||
artifacts['tools'] += [ vgsuppr ## for supressing false valgrind alarms
|
artifacts['tools'] += [ vgsuppr ## for suppressing false valgrind alarms
|
||||||
+ rsvg ## for rendering SVG icons (uses librsvg)
|
+ rsvg ## for rendering SVG icons (uses librsvg)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# gnu-indent -- call the "indent" tool with parameters suitable for GNU coding style
|
|
||||||
#
|
|
||||||
indent -nbad -bap -nbc -bbo -bl -bli2 -bls -ncdb -nce -cp1 -cs -di2 -ndj -nfc1 -nfca -hnl -i2 -ip5 -lp -pcs -psl -nsc -nsob $@
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
|
#
|
||||||
# render-icons.py - Icon rendering utility script
|
# render-icons.py - Icon rendering utility script
|
||||||
#
|
#
|
||||||
# Copyright (C) Lumiera.org
|
# Copyright (C) Lumiera.org
|
||||||
|
|
@ -20,9 +20,10 @@
|
||||||
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
import os
|
||||||
|
import os.path as Path
|
||||||
import getopt
|
import getopt
|
||||||
from xml.dom import minidom
|
from xml.dom import minidom
|
||||||
import os
|
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
#svgDir = "svg"
|
#svgDir = "svg"
|
||||||
|
|
@ -32,14 +33,20 @@ rsvgPath = "./rsvg-convert"
|
||||||
artworkLayerPrefix = "artwork:"
|
artworkLayerPrefix = "artwork:"
|
||||||
|
|
||||||
def createDirectory( name ):
|
def createDirectory( name ):
|
||||||
if os.path.exists(name) == False:
|
if Path.isfile(name):
|
||||||
|
print "WARNING: moving %s to %s.bak because it's in the way." % (name,name)
|
||||||
|
bak_name = name + ".bak"
|
||||||
|
if Path.isfile(bak_name):
|
||||||
|
os.remove(bak_name)
|
||||||
|
os.rename(name,bak_name)
|
||||||
|
if not Path.isdir(name):
|
||||||
os.mkdir(name)
|
os.mkdir(name)
|
||||||
|
|
||||||
def copyMergeDirectory( src, dst ):
|
def copyMergeDirectory( src, dst ):
|
||||||
listing = os.listdir(src)
|
listing = os.listdir(src)
|
||||||
for file_name in listing:
|
for file_name in listing:
|
||||||
src_file_path = os.path.join(src, file_name)
|
src_file_path = Path.join(src, file_name)
|
||||||
dst_file_path = os.path.join(dst, file_name)
|
dst_file_path = Path.join(dst, file_name)
|
||||||
shutil.copyfile(src_file_path, dst_file_path)
|
shutil.copyfile(src_file_path, dst_file_path)
|
||||||
|
|
||||||
def getDocumentSize( svg_element ):
|
def getDocumentSize( svg_element ):
|
||||||
|
|
@ -99,7 +106,7 @@ def renderSvgInkscape(file_path, out_dir, artwork_name, rectangle, doc_size):
|
||||||
"-a %g:%g:%g:%g" % (x1, y1, x2, y2),
|
"-a %g:%g:%g:%g" % (x1, y1, x2, y2),
|
||||||
"-w %g" % (rectangle[2]), "-h %g" % (rectangle[3]),
|
"-w %g" % (rectangle[2]), "-h %g" % (rectangle[3]),
|
||||||
"--export-png=" + os.path.join(out_dir, "%gx%g/%s.png" % (rectangle[2], rectangle[3], artwork_name)))
|
"--export-png=" + os.path.join(out_dir, "%gx%g/%s.png" % (rectangle[2], rectangle[3], artwork_name)))
|
||||||
|
|
||||||
def renderSvgRsvg(file_path, out_dir, artwork_name, rectangle, doc_size):
|
def renderSvgRsvg(file_path, out_dir, artwork_name, rectangle, doc_size):
|
||||||
# Prepare a Cairo context
|
# Prepare a Cairo context
|
||||||
width = int(rectangle[2])
|
width = int(rectangle[2])
|
||||||
|
|
@ -154,19 +161,23 @@ def parseArguments(argv):
|
||||||
def main(argv):
|
def main(argv):
|
||||||
in_path, out_dir = parseArguments(argv)
|
in_path, out_dir = parseArguments(argv)
|
||||||
|
|
||||||
if in_path == None or out_dir == None:
|
if not (in_path and out_dir):
|
||||||
return
|
print "Missing arguments in_path and out_dir."
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
if os.path.exists(out_dir) == False:
|
if Path.isfile(out_dir):
|
||||||
print "Directory not found: " + out_dir
|
print "Unable to use '%s' as output directory, because it\'s a file." % out_dir
|
||||||
return
|
sys.exit(1)
|
||||||
|
if not Path.isdir(out_dir):
|
||||||
|
print "Output directory '%s' not found." % out_dir
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
# Create the icons folders
|
# Create the icons folders
|
||||||
createDirectory(os.path.join(out_dir, "48x48"))
|
createDirectory(Path.join(out_dir, "48x48"))
|
||||||
createDirectory(os.path.join(out_dir, "32x32"))
|
createDirectory(Path.join(out_dir, "32x32"))
|
||||||
createDirectory(os.path.join(out_dir, "24x24"))
|
createDirectory(Path.join(out_dir, "24x24"))
|
||||||
createDirectory(os.path.join(out_dir, "22x22"))
|
createDirectory(Path.join(out_dir, "22x22"))
|
||||||
createDirectory(os.path.join(out_dir, "16x16"))
|
createDirectory(Path.join(out_dir, "16x16"))
|
||||||
|
|
||||||
renderSvgIcon(in_path, out_dir)
|
renderSvgIcon(in_path, out_dir)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <locale.h>
|
||||||
|
|
||||||
#include <librsvg-2/librsvg/rsvg.h>
|
#include <librsvg-2/librsvg/rsvg.h>
|
||||||
#include <librsvg-2/librsvg/rsvg-cairo.h>
|
#include <librsvg-2/librsvg/rsvg-cairo.h>
|
||||||
|
|
@ -71,7 +72,7 @@ static void
|
||||||
display_error (GError * err)
|
display_error (GError * err)
|
||||||
{
|
{
|
||||||
if (err) {
|
if (err) {
|
||||||
g_print ("%s", err->message);
|
g_print ("%s\n", err->message);
|
||||||
g_error_free (err);
|
g_error_free (err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -87,8 +88,9 @@ rsvg_cairo_size_callback (int *width, int *height, gpointer data)
|
||||||
static cairo_status_t
|
static cairo_status_t
|
||||||
rsvg_cairo_write_func (void *closure, const unsigned char *data, unsigned int length)
|
rsvg_cairo_write_func (void *closure, const unsigned char *data, unsigned int length)
|
||||||
{
|
{
|
||||||
fwrite (data, 1, length, (FILE *) closure);
|
if (fwrite (data, 1, length, (FILE *) closure) == length)
|
||||||
return CAIRO_STATUS_SUCCESS;
|
return CAIRO_STATUS_SUCCESS;
|
||||||
|
return CAIRO_STATUS_WRITE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
@ -124,6 +126,9 @@ main (int argc, char **argv)
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Set the locale so that UTF-8 filenames work */
|
||||||
|
setlocale(LC_ALL, "");
|
||||||
|
|
||||||
g_thread_init(NULL);
|
g_thread_init(NULL);
|
||||||
|
|
||||||
g_option_context = g_option_context_new (_("- SVG Converter"));
|
g_option_context = g_option_context_new (_("- SVG Converter"));
|
||||||
|
|
|
||||||
|
|
@ -33,198 +33,197 @@ from fnmatch import fnmatch
|
||||||
|
|
||||||
|
|
||||||
def DoxyfileParse(file_contents):
|
def DoxyfileParse(file_contents):
|
||||||
"""
|
""" Parse a Doxygen source file and return a dictionary of all the values.
|
||||||
Parse a Doxygen source file and return a dictionary of all the values.
|
Values will be strings and lists of strings.
|
||||||
Values will be strings and lists of strings.
|
"""
|
||||||
"""
|
data = {}
|
||||||
data = {}
|
|
||||||
|
import shlex
|
||||||
import shlex
|
lex = shlex.shlex(instream = file_contents, posix = True)
|
||||||
lex = shlex.shlex(instream = file_contents, posix = True)
|
lex.wordchars += "*+./-:"
|
||||||
lex.wordchars += "*+./-:"
|
lex.whitespace = lex.whitespace.replace("\n", "")
|
||||||
lex.whitespace = lex.whitespace.replace("\n", "")
|
lex.escape = ""
|
||||||
lex.escape = ""
|
|
||||||
|
lineno = lex.lineno
|
||||||
lineno = lex.lineno
|
token = lex.get_token()
|
||||||
token = lex.get_token()
|
key = token # the first token should be a key
|
||||||
key = token # the first token should be a key
|
last_token = ""
|
||||||
last_token = ""
|
key_token = False
|
||||||
key_token = False
|
next_key = False
|
||||||
next_key = False
|
new_data = True
|
||||||
new_data = True
|
|
||||||
|
def append_data(data, key, new_data, token):
|
||||||
def append_data(data, key, new_data, token):
|
if new_data or len(data[key]) == 0:
|
||||||
if new_data or len(data[key]) == 0:
|
data[key].append(token)
|
||||||
data[key].append(token)
|
else:
|
||||||
else:
|
data[key][-1] += token
|
||||||
data[key][-1] += token
|
|
||||||
|
while token:
|
||||||
while token:
|
if token in ['\n']:
|
||||||
if token in ['\n']:
|
if last_token not in ['\\']:
|
||||||
if last_token not in ['\\']:
|
key_token = True
|
||||||
key_token = True
|
elif token in ['\\']:
|
||||||
elif token in ['\\']:
|
pass
|
||||||
pass
|
elif key_token:
|
||||||
elif key_token:
|
key = token
|
||||||
key = token
|
key_token = False
|
||||||
key_token = False
|
else:
|
||||||
else:
|
if token == "+=":
|
||||||
if token == "+=":
|
if not data.has_key(key):
|
||||||
if not data.has_key(key):
|
data[key] = list()
|
||||||
|
elif token == "=":
|
||||||
data[key] = list()
|
data[key] = list()
|
||||||
elif token == "=":
|
else:
|
||||||
data[key] = list()
|
append_data( data, key, new_data, token )
|
||||||
else:
|
new_data = True
|
||||||
append_data( data, key, new_data, token )
|
|
||||||
new_data = True
|
last_token = token
|
||||||
|
token = lex.get_token()
|
||||||
|
|
||||||
|
if last_token == '\\' and token != '\n':
|
||||||
|
new_data = False
|
||||||
|
append_data( data, key, new_data, '\\' )
|
||||||
|
|
||||||
|
# compress lists of len 1 into single strings
|
||||||
|
for (k, v) in data.items():
|
||||||
|
if len(v) == 0:
|
||||||
|
data.pop(k)
|
||||||
|
|
||||||
|
# items in the following list will be kept as lists and not converted to strings
|
||||||
|
if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if len(v) == 1:
|
||||||
|
data[k] = v[0]
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
last_token = token
|
|
||||||
token = lex.get_token()
|
|
||||||
|
|
||||||
if last_token == '\\' and token != '\n':
|
|
||||||
new_data = False
|
|
||||||
append_data( data, key, new_data, '\\' )
|
|
||||||
|
|
||||||
# compress lists of len 1 into single strings
|
|
||||||
for (k, v) in data.items():
|
|
||||||
if len(v) == 0:
|
|
||||||
data.pop(k)
|
|
||||||
|
|
||||||
# items in the following list will be kept as lists and not converted to strings
|
|
||||||
if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if len(v) == 1:
|
|
||||||
data[k] = v[0]
|
|
||||||
|
|
||||||
return data
|
|
||||||
|
|
||||||
def DoxySourceScan(node, env, path):
|
def DoxySourceScan(node, env, path):
|
||||||
"""
|
""" Doxygen Doxyfile source scanner.
|
||||||
Doxygen Doxyfile source scanner. This should scan the Doxygen file and add
|
This should scan the Doxygen file and add any files
|
||||||
any files used to generate docs to the list of source files.
|
used to generate docs to the list of source files.
|
||||||
"""
|
"""
|
||||||
default_file_patterns = [
|
default_file_patterns = [
|
||||||
'*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx',
|
'*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx',
|
||||||
'*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++',
|
'*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++',
|
||||||
'*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm',
|
'*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm',
|
||||||
'*.py',
|
'*.py',
|
||||||
]
|
]
|
||||||
|
|
||||||
default_exclude_patterns = [
|
default_exclude_patterns = [
|
||||||
'*~',
|
'*~',
|
||||||
]
|
]
|
||||||
|
|
||||||
sources = []
|
sources = []
|
||||||
|
|
||||||
data = DoxyfileParse(node.get_contents())
|
data = DoxyfileParse(node.get_contents())
|
||||||
|
|
||||||
if data.get("RECURSIVE", "NO") == "YES":
|
if data.get("RECURSIVE", "NO") == "YES":
|
||||||
recursive = True
|
recursive = True
|
||||||
else:
|
else:
|
||||||
recursive = False
|
recursive = False
|
||||||
|
|
||||||
file_patterns = data.get("FILE_PATTERNS", default_file_patterns)
|
file_patterns = data.get("FILE_PATTERNS", default_file_patterns)
|
||||||
exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns)
|
exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns)
|
||||||
|
|
||||||
#
|
#
|
||||||
# We're running in the top-level directory, but the doxygen
|
# We're running in the top-level directory, but the doxygen configuration file
|
||||||
# configuration file is in the same directory as node; this means
|
# is in the same directory as node; this means that relative pathnames in node
|
||||||
# that relative pathnames in node must be adjusted before they can
|
# must be adjusted before they can go onto the sources list
|
||||||
# go onto the sources list
|
conf_dir = os.path.dirname(str(node))
|
||||||
conf_dir = os.path.dirname(str(node))
|
|
||||||
|
for node in data.get("INPUT", []):
|
||||||
for node in data.get("INPUT", []):
|
if not os.path.isabs(node):
|
||||||
if not os.path.isabs(node):
|
node = os.path.join(conf_dir, node)
|
||||||
node = os.path.join(conf_dir, node)
|
if os.path.isfile(node):
|
||||||
if os.path.isfile(node):
|
sources.append(node)
|
||||||
sources.append(node)
|
elif os.path.isdir(node):
|
||||||
elif os.path.isdir(node):
|
if recursive:
|
||||||
if recursive:
|
for root, dirs, files in os.walk(node):
|
||||||
for root, dirs, files in os.walk(node):
|
for f in files:
|
||||||
for f in files:
|
filename = os.path.join(root, f)
|
||||||
filename = os.path.join(root, f)
|
|
||||||
|
pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False)
|
||||||
pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False)
|
exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True)
|
||||||
exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True)
|
|
||||||
|
if pattern_check and not exclude_check:
|
||||||
if pattern_check and not exclude_check:
|
sources.append(filename)
|
||||||
sources.append(filename)
|
else:
|
||||||
else:
|
for pattern in file_patterns:
|
||||||
for pattern in file_patterns:
|
sources.extend(glob.glob("/".join([node, pattern])))
|
||||||
sources.extend(glob.glob("/".join([node, pattern])))
|
|
||||||
|
sources = map( lambda path: env.File(path), sources )
|
||||||
sources = map( lambda path: env.File(path), sources )
|
return sources
|
||||||
return sources
|
|
||||||
|
|
||||||
|
|
||||||
def DoxySourceScanCheck(node, env):
|
def DoxySourceScanCheck(node, env):
|
||||||
"""Check if we should scan this file"""
|
""" Check if we should scan this file """
|
||||||
return os.path.isfile(node.path)
|
return os.path.isfile(node.path)
|
||||||
|
|
||||||
|
|
||||||
def DoxyEmitter(source, target, env):
|
def DoxyEmitter(source, target, env):
|
||||||
"""Doxygen Doxyfile emitter"""
|
""" Doxygen Doxyfile emitter """
|
||||||
# possible output formats and their default values and output locations
|
# possible output formats and their default values and output locations
|
||||||
output_formats = {
|
output_formats = {
|
||||||
"HTML": ("YES", "html"),
|
"HTML": ("YES", "html"),
|
||||||
"LATEX": ("YES", "latex"),
|
"LATEX": ("YES", "latex"),
|
||||||
"RTF": ("NO", "rtf"),
|
"RTF": ("NO", "rtf"),
|
||||||
"MAN": ("NO", "man"),
|
"MAN": ("NO", "man"),
|
||||||
"XML": ("NO", "xml"),
|
"XML": ("NO", "xml"),
|
||||||
}
|
}
|
||||||
|
|
||||||
data = DoxyfileParse(source[0].get_contents())
|
data = DoxyfileParse(source[0].get_contents())
|
||||||
|
|
||||||
targets = []
|
targets = []
|
||||||
out_dir = data.get("OUTPUT_DIRECTORY", ".")
|
out_dir = data.get("OUTPUT_DIRECTORY", ".")
|
||||||
|
|
||||||
# add our output locations
|
# add our output locations
|
||||||
for (k, v) in output_formats.items():
|
for (k, v) in output_formats.items():
|
||||||
if data.get("GENERATE_" + k, v[0]) == "YES":
|
if data.get("GENERATE_" + k, v[0]) == "YES":
|
||||||
targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) )
|
targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) )
|
||||||
|
|
||||||
# don't clobber targets
|
# don't clobber targets
|
||||||
for node in targets:
|
for node in targets:
|
||||||
env.Precious(node)
|
env.Precious(node)
|
||||||
|
|
||||||
# set up cleaning stuff
|
# set up cleaning stuff
|
||||||
for node in targets:
|
for node in targets:
|
||||||
env.Clean(node, node)
|
env.Clean(node, node)
|
||||||
|
|
||||||
return (targets, source)
|
return (targets, source)
|
||||||
|
|
||||||
|
|
||||||
def generate(env):
|
def generate(env):
|
||||||
"""
|
""" Add builders and construction variables for the
|
||||||
Add builders and construction variables for the
|
Doxygen tool. This is currently for Doxygen 1.4.6.
|
||||||
Doxygen tool. This is currently for Doxygen 1.4.6.
|
"""
|
||||||
"""
|
doxyfile_scanner = env.Scanner(
|
||||||
doxyfile_scanner = env.Scanner(
|
DoxySourceScan,
|
||||||
DoxySourceScan,
|
"DoxySourceScan",
|
||||||
"DoxySourceScan",
|
scan_check = DoxySourceScanCheck,
|
||||||
scan_check = DoxySourceScanCheck,
|
)
|
||||||
)
|
|
||||||
|
import SCons.Builder
|
||||||
|
doxyfile_builder = SCons.Builder.Builder(
|
||||||
|
action = "cd ${SOURCE.dir} && (${DOXYGEN} ${SOURCE.file} 2>&1 |tee ,doxylog)",
|
||||||
|
emitter = DoxyEmitter,
|
||||||
|
target_factory = env.fs.Entry,
|
||||||
|
single_source = True,
|
||||||
|
source_scanner = doxyfile_scanner,
|
||||||
|
)
|
||||||
|
|
||||||
|
env.Append(BUILDERS = {
|
||||||
|
'Doxygen': doxyfile_builder,
|
||||||
|
})
|
||||||
|
|
||||||
|
env.AppendUnique(
|
||||||
|
DOXYGEN = 'doxygen',
|
||||||
|
)
|
||||||
|
|
||||||
import SCons.Builder
|
|
||||||
doxyfile_builder = SCons.Builder.Builder(
|
|
||||||
action = "cd ${SOURCE.dir} && (${DOXYGEN} ${SOURCE.file} 2>&1 |tee ,doxylog)",
|
|
||||||
emitter = DoxyEmitter,
|
|
||||||
target_factory = env.fs.Entry,
|
|
||||||
single_source = True,
|
|
||||||
source_scanner = doxyfile_scanner,
|
|
||||||
)
|
|
||||||
|
|
||||||
env.Append(BUILDERS = {
|
|
||||||
'Doxygen': doxyfile_builder,
|
|
||||||
})
|
|
||||||
|
|
||||||
env.AppendUnique(
|
|
||||||
DOXYGEN = 'doxygen',
|
|
||||||
)
|
|
||||||
|
|
||||||
def exists(env):
|
def exists(env):
|
||||||
"""
|
""" Make sure doxygen exists.
|
||||||
Make sure doxygen exists.
|
"""
|
||||||
"""
|
return env.Detect("doxygen")
|
||||||
return env.Detect("doxygen")
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ def setup_dependency(target,source,env, key):
|
||||||
if header_path in [x.path for x in deps]:
|
if header_path in [x.path for x in deps]:
|
||||||
print "Precompiled header(%s) %s \t <--- %s" % (key,header_path,source[0])
|
print "Precompiled header(%s) %s \t <--- %s" % (key,header_path,source[0])
|
||||||
env.Depends(target, header)
|
env.Depends(target, header)
|
||||||
|
|
||||||
|
|
||||||
def static_pch_emitter(target,source,env):
|
def static_pch_emitter(target,source,env):
|
||||||
SCons.Defaults.StaticObjectEmitter( target, source, env )
|
SCons.Defaults.StaticObjectEmitter( target, source, env )
|
||||||
|
|
@ -73,9 +73,9 @@ def shared_pch_emitter(target,source,env):
|
||||||
setup_dependency(target,source,env, key='GCH-sh')
|
setup_dependency(target,source,env, key='GCH-sh')
|
||||||
return (target, source)
|
return (target, source)
|
||||||
|
|
||||||
|
|
||||||
def generate(env):
|
def generate(env):
|
||||||
"""
|
""" Add builders and construction variables for the Gch builder.
|
||||||
Add builders and construction variables for the Gch builder.
|
|
||||||
"""
|
"""
|
||||||
env.Append(BUILDERS = {
|
env.Append(BUILDERS = {
|
||||||
'gch': env.Builder(
|
'gch': env.Builder(
|
||||||
|
|
@ -87,7 +87,7 @@ def generate(env):
|
||||||
target_factory = env.fs.File,
|
target_factory = env.fs.File,
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
|
|
||||||
try:
|
try:
|
||||||
bld = env['BUILDERS']['GCH']
|
bld = env['BUILDERS']['GCH']
|
||||||
bldsh = env['BUILDERS']['GCH-sh']
|
bldsh = env['BUILDERS']['GCH-sh']
|
||||||
|
|
@ -96,11 +96,11 @@ def generate(env):
|
||||||
bldsh = GchShBuilder
|
bldsh = GchShBuilder
|
||||||
env['BUILDERS']['PrecompiledHeader'] = bld
|
env['BUILDERS']['PrecompiledHeader'] = bld
|
||||||
env['BUILDERS']['PrecompiledHeaderShared'] = bldsh
|
env['BUILDERS']['PrecompiledHeaderShared'] = bldsh
|
||||||
|
|
||||||
env['GCHCOM'] = '$CXX -o $TARGET -x c++-header -c $CXXFLAGS $_CCCOMCOM $SOURCE'
|
env['GCHCOM'] = '$CXX -o $TARGET -x c++-header -c $CXXFLAGS $_CCCOMCOM $SOURCE'
|
||||||
env['GCHSHCOM'] = '$CXX -o $TARGET -x c++-header -c $SHCXXFLAGS $_CCCOMCOM $SOURCE'
|
env['GCHSHCOM'] = '$CXX -o $TARGET -x c++-header -c $SHCXXFLAGS $_CCCOMCOM $SOURCE'
|
||||||
env['GCHSUFFIX'] = '.gch'
|
env['GCHSUFFIX'] = '.gch'
|
||||||
|
|
||||||
for suffix in SCons.Util.Split('.c .C .cc .cxx .cpp .c++'):
|
for suffix in SCons.Util.Split('.c .C .cc .cxx .cpp .c++'):
|
||||||
env['BUILDERS']['StaticObject'].add_emitter( suffix, static_pch_emitter )
|
env['BUILDERS']['StaticObject'].add_emitter( suffix, static_pch_emitter )
|
||||||
env['BUILDERS']['SharedObject'].add_emitter( suffix, shared_pch_emitter )
|
env['BUILDERS']['SharedObject'].add_emitter( suffix, shared_pch_emitter )
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ def isCleanupOperation(env):
|
||||||
|
|
||||||
def isHelpRequest():
|
def isHelpRequest():
|
||||||
""" this is a hack: SCons does all configure tests even if only
|
""" this is a hack: SCons does all configure tests even if only
|
||||||
the helpmessage is requested. SCons doesn't export the
|
the help message is requested. SCons doesn't export the
|
||||||
help option for retrieval by env.GetOption(),
|
help option for retrieval by env.GetOption(),
|
||||||
so we scan the commandline directly.
|
so we scan the commandline directly.
|
||||||
"""
|
"""
|
||||||
|
|
@ -48,8 +48,8 @@ def isHelpRequest():
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def srcSubtree(env,tree,isShared=False,builder=None, **args):
|
def srcSubtree(env,tree,isShared=True,builder=None, **args):
|
||||||
""" convienience wrapper: scans the given subtree, which is
|
""" convenience wrapper: scans the given subtree, which is
|
||||||
relative to the current SConscript, find all source files and
|
relative to the current SConscript, find all source files and
|
||||||
declare them as Static or SharedObjects for compilation
|
declare them as Static or SharedObjects for compilation
|
||||||
"""
|
"""
|
||||||
|
|
@ -68,7 +68,7 @@ SRCPATTERNS = ['*.c','*.cpp','*.cc']
|
||||||
|
|
||||||
def scanSubtree(roots, patterns=SRCPATTERNS):
|
def scanSubtree(roots, patterns=SRCPATTERNS):
|
||||||
""" first expand (possible) wildcards and filter out non-dirs.
|
""" first expand (possible) wildcards and filter out non-dirs.
|
||||||
Then scan the given subtree for source filesnames
|
Then scan the given subtree for source filenames
|
||||||
(python generator function)
|
(python generator function)
|
||||||
"""
|
"""
|
||||||
for root in globRootdirs(roots):
|
for root in globRootdirs(roots):
|
||||||
|
|
@ -112,11 +112,47 @@ def getDirname(dir):
|
||||||
dir,_ = os.path.split(dir)
|
dir,_ = os.path.split(dir)
|
||||||
_, name = os.path.split(dir)
|
_, name = os.path.split(dir)
|
||||||
return name
|
return name
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def checkCommandOption(env, optID, val=None, cmdName=None):
|
||||||
|
""" evaluate and verify an option, which may point at a command.
|
||||||
|
besides specifying a path, the option may read True, yes or 1,
|
||||||
|
denoting that the system default for this command should be used.
|
||||||
|
@return: True, if the key has been expanded and validated,
|
||||||
|
False, if this failed and the key was removed
|
||||||
|
"""
|
||||||
|
if not val:
|
||||||
|
if not env.get(optID): return False
|
||||||
|
else:
|
||||||
|
val = env.get(optID)
|
||||||
|
|
||||||
|
if val=='True' or val=='true' or val=='yes' or val=='1' or val == 1 :
|
||||||
|
if not cmdName:
|
||||||
|
print "WARNING: no default for %s, please specify a full path." % optID
|
||||||
|
del env[optID]
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
val = env.WhereIs(cmdName)
|
||||||
|
if not val:
|
||||||
|
print "WARNING: %s not found, please specify a full path" % cmdName
|
||||||
|
del env[optID]
|
||||||
|
return False
|
||||||
|
|
||||||
|
if not os.path.isfile(val):
|
||||||
|
val = env.WhereIs(val)
|
||||||
|
|
||||||
|
if val and os.path.isfile(val):
|
||||||
|
env[optID] = val
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
del env[optID]
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def RegisterIcon_Builder(env, renderer):
|
def RegisterIcon_Builder(env, renderer):
|
||||||
""" Registeres Custom Builders for generating and installing Icons.
|
""" Registers Custom Builders for generating and installing Icons.
|
||||||
Additionally you need to build the tool (rsvg-convert.c)
|
Additionally you need to build the tool (rsvg-convert.c)
|
||||||
used to generate png from the svg source using librsvg.
|
used to generate png from the svg source using librsvg.
|
||||||
"""
|
"""
|
||||||
|
|
@ -157,7 +193,7 @@ def Tarball(env,location,dirs,suffix=''):
|
||||||
suffix: (optional) suffix to include in the tar name
|
suffix: (optional) suffix to include in the tar name
|
||||||
dirs: directories to include in the tar
|
dirs: directories to include in the tar
|
||||||
|
|
||||||
This is a bit of a hack, because we want to be able to include arbitrary dirctories,
|
This is a bit of a hack, because we want to be able to include arbitrary directories,
|
||||||
without creating new dependencies on those dirs. Esp. we want to tar the source tree
|
without creating new dependencies on those dirs. Esp. we want to tar the source tree
|
||||||
prior to compiling. Solution is
|
prior to compiling. Solution is
|
||||||
- use the Command-Builder, but pass all target specifications as custom build vars
|
- use the Command-Builder, but pass all target specifications as custom build vars
|
||||||
|
|
|
||||||
65
admin/scons/ToolDistCC.py
Normal file
65
admin/scons/ToolDistCC.py
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
# -*- python -*-
|
||||||
|
##
|
||||||
|
## ToolDistCC.py - SCons tool for distributed compilation using DistCC
|
||||||
|
##
|
||||||
|
|
||||||
|
# Copyright (C) Lumiera.org and FreeOrion.org
|
||||||
|
# 2008, Hermann Vosseler <Ichthyostega@web.de>
|
||||||
|
#
|
||||||
|
# This program 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.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
# This SCons builder was extracted from http://www.freeorion.org/
|
||||||
|
# FreeOrion is an open-source platform-independent galactic conquest game
|
||||||
|
#
|
||||||
|
# history: 12/2008 adapted for Lumiera build system
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
|
from Buildhelper import *
|
||||||
|
|
||||||
|
|
||||||
|
def generate(env):
|
||||||
|
""" Modify the environment such as to redirect any
|
||||||
|
C/C++ compiler invocations through DistCC. Additionally
|
||||||
|
pull in the environment config variables used by DistCC
|
||||||
|
"""
|
||||||
|
if not exists(env): return
|
||||||
|
|
||||||
|
assert env['DISTCC']
|
||||||
|
if not env['DISTCC'] in env['CC']:
|
||||||
|
env['CC'] = env.subst('$DISTCC $CC')
|
||||||
|
if not env['DISTCC'] in env['CXX']:
|
||||||
|
env['CXX'] = env.subst('$DISTCC $CXX')
|
||||||
|
print env.subst("* Build using $DISTCC")
|
||||||
|
for i in ['HOME'
|
||||||
|
,'DISTCC_HOSTS'
|
||||||
|
,'DISTCC_VERBOSE'
|
||||||
|
,'DISTCC_FALLBACK'
|
||||||
|
,'DISTCC_LOG'
|
||||||
|
,'DISTCC_MMAP'
|
||||||
|
,'DISTCC_SAVE_TEMPS'
|
||||||
|
,'DISTCC_TCP_CORK'
|
||||||
|
,'DISTCC_SSH'
|
||||||
|
]:
|
||||||
|
if os.environ.has_key(i) and not env.has_key(i):
|
||||||
|
env['ENV'][i] = os.environ[i]
|
||||||
|
|
||||||
|
|
||||||
|
def exists(env):
|
||||||
|
""" Ensure DistCC exists.
|
||||||
|
"""
|
||||||
|
return checkCommandOption(env, 'DISTCC', cmdName='distcc')
|
||||||
|
|
||||||
1
bin/.libs
Symbolic link
1
bin/.libs
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../.libs
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
build dir
|
|
||||||
|
|
@ -70,10 +70,10 @@ SORT_MEMBER_DOCS = NO
|
||||||
SORT_BRIEF_DOCS = YES
|
SORT_BRIEF_DOCS = YES
|
||||||
SORT_GROUP_NAMES = NO
|
SORT_GROUP_NAMES = NO
|
||||||
SORT_BY_SCOPE_NAME = NO
|
SORT_BY_SCOPE_NAME = NO
|
||||||
GENERATE_TODOLIST = YES
|
GENERATE_TODOLIST = NO
|
||||||
GENERATE_TESTLIST = YES
|
GENERATE_TESTLIST = NO
|
||||||
GENERATE_BUGLIST = YES
|
GENERATE_BUGLIST = NO
|
||||||
GENERATE_DEPRECATEDLIST= YES
|
GENERATE_DEPRECATEDLIST= NO
|
||||||
ENABLED_SECTIONS =
|
ENABLED_SECTIONS =
|
||||||
MAX_INITIALIZER_LINES = 30
|
MAX_INITIALIZER_LINES = 30
|
||||||
SHOW_USED_FILES = YES
|
SHOW_USED_FILES = YES
|
||||||
|
|
@ -94,8 +94,7 @@ WARN_LOGFILE = warnings.txt
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
# configuration options related to the input files
|
# configuration options related to the input files
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
INPUT = ../../src/ \
|
INPUT = ../../src/
|
||||||
../../tests/
|
|
||||||
INPUT_ENCODING = UTF-8
|
INPUT_ENCODING = UTF-8
|
||||||
FILE_PATTERNS = *.c \
|
FILE_PATTERNS = *.c \
|
||||||
*.cc \
|
*.cc \
|
||||||
|
|
@ -154,7 +153,7 @@ FILTER_SOURCE_FILES = NO
|
||||||
# configuration options related to source browsing
|
# configuration options related to source browsing
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
SOURCE_BROWSER = YES
|
SOURCE_BROWSER = YES
|
||||||
INLINE_SOURCES = YES
|
INLINE_SOURCES = NO
|
||||||
STRIP_CODE_COMMENTS = YES
|
STRIP_CODE_COMMENTS = YES
|
||||||
REFERENCED_BY_RELATION = YES
|
REFERENCED_BY_RELATION = YES
|
||||||
REFERENCES_RELATION = YES
|
REFERENCES_RELATION = YES
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
autotools helper scripts
|
|
||||||
7
src/common/DIR_INFO
Normal file
7
src/common/DIR_INFO
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
Common application services (liblumieracommon)
|
||||||
|
|
||||||
|
contains:
|
||||||
|
* the config system
|
||||||
|
* commandline parsing
|
||||||
|
* interfaces and plugin loading
|
||||||
|
* lua interpreter (planned)
|
||||||
|
|
@ -21,24 +21,26 @@
|
||||||
* *****************************************************/
|
* *****************************************************/
|
||||||
|
|
||||||
|
|
||||||
#include "proc/nobugcfg.hpp"
|
#include "include/nobugcfg.h"
|
||||||
|
|
||||||
#define NOBUG_INIT_DEFS_
|
#define NOBUG_INIT_DEFS_
|
||||||
#include "proc/nobugcfg.hpp"
|
#include "include/nobugcfg.h"
|
||||||
#undef NOBUG_INIT_DEFS_
|
#undef NOBUG_INIT_DEFS_
|
||||||
|
|
||||||
|
|
||||||
namespace lumiera
|
|
||||||
{
|
|
||||||
|
namespace lumiera {
|
||||||
|
|
||||||
void
|
void
|
||||||
initialize_NoBug ()
|
initialise_NoBug ()
|
||||||
{
|
{
|
||||||
NOBUG_INIT;
|
NOBUG_INIT;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
static uint callCount = 0;
|
static uint callCount = 0;
|
||||||
ASSERT ( 0 == callCount++ );
|
ASSERT ( 0 == callCount++ );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -10,6 +10,9 @@
|
||||||
#include <gtkmm.h>
|
#include <gtkmm.h>
|
||||||
#include <nobug.h>
|
#include <nobug.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <boost/utility.hpp>
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
#include "lib/util.hpp"
|
||||||
|
|
||||||
#include <libgdl-1.0/gdl/gdl-dock-layout.h>
|
#include <libgdl-1.0/gdl/gdl-dock-layout.h>
|
||||||
|
|
||||||
|
|
@ -50,7 +53,7 @@ static const gchar* AppTitle = "Lumiera";
|
||||||
/**
|
/**
|
||||||
* The main application class.
|
* The main application class.
|
||||||
*/
|
*/
|
||||||
class GtkLumiera
|
class GtkLumiera : private boost::noncopyable
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
int main(int argc, char *argv[]);
|
int main(int argc, char *argv[]);
|
||||||
|
|
|
||||||
|
|
@ -152,13 +152,13 @@ style "timeline_ruler" = "default_base"
|
||||||
gtkmm__CustomObject_TimelineRuler::playback_period_arrow_stem_size = 3
|
gtkmm__CustomObject_TimelineRuler::playback_period_arrow_stem_size = 3
|
||||||
}
|
}
|
||||||
|
|
||||||
style "header_container" = "default_base"
|
style "timeline_header_container" = "default_base"
|
||||||
{
|
{
|
||||||
gtkmm__CustomObject_HeaderContainer::heading_margin = 4
|
gtkmm__CustomObject_HeaderContainer::heading_margin = 4
|
||||||
}
|
}
|
||||||
|
|
||||||
class "gtkmm__CustomObject_TimelineBody" style:highest "timeline_body"
|
class "gtkmm__CustomObject_TimelineBody" style:highest "timeline_body"
|
||||||
class "gtkmm__CustomObject_TimelineRuler" style:highest "timeline_ruler"
|
class "gtkmm__CustomObject_TimelineRuler" style:highest "timeline_ruler"
|
||||||
class "gtkmm__CustomObject_HeaderContainer" style:highest "header_container"
|
class "gtkmm__CustomObject_TimelineHeaderContainer" style:highest "timeline_header_container"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
117
src/include/nobugcfg.h
Normal file
117
src/include/nobugcfg.h
Normal file
|
|
@ -0,0 +1,117 @@
|
||||||
|
/*
|
||||||
|
NOBUGCFG.h - NoBug definitions and initialisation for the Proc-Layer
|
||||||
|
|
||||||
|
|
||||||
|
Copyright (C) Lumiera.org
|
||||||
|
2008, Christian Thaeter <ct@pipapo.org>
|
||||||
|
Hermann Vosseler <Ichthyostega@web.de>
|
||||||
|
|
||||||
|
This program 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.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @file nobugcfg.h
|
||||||
|
** This header is for including and configuring NoBug.
|
||||||
|
** The idea is that configuration and some commonly used flag
|
||||||
|
** declarations are to be kept in one central location. Subsystems
|
||||||
|
** are free to define and use additional flags for local use. Typically,
|
||||||
|
** this header will be included via some of the basic headers like error.hpp,
|
||||||
|
** which in turn gets included e.g. by proc/common.hpp
|
||||||
|
**
|
||||||
|
** This header can thus be assumed to be effectively global. It should contain
|
||||||
|
** only declarations of global relevance, as any change causes the whole project
|
||||||
|
** to be rebuilt. Moreover, for C++ this header assures automatic initialisation
|
||||||
|
** of NoBug by placing a static ctor call.
|
||||||
|
**
|
||||||
|
** Besides the usual guarded declarations, this header contains one section
|
||||||
|
** with the corresponding <b>definitions</b>. This section is to be included once
|
||||||
|
** by some translation unit (currently this is lumiera/nobugcfg.cpp) in order to
|
||||||
|
** generate the necessary definitions.
|
||||||
|
**
|
||||||
|
** @par Logging configuration
|
||||||
|
** By default, logging is configured such as to emit a small number of informative
|
||||||
|
** messages on the starting terminal and to report fatal errors. But besides the
|
||||||
|
** usual fine-grained tracing messages, we define a small number of distinct
|
||||||
|
** thematic <b>Logging Channels</b> providing a consistent high-level view of
|
||||||
|
** what is going on with regards to a specific aspect of the application
|
||||||
|
** - \c operate documents a high-level overall view of what the application \em does
|
||||||
|
** - \c render focuses on the working of the render engine (without logging each frame)
|
||||||
|
** - \c config shows anything of relevance regarding the configured state of App and session
|
||||||
|
** - \c memory allows to diagnose a high-level view of memory management
|
||||||
|
**
|
||||||
|
** Any log level can be overridden by an environment variable, for example
|
||||||
|
** \code NOBUG_LOG='operate:INFO' ./lumiera \endcode
|
||||||
|
**
|
||||||
|
** @todo logging to files?
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NOBUGCFG_H /* ============= Part 1: DECLARATIONS ======== */
|
||||||
|
#define NOBUGCFG_H
|
||||||
|
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <nobug.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus /* ============= C++ ================ */
|
||||||
|
|
||||||
|
#include "include/lifecycle.h"
|
||||||
|
#include "include/error.hpp" ///< make assertions throw instead of abort()
|
||||||
|
|
||||||
|
namespace lumiera {
|
||||||
|
void initialise_NoBug ();
|
||||||
|
namespace {
|
||||||
|
LifecycleHook trigger_it_ (ON_BASIC_INIT, &initialise_NoBug);
|
||||||
|
} }
|
||||||
|
#endif /* =====================(End) C++ ================ */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* declare flags used throughout the code base */
|
||||||
|
NOBUG_DECLARE_FLAG (all);
|
||||||
|
NOBUG_DECLARE_FLAG (lumiera_all);
|
||||||
|
NOBUG_DECLARE_FLAG (lumiera); ///< master log, informative console output
|
||||||
|
NOBUG_DECLARE_FLAG (operate); ///< logging channel reporting what the application does
|
||||||
|
NOBUG_DECLARE_FLAG (render); ///< logging channel focusing on the render engine's workings
|
||||||
|
NOBUG_DECLARE_FLAG (config); ///< logging channel covering application and session configuration
|
||||||
|
NOBUG_DECLARE_FLAG (memory); ///< logging channel covering memory management issues
|
||||||
|
NOBUG_DECLARE_FLAG (test);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*NOBUGCFG_H ======= (End) Part 1: DECLARATIONS ======== */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef NOBUG_INIT_DEFS_ /*========== Part 2: DEFINITIONS ========= */
|
||||||
|
|
||||||
|
|
||||||
|
/* flags used throughout the code base... */
|
||||||
|
NOBUG_CPP_DEFINE_FLAG (all);
|
||||||
|
NOBUG_CPP_DEFINE_FLAG_PARENT (lumiera_all, all);
|
||||||
|
NOBUG_CPP_DEFINE_FLAG_PARENT (lumiera, lumiera_all);
|
||||||
|
NOBUG_CPP_DEFINE_FLAG_PARENT (config, lumiera);
|
||||||
|
NOBUG_CPP_DEFINE_FLAG_PARENT (operate, lumiera);
|
||||||
|
NOBUG_CPP_DEFINE_FLAG_PARENT_LIMIT (render, lumiera, LOG_WARNING);
|
||||||
|
NOBUG_CPP_DEFINE_FLAG_PARENT_LIMIT (memory, lumiera, LOG_WARNING);
|
||||||
|
NOBUG_CPP_DEFINE_FLAG_PARENT_LIMIT (test, all, LOG_ERR);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*NOBUG_INIT_DEFS_ ==== (End) Part 2: DEFINITIONS ========= */
|
||||||
1
src/lumiera/DIR_INFO
Normal file
1
src/lumiera/DIR_INFO
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
The Lumiera application shell
|
||||||
89
src/lumiera/main.cpp
Normal file
89
src/lumiera/main.cpp
Normal file
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
main.cpp - start the Lumiera Application
|
||||||
|
|
||||||
|
Copyright (C) Lumiera.org
|
||||||
|
2007-2008, Joel Holdsworth <joel@airwebreathe.org.uk>
|
||||||
|
Christian Thaeter <ct@pipapo.org>
|
||||||
|
Hermann Vosseler <Ichthyostega@web.de>
|
||||||
|
|
||||||
|
This program 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.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "include/nobugcfg.h"
|
||||||
|
#include "include/error.hpp"
|
||||||
|
#include "common/appstate.hpp"
|
||||||
|
#include "common/option.hpp"
|
||||||
|
|
||||||
|
#include "backend/enginefacade.hpp"
|
||||||
|
#include "backend/netnodefacade.hpp"
|
||||||
|
#include "backend/scriptrunnerfacade.hpp"
|
||||||
|
#include "proc/facade.hpp"
|
||||||
|
#include "gui/guifacade.hpp"
|
||||||
|
|
||||||
|
using util::Cmdline;
|
||||||
|
using lumiera::Subsys;
|
||||||
|
using lumiera::AppState;
|
||||||
|
using lumiera::ON_GLOBAL_INIT;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
Subsys& engine = backend::EngineFacade::getDescriptor();
|
||||||
|
Subsys& netNode = backend::NetNodeFacade::getDescriptor();
|
||||||
|
Subsys& script = backend::ScriptRunnerFacade::getDescriptor();
|
||||||
|
Subsys& builder = proc::Facade::getBuilderDescriptor();
|
||||||
|
Subsys& session = proc::Facade::getSessionDescriptor();
|
||||||
|
Subsys& lumigui = gui::GuiFacade::getDescriptor();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, const char* argv[])
|
||||||
|
{
|
||||||
|
NOTICE (lumiera, "*** Lumiera NLE for Linux ***");
|
||||||
|
|
||||||
|
AppState& application = AppState::instance();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Cmdline args (argc,argv);
|
||||||
|
lumiera::Option options (args);
|
||||||
|
application.init (options);
|
||||||
|
|
||||||
|
session.depends (builder);
|
||||||
|
netNode.depends (session);
|
||||||
|
netNode.depends (engine);
|
||||||
|
// lumigui.depends (session); //////TODO commented out in order to be able to start up a dummy GuiStarterPlugin
|
||||||
|
// lumigui.depends (engine);
|
||||||
|
script.depends (session);
|
||||||
|
script.depends (engine);
|
||||||
|
|
||||||
|
application.maybeStart (session);
|
||||||
|
application.maybeStart (netNode);
|
||||||
|
application.maybeStart (lumigui);
|
||||||
|
application.maybeStart (script);
|
||||||
|
|
||||||
|
return application.maybeWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
catch (lumiera::Error& problem)
|
||||||
|
{
|
||||||
|
return application.abort (problem);
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
return application.abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
40
src/main.cpp
40
src/main.cpp
|
|
@ -1,40 +0,0 @@
|
||||||
/*
|
|
||||||
main.cpp - start the Lumiera Application
|
|
||||||
|
|
||||||
Copyright (C) Lumiera.org
|
|
||||||
2008, Christian Thaeter <ct@pipapo.org>
|
|
||||||
Hermann Vosseler <Ichthyostega@web.de>
|
|
||||||
|
|
||||||
This program 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.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "proc/lumiera.hpp"
|
|
||||||
|
|
||||||
using std::cout;
|
|
||||||
|
|
||||||
|
|
||||||
int main (int argc, char* argv[])
|
|
||||||
{
|
|
||||||
cout << "*** Lumiera NLE for Linux ***" << "\n"
|
|
||||||
<< " Version: quasi niente" << "\n";
|
|
||||||
|
|
||||||
|
|
||||||
// great things are happening here....
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
2
src/plugin/.gitignore
vendored
2
src/plugin/.gitignore
vendored
|
|
@ -1,2 +0,0 @@
|
||||||
*.os
|
|
||||||
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
/*
|
|
||||||
* hello.c - demonstrates how to build a standalone tool (C source)
|
|
||||||
* integrated into the SCons based build system of Lumiera
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
printf("hello lumiera world");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -45,7 +45,7 @@
|
||||||
#include <boost/format.hpp>
|
#include <boost/format.hpp>
|
||||||
#include <boost/bind.hpp>
|
#include <boost/bind.hpp>
|
||||||
|
|
||||||
#include "proc/lumiera.hpp"
|
#include "proc/common.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,12 +41,16 @@
|
||||||
|
|
||||||
/* common types frequently used... */
|
/* common types frequently used... */
|
||||||
|
|
||||||
#include "proc/nobugcfg.hpp"
|
#include "lib/p.hpp"
|
||||||
|
#include "lib/util.hpp"
|
||||||
|
#include "lib/lumitime.hpp"
|
||||||
|
#include "include/symbol.hpp"
|
||||||
|
#include "include/error.hpp" ///< pulls in NoBug via nobugcfg.h
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Namespace for globals.
|
* Lumiera public interface.
|
||||||
* A small number of definitions and facilities of application wide relevance.
|
* Global interfaces and facilities accessible from plugins and scripts.
|
||||||
* It's probably a good idea to pull it in explicitly and to avoid nesting
|
* It's probably a good idea to pull it in explicitly and to avoid nesting
|
||||||
* implementation namespaces within \c lumiera::
|
* implementation namespaces within \c lumiera::
|
||||||
*/
|
*/
|
||||||
|
|
@ -59,7 +63,7 @@ namespace lumiera {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Namespace for support and library code.
|
* Implementation namespace for support and library code.
|
||||||
*/
|
*/
|
||||||
namespace lib {
|
namespace lib {
|
||||||
|
|
||||||
|
|
@ -68,12 +72,14 @@ namespace lib {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The asset subsystem of the Proc-Layer.
|
* The asset subsystem of the Proc-Layer.
|
||||||
|
* @todo refactor proc namespaces
|
||||||
*/
|
*/
|
||||||
namespace asset { }
|
namespace asset { }
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Proc-Layer dispatcher, controller and administrative facilities.
|
* Proc-Layer dispatcher, controller and administrative facilities.
|
||||||
|
* @todo refactor proc namespaces
|
||||||
*/
|
*/
|
||||||
namespace control { }
|
namespace control { }
|
||||||
|
|
||||||
|
|
@ -83,6 +89,7 @@ namespace control { }
|
||||||
* Backbone of the engine, render nodes base and cooperation.
|
* Backbone of the engine, render nodes base and cooperation.
|
||||||
* A good deal of the active engine code is outside the scope of the
|
* A good deal of the active engine code is outside the scope of the
|
||||||
* Proc-Layer, e.g. code located in backend services and plugins.
|
* Proc-Layer, e.g. code located in backend services and plugins.
|
||||||
|
* @todo refactor proc namespaces
|
||||||
*/
|
*/
|
||||||
namespace engine { }
|
namespace engine { }
|
||||||
|
|
||||||
|
|
@ -90,6 +97,8 @@ namespace engine { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Media-Objects, edit operations and high-level session.
|
* Media-Objects, edit operations and high-level session.
|
||||||
|
* @todo is this interface or implementation ??
|
||||||
|
* @todo refactor proc namespaces
|
||||||
*/
|
*/
|
||||||
namespace mobject {
|
namespace mobject {
|
||||||
|
|
||||||
|
|
@ -1,85 +0,0 @@
|
||||||
/*
|
|
||||||
NOBUGCFG.hpp - NoBug definitions and initialisation for the Proc-Layer
|
|
||||||
|
|
||||||
|
|
||||||
Copyright (C) Lumiera.org
|
|
||||||
2008, Christian Thaeter <ct@pipapo.org>
|
|
||||||
Hermann Vosseler <Ichthyostega@web.de>
|
|
||||||
|
|
||||||
This program 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.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file nobugcfg.hpp
|
|
||||||
** This header is for including and configuring NoBug.
|
|
||||||
** The idea is that configuration and some globally used flag
|
|
||||||
** declarations are to be kept in one central location. Normally,
|
|
||||||
** this header will be included via some of the basic headers like
|
|
||||||
** error.hpp, which in turn gets included by proc/lumiera.hpp
|
|
||||||
**
|
|
||||||
** @par Besides the usual guarded declarations, this header contains
|
|
||||||
** one section with the corresponding <b>definitions</b>. This section
|
|
||||||
** is to be included once by some translation unit (currently this is
|
|
||||||
** nobugcfg.cpp) in order to generate the necessary definitions.
|
|
||||||
**
|
|
||||||
** @note this header assures automatic initialisation of NoBug
|
|
||||||
** by placing a static ctor call.
|
|
||||||
**
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef NOBUGCFG_H /* ============= Part 1: DECLARATIONS ======== */
|
|
||||||
#define NOBUGCFG_H
|
|
||||||
|
|
||||||
#include <syslog.h>
|
|
||||||
#include <nobug.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* declare flags used throughout the code base... */
|
|
||||||
NOBUG_DECLARE_FLAG(config);
|
|
||||||
NOBUG_DECLARE_FLAG(oper);
|
|
||||||
NOBUG_DECLARE_FLAG(test);
|
|
||||||
NOBUG_DECLARE_FLAG(singleton);
|
|
||||||
NOBUG_DECLARE_FLAG(assetmem);
|
|
||||||
NOBUG_DECLARE_FLAG(mobjectmem);
|
|
||||||
|
|
||||||
|
|
||||||
namespace lumiera {
|
|
||||||
void initialize_NoBug ();
|
|
||||||
namespace {
|
|
||||||
// LifecycleHook schedule_ (ON_BASIC_INIT, &initialize_NoBug);
|
|
||||||
} }
|
|
||||||
#endif /*NOBUGCFG_H ======= (End) Part 1: DECLARATIONS ======== */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef NOBUG_INIT_DEFS_ /*========== Part 2: DEFINITIONS ========= */
|
|
||||||
|
|
||||||
|
|
||||||
/* flags used throughout the code base... */
|
|
||||||
NOBUG_CPP_DEFINE_FLAG(config);
|
|
||||||
NOBUG_CPP_DEFINE_FLAG(oper);
|
|
||||||
NOBUG_CPP_DEFINE_FLAG(test);
|
|
||||||
NOBUG_CPP_DEFINE_FLAG_LIMIT(singleton, LOG_WARNING);
|
|
||||||
NOBUG_CPP_DEFINE_FLAG_LIMIT(assetmem, LOG_WARNING);
|
|
||||||
NOBUG_CPP_DEFINE_FLAG_LIMIT(mobjectmem, LOG_WARNING);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif /*NOBUG_INIT_DEFS_ ==== (End) Part 2: DEFINITIONS ========= */
|
|
||||||
|
|
@ -9,6 +9,6 @@ Import('env','artifacts','core')
|
||||||
# build the ubiquitous Hello World application (note: C source)
|
# build the ubiquitous Hello World application (note: C source)
|
||||||
artifacts['tools'] = [ env.Program('#$BINDIR/hello-world','hello.c')
|
artifacts['tools'] = [ env.Program('#$BINDIR/hello-world','hello.c')
|
||||||
+ env.Program('#$BINDIR/luidgen', ['luidgen.c']+core)
|
+ env.Program('#$BINDIR/luidgen', ['luidgen.c']+core)
|
||||||
+ env.Program('#$BINDIR/try', 'try.cpp') #### to try out some feature...
|
+ env.Program('#$BINDIR/try', 'try.cpp') #### to try out some feature...
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,25 +19,98 @@
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "lib/safeclib.h"
|
||||||
#include "lib/luid.h"
|
#include "lib/luid.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <nobug.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file
|
* @file
|
||||||
* Generate amd print a Lumiera uid as octal escaped string
|
* Generate amd print a Lumiera uid as octal escaped string
|
||||||
|
* or process a file replaceing 'LUIDGEN' with a octal escaped string
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char** argv)
|
main (int argc, char** argv)
|
||||||
{
|
{
|
||||||
|
NOBUG_INIT;
|
||||||
lumiera_uid luid;
|
lumiera_uid luid;
|
||||||
lumiera_uid_gen (&luid);
|
|
||||||
|
|
||||||
printf ("\"");
|
if (argc == 1)
|
||||||
for (int i = 0; i < 16; ++i)
|
{
|
||||||
printf ("\\%.3hho", *(((char*)&luid)+i));
|
lumiera_uid_gen (&luid);
|
||||||
printf ("\"\n");
|
printf ("\"");
|
||||||
|
for (int i = 0; i < 16; ++i)
|
||||||
|
printf ("\\%.3hho", *(((char*)&luid)+i));
|
||||||
|
printf ("\"\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 1; i < argc; ++i)
|
||||||
|
{
|
||||||
|
FILE* in = fopen (argv[i], "r");
|
||||||
|
if (!in)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Failed to open file %s for reading: %s\n", argv[i], strerror (errno));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* outname = lumiera_tmpbuf_snprintf (SIZE_MAX, "%s.luidgen", argv[i]);
|
||||||
|
FILE* out = fopen (outname, "wx");
|
||||||
|
if (!out)
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Failed to open file %s for writing: %s\n", outname, strerror (errno));
|
||||||
|
fclose (in);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
char buf[4096];
|
||||||
|
char luidbuf[67];
|
||||||
|
|
||||||
|
printf ("Luidgen %s ", argv[i]); fflush (stdout);
|
||||||
|
|
||||||
|
while (fgets (buf, 4096, in))
|
||||||
|
{
|
||||||
|
char* pos;
|
||||||
|
while ((pos = strstr(buf, "LUIDGEN")))
|
||||||
|
{
|
||||||
|
memmove (pos+66, pos+7, strlen (pos+7)+1);
|
||||||
|
lumiera_uid_gen (&luid);
|
||||||
|
sprintf (luidbuf, "\""LUMIERA_UID_FMT"\"", LUMIERA_UID_ELEMENTS(luid));
|
||||||
|
memcpy (pos, luidbuf, 66);
|
||||||
|
putchar ('.'); fflush (stdout);
|
||||||
|
}
|
||||||
|
fputs (buf, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose (out);
|
||||||
|
fclose (in);
|
||||||
|
|
||||||
|
char* backup = lumiera_tmpbuf_snprintf (SIZE_MAX, "%s~", argv[i]);
|
||||||
|
unlink (backup);
|
||||||
|
|
||||||
|
if (!!rename (argv[i], backup))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Failed to create backupfile %s: %s\n", backup, strerror (errno));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!!rename (outname, argv[i]))
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Renaming %s to %s failed: %s\n", outname, argv[i], strerror (errno));
|
||||||
|
rename (backup, argv[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf (" done\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,28 +5,33 @@
|
||||||
|
|
||||||
// 8/07 - how to control NOBUG??
|
// 8/07 - how to control NOBUG??
|
||||||
// execute with NOBUG_LOG='ttt:TRACE' bin/try
|
// execute with NOBUG_LOG='ttt:TRACE' bin/try
|
||||||
|
// 1/08 - working out a static initialisation problem for Visitor (Tag creation)
|
||||||
|
// 1/08 - check 64bit longs
|
||||||
|
// 4/08 - comparison operators on shared_ptr<Asset>
|
||||||
|
// 4/08 - conversions on the value_type used for boost::any
|
||||||
|
// 5/08 - how to guard a downcasting access, so it is compiled in only if the involved types are convertible
|
||||||
|
// 7/08 - combining partial specialisation and subclasses
|
||||||
|
// 10/8 - abusing the STL containers to hold noncopyable values
|
||||||
|
|
||||||
|
|
||||||
#include <nobug.h>
|
#include "include/nobugcfg.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <typeinfo>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
using std::cout;
|
using std::cout;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char* argv[])
|
main (int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
|
||||||
NOBUG_INIT;
|
NOBUG_INIT;
|
||||||
|
|
||||||
cout << "\ngulp\n";
|
cout << "\n.gulp.\n";
|
||||||
|
|
||||||
|
int * my = 0;
|
||||||
|
int oh = *my; // Congratulations...
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ env.Append(CPPPATH='#/.') # add Rootdir to Includepath, so test/test.h is found
|
||||||
|
|
||||||
def testExecutable(env,tree, exeName=None, obj=None):
|
def testExecutable(env,tree, exeName=None, obj=None):
|
||||||
""" declare all targets needed to create a standalone
|
""" declare all targets needed to create a standalone
|
||||||
Test executalbe of the given Sub-tree. Note that
|
Test executable of the given Sub-tree. Note that
|
||||||
each subdir is built in its own Environment.
|
each subdir is built in its own Environment.
|
||||||
"""
|
"""
|
||||||
env = env.Clone()
|
env = env.Clone()
|
||||||
|
|
@ -27,7 +27,7 @@ def testExecutable(env,tree, exeName=None, obj=None):
|
||||||
if obj:
|
if obj:
|
||||||
obj = [path.join(tree,name) for name in obj]
|
obj = [path.join(tree,name) for name in obj]
|
||||||
else:
|
else:
|
||||||
obj = srcSubtree(env,tree) # use all sourcefiles found in subtree
|
obj = srcSubtree(env,tree, isShared=False) # use all sourcefiles found in subtree
|
||||||
if not exeName:
|
if not exeName:
|
||||||
exeName = 'test-%s' % tree
|
exeName = 'test-%s' % tree
|
||||||
return env.Program('#$BINDIR/'+exeName, obj + core)
|
return env.Program('#$BINDIR/'+exeName, obj + core)
|
||||||
|
|
@ -46,21 +46,17 @@ def testCollection(env,dir):
|
||||||
def treatPluginTestcase(env):
|
def treatPluginTestcase(env):
|
||||||
""" Special case: the test-plugin executable
|
""" Special case: the test-plugin executable
|
||||||
"""
|
"""
|
||||||
tree = 'backend'
|
tree = 'plugin'
|
||||||
env = env.Clone()
|
env = env.Clone()
|
||||||
env.Append(CPPPATH=tree)
|
env.Append(CPPPATH=tree, CPPDEFINES='LUMIERA_PLUGIN')
|
||||||
prfx = path.join(tree,'example_plugin')
|
prfx = path.join(tree,'example_plugin')
|
||||||
oC = env.SharedObject(prfx, prfx+'.c')
|
oC = env.SharedObject(prfx, prfx+'.c')
|
||||||
oCPP = env.SharedObject(prfx+'_cpp', prfx+'.cpp')
|
oCPP = env.SharedObject(prfx+'_cpp', prfx+'.cpp')
|
||||||
testplugin = ( env.SharedLibrary('#$BINDIR/.libs/example_plugin', oC, SHLIBPREFIX='')
|
testplugin = ( env.LoadableModule('#$LIBDIR/examplepluginc', oC, SHLIBPREFIX='')
|
||||||
+ env.SharedLibrary('#$BINDIR/.libs/example_plugin_cpp', oCPP, SHLIBPREFIX='')
|
# + env.SharedLibrary('#$LIBDIR/exampleplugincpp', oCPP, SHLIBPREFIX='')
|
||||||
|
# doesn't compile yet...
|
||||||
)
|
)
|
||||||
# testExe = env.Program('#$BINDIR/test-plugin', ['plugin/plugin_main.c'] + core)
|
|
||||||
# env.Depends(testExe, testplugin)
|
|
||||||
# return testExe
|
|
||||||
|
|
||||||
# 10/2008 example_plugin moved to backend directory.
|
|
||||||
# ...we should try to find some convention here
|
|
||||||
return testplugin
|
return testplugin
|
||||||
#-- it depends (at the moment) on a specific isolated test-plugin,
|
#-- it depends (at the moment) on a specific isolated test-plugin,
|
||||||
# which is not integrated in the "normal procedure" for building Plugins
|
# which is not integrated in the "normal procedure" for building Plugins
|
||||||
|
|
@ -73,7 +69,7 @@ def treatPluginTestcase(env):
|
||||||
moduledirs = globRootdirs('*')
|
moduledirs = globRootdirs('*')
|
||||||
|
|
||||||
# but have to treat some subdirs individually.
|
# but have to treat some subdirs individually.
|
||||||
specials = ['plugin','library','backend']
|
specials = ['plugin','library','backend','lumiera']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -81,6 +77,7 @@ artifacts['testsuite'] = ts = ( [ testExecutable(env, dir) for dir in moduledirs
|
||||||
# + treatPluginTestcase(env)
|
# + treatPluginTestcase(env)
|
||||||
# + testCollection(env, 'library')
|
# + testCollection(env, 'library')
|
||||||
# + testCollection(env, 'backend')
|
# + testCollection(env, 'backend')
|
||||||
|
# + testCollection(env, 'lumiera')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -98,10 +95,16 @@ artifacts['testsuite'] = ts = ( [ testExecutable(env, dir) for dir in moduledirs
|
||||||
#
|
#
|
||||||
testEnv = env.Clone()
|
testEnv = env.Clone()
|
||||||
if not env['VALGRIND']:
|
if not env['VALGRIND']:
|
||||||
testEnv.Append(ENV = {'VALGRINDFLAGS' : 'DISABLE'})
|
testEnv.Append(ENV = { 'VALGRINDFLAGS' : 'DISABLE'
|
||||||
|
, 'LUMIERA_CONFIG_PATH' : './' })
|
||||||
|
|
||||||
testsuites = env['TESTSUITES'] or os.environ.get('TESTSUITES')
|
testsuites = env['TESTSUITES'] or os.environ.get('TESTSUITES')
|
||||||
if testsuites:
|
if testsuites:
|
||||||
testEnv['ENV']['TESTSUITES'] = testsuites
|
testEnv['ENV']['TESTSUITES'] = testsuites
|
||||||
|
|
||||||
|
pluginpath = os.environ.get('LUMIERA_PLUGIN_PATH')
|
||||||
|
if testsuites:
|
||||||
|
testEnv['ENV']['LUMIERA_PLUGIN_PATH'] = pluginpath
|
||||||
|
|
||||||
testDir = env.Dir('#$BINDIR')
|
testDir = env.Dir('#$BINDIR')
|
||||||
runTest = env.File("test.sh").abspath
|
runTest = env.File("test.sh").abspath
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue