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:
Fischlurch 2008-12-20 02:15:33 +01:00
commit f6209d99d3
30 changed files with 753 additions and 437 deletions

View file

@ -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'])

View file

@ -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)
] ]

View file

@ -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 $@

View file

@ -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)

View file

@ -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"));

View file

@ -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")

View file

@ -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 )

View file

@ -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
View 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
View file

@ -0,0 +1 @@
../.libs

View file

@ -1 +0,0 @@
build dir

View file

@ -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

View file

@ -1 +0,0 @@
autotools helper scripts

7
src/common/DIR_INFO Normal file
View file

@ -0,0 +1,7 @@
Common application services (liblumieracommon)
contains:
* the config system
* commandline parsing
* interfaces and plugin loading
* lua interpreter (planned)

View file

@ -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
} }
} }

View file

@ -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[]);

View file

@ -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
View 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
View file

@ -0,0 +1 @@
The Lumiera application shell

89
src/lumiera/main.cpp Normal file
View 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();
}
}

View file

@ -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;
}

View file

@ -1,2 +0,0 @@
*.os

View file

@ -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;
}

View file

@ -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"

View file

@ -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 {

View file

@ -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 ========= */

View file

@ -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...
] ]

View file

@ -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;
} }

View file

@ -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;
} }

View file

@ -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