merge after integrating the GUI draft; now using multiple build environments and check via pkg-config

This commit is contained in:
Fischlurch 2008-07-11 05:35:48 +02:00
parent 50f8be0e16
commit 7a6b987a50
5 changed files with 334 additions and 24 deletions

2
.gitignore vendored
View file

@ -5,7 +5,7 @@
*.os *.os
*.gch *.gch
,valgrind.log* ,valgrind.log*
Buildhelper.pyc admin/scons/*.pyc
optcache optcache
Makefile.in Makefile.in
build/* build/*

View file

@ -26,6 +26,8 @@ sys.path.append("./admin/scons")
import os import os
from Buildhelper import * from Buildhelper import *
from LumieraEnvironment import *
#-----------------------------------Configuration #-----------------------------------Configuration
OPTIONSCACHEFILE = 'optcache' OPTIONSCACHEFILE = 'optcache'
@ -33,6 +35,7 @@ CUSTOPTIONSFILE = 'custom-options'
SRCDIR = 'src' SRCDIR = 'src'
BINDIR = 'bin' BINDIR = 'bin'
TESTDIR = 'tests' TESTDIR = 'tests'
ICONDIR = 'icons'
VERSION = '0.1+pre.01' VERSION = '0.1+pre.01'
#-----------------------------------Configuration #-----------------------------------Configuration
@ -53,13 +56,13 @@ def setupBasicEnvironment():
EnsureSConsVersion(0,96,90) EnsureSConsVersion(0,96,90)
opts = defineCmdlineOptions() opts = defineCmdlineOptions()
env = LumieraEnvironment(options=opts)
env = Environment(options=opts)
env.Append ( CCCOM=' -std=gnu99') # workaround for a bug: CCCOM currently doesn't honor CFLAGS, only CCFLAGS env.Append ( CCCOM=' -std=gnu99') # workaround for a bug: CCCOM currently doesn't honor CFLAGS, only CCFLAGS
env.Replace( VERSION=VERSION env.Replace( VERSION=VERSION
, SRCDIR=SRCDIR , SRCDIR=SRCDIR
, BINDIR=BINDIR , BINDIR=BINDIR
, 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
@ -74,7 +77,7 @@ def setupBasicEnvironment():
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')
prepareOptionsHelp(opts,env) prepareOptionsHelp(opts,env)
opts.Save(OPTIONSCACHEFILE, env) opts.Save(OPTIONSCACHEFILE, env)
return env return env
@ -127,7 +130,7 @@ def defineCmdlineOptions():
,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 dev documentaionl', '..', PathOption.PathAccept)
) )
return opts return opts
@ -161,38 +164,42 @@ def configurePlatform(env):
setup platform specific options. setup platform specific options.
Abort build in case of failure. Abort build in case of failure.
""" """
conf = Configure(env) conf = env.Configure()
# run all configuration checks in the current env # run all configuration checks in the given env
# Perform checks for prerequisites --------------------------------------------
if not conf.TryAction('pkg-config --version > $TARGET')[0]:
print 'We need pkg-config for including library configurations, exiting.'
Exit(1)
# Checks for prerequisites ------------
if not conf.CheckLibWithHeader('m', 'math.h','C'): if not conf.CheckLibWithHeader('m', 'math.h','C'):
print 'Did not find math.h / libm, exiting.' print 'Did not find math.h / libm, exiting.'
Exit(1) Exit(1)
if not conf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'): if not conf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'):
print 'Functions for runtime dynamic loading not available, exiting.' print 'Functions for runtime dynamic loading not available, exiting.'
Exit(1) Exit(1)
if not conf.CheckLibWithHeader('nobugmt', 'nobug.h', 'C'): if not conf.CheckLibWithHeader('nobugmt', 'nobug.h', 'C'):
print 'Did not find NoBug [http://www.pipapo.org/pipawiki/NoBug], exiting.' print 'Did not find NoBug [http://www.pipapo.org/pipawiki/NoBug], exiting.'
Exit(1) Exit(1)
if not conf.CheckLibWithHeader('pthread', 'pthread.h', 'C'): if not conf.CheckLibWithHeader('pthread', 'pthread.h', 'C'):
print 'Did not find the pthread lib or pthread.h, exiting.' print 'Did not find the pthread lib or pthread.h, exiting.'
else: else:
conf.env.Append(CPPFLAGS = ' -DHAVE_PTHREAD') conf.env.Append(CPPFLAGS = ' -DHAVE_PTHREAD')
conf.env.Append(CCFLAGS = ' -pthread') conf.env.Append(CCFLAGS = ' -pthread')
if conf.CheckCHeader('execinfo.h'): if conf.CheckCHeader('execinfo.h'):
conf.env.Append(CPPFLAGS = ' -DHAS_EXECINFO_H') conf.env.Append(CPPFLAGS = ' -DHAS_EXECINFO_H')
if conf.CheckCHeader('valgrind/valgrind.h'): if conf.CheckCHeader('valgrind/valgrind.h'):
conf.env.Append(CPPFLAGS = ' -DHAS_VALGRIND_VALGIND_H') conf.env.Append(CPPFLAGS = ' -DHAS_VALGRIND_VALGIND_H')
if not conf.CheckCXXHeader('tr1/memory'): if not conf.CheckCXXHeader('tr1/memory'):
print 'We rely on the std::tr1 proposed standard extension for shared_ptr.' print 'We rely on the std::tr1 proposed standard extension for shared_ptr.'
Exit(1) Exit(1)
if not conf.CheckCXXHeader('boost/config.hpp'): if not conf.CheckCXXHeader('boost/config.hpp'):
print 'We need the C++ boost-lib.' print 'We need the C++ boost-lib.'
Exit(1) Exit(1)
@ -206,8 +213,36 @@ 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++'):
print 'We need the boost regular expression lib (incl. binary lib for linking).' print 'We need the boost regular expression lib (incl. binary lib for linking).'
Exit(1) Exit(1)
# if not conf.CheckLibWithHeader('gavl', ['gavlconfig.h', 'gavl/gavl.h'], 'C'):
if not conf.CheckPkgConfig('gavl', 1.0):
print 'Did not find Gmerlin Audio Video Lib [http://gmerlin.sourceforge.net/gavl.html], exiting.'
Exit(1)
else:
conf.env.mergeConf('gavl')
if not conf.CheckPkgConfig('gtkmm-2.4', 2.8):
print 'Unable to configure GTK--, exiting.'
Exit(1)
if not conf.CheckPkgConfig('cairomm-1.0', 0.6):
print 'Unable to configure Cairo--, exiting.'
Exit(1)
if not conf.CheckPkgConfig('gdl-1.0', '0.6.1'):
print 'Unable to configure the GNOME DevTool Library, exiting.'
Exit(1)
if not conf.CheckPkgConfig('xv'): Exit(1)
# if not conf.CheckPkgConfig('xext'): Exit(1)
# if not conf.CheckPkgConfig('sm'): Exit(1)
#
# obviously not needed?
print "** Gathered Library Info: %s" % conf.env.libInfo.keys()
# create new env containing the finished configuration # create new env containing the finished configuration
return conf.Finish() return conf.Finish()
@ -221,7 +256,7 @@ def definePackagingTargets(env, artifacts):
artifacts['src.tar'] = t artifacts['src.tar'] = t
env.Alias('src.tar', t) env.Alias('src.tar', t)
env.Alias('tar', t) env.Alias('tar', t)
t = Tarball(env,location='$DOCTAR',suffix='-doc',dirs='admin doc wiki uml tests') t = Tarball(env,location='$DOCTAR',suffix='-doc',dirs='admin doc wiki uml tests')
artifacts['doc.tar'] = t artifacts['doc.tar'] = t
env.Alias('doc.tar', t) env.Alias('doc.tar', t)
@ -240,7 +275,7 @@ def defineBuildTargets(env, artifacts):
objlib = ( srcSubtree(env,'$SRCDIR/common') objlib = ( srcSubtree(env,'$SRCDIR/common')
+ srcSubtree(env,'$SRCDIR/lib') + srcSubtree(env,'$SRCDIR/lib')
) )
plugobj = srcSubtree(env,'$SRCDIR/plugin', isShared=True) objplug = srcSubtree(env,'$SRCDIR/plugin', isShared=True)
core = ( env.StaticLibrary('$BINDIR/lumiback.la', objback) core = ( env.StaticLibrary('$BINDIR/lumiback.la', objback)
+ env.StaticLibrary('$BINDIR/lumiproc.la', objproc) + env.StaticLibrary('$BINDIR/lumiproc.la', objproc)
+ env.StaticLibrary('$BINDIR/lumi.la', objlib) + env.StaticLibrary('$BINDIR/lumi.la', objlib)
@ -253,7 +288,16 @@ def defineBuildTargets(env, artifacts):
env.Depends(objlib, precomp) env.Depends(objlib, precomp)
artifacts['lumiera'] = env.Program('$BINDIR/lumiera', ['$SRCDIR/main.cpp']+ core ) artifacts['lumiera'] = env.Program('$BINDIR/lumiera', ['$SRCDIR/main.cpp']+ core )
artifacts['plugins'] = env.SharedLibrary('$BINDIR/lumiera-plugin', plugobj) artifacts['plugins'] = env.SharedLibrary('$BINDIR/lumiera-plugin', objplug)
# the Lumiera GTK GUI
envgtk = env.Clone().mergeConf(['gtkmm-2.4','cairomm-1.0','gdl-1.0','xv','xext','sm'])
objgui = srcSubtree(envgtk,'$SRCDIR/gui')
artifacts['lumigui'] = ( envgtk.Program('$BINDIR/lumigui', objgui + core)
+ env.Install('$BINDIR', env.Glob('$ICONDIR/*.png'))
+ env.Install('$BINDIR', env.Glob('$SRCDIR/gui/*.rc'))
)
# call subdir SConscript(s) for independent components # call subdir SConscript(s) for independent components
SConscript(dirs=[SRCDIR+'/tool'], exports='env artifacts core') SConscript(dirs=[SRCDIR+'/tool'], exports='env artifacts core')
@ -269,13 +313,13 @@ def definePostBuildTargets(env, artifacts):
il = env.Alias('install-lib', '$DESTDIR/lib') il = env.Alias('install-lib', '$DESTDIR/lib')
env.Alias('install', [ib, il]) env.Alias('install', [ib, il])
build = env.Alias('build', artifacts['lumiera']+artifacts['plugins']+artifacts['tools']) build = env.Alias('build', artifacts['lumiera']+artifacts['lumigui']+artifacts['plugins']+artifacts['tools'])
allbu = env.Alias('allbuild', build+artifacts['testsuite']) allbu = env.Alias('allbuild', build+artifacts['testsuite'])
env.Default('build') env.Default('build')
# additional files to be cleaned when cleaning 'build' # additional files to be cleaned when cleaning 'build'
env.Clean ('build', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log' ]) env.Clean ('build', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log' ])
env.Clean ('build', [ '$SRCDIR/pre.gch' ]) env.Clean ('build', [ '$SRCDIR/pre.gch' ])
# Doxygen documentation # Doxygen documentation
# Note: at the moment we only depend on Doxyfile # Note: at the moment we only depend on Doxyfile
# obviousely, we should depend on all sourcefiles # obviousely, we should depend on all sourcefiles

View file

@ -90,6 +90,18 @@ def globRootdirs(roots):
def filterNodes(nlist, removeName=None):
""" filter out scons build nodes using the given criteria.
removeName: if set, remove all nodes with this srcname
"""
if removeName:
predicate = lambda n : not fnmatch.fnmatch(os.path.basename(str(n[0])), removeName)
else:
predicate = lambda n : True;
return filter(predicate, nlist)
def RegisterPrecompiledHeader_Builder(env): def RegisterPrecompiledHeader_Builder(env):
""" Registeres an Custom Builder for generating a precompiled Header. """ Registeres an Custom Builder for generating a precompiled Header.
Note you should define a dependency to the PCH file Note you should define a dependency to the PCH file
@ -111,7 +123,7 @@ def RegisterPrecompiledHeader_Builder(env):
def Tarball(env,location,dirs,suffix=''): def Tarball(env,location,dirs,suffix=''):
""" Custom Command: create Tarball of some subdirs """ Custom Command: create Tarball of some subdirs
location: where to create the tar (optionally incl. filename.tar.gz) location: where to create the tar (may optionally include filename.tar.gz)
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
@ -132,7 +144,7 @@ def Tarball(env,location,dirs,suffix=''):
def createTarball(target,source,env): def createTarball(target,source,env):
""" helper, builds the tar using the python2.3 tarfil lib. """ helper, builds the tar using the python2.3 tarfile lib.
This allows us to prefix all paths, thus moving the tree This allows us to prefix all paths, thus moving the tree
into a virtual subdirectory containing the Version number, into a virtual subdirectory containing the Version number,
as needed by common packaging systems. as needed by common packaging systems.

View file

@ -0,0 +1,97 @@
# -*- python -*-
##
## LumieraEnvironment.py - custom SCons Environment
##
# Copyright (C) Lumiera.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.
#####################################################################
from SCons.SConf import SConf
from SCons.Environment import Environment
from Buildhelper import *
class LumieraEnvironment(Environment):
""" Custom SCons build environment for Lumiera
This allows us to carry structured config data without
using global vars. Idea inspired by Ardour.
"""
def __init__(self,*args,**kw):
Environment.__init__ (self,*args,**kw)
self.libInfo = {}
def Configure (self, *args, **kw):
kw['env'] = self
return apply(LumieraConfigContext, args, kw)
def mergeConf (self,other):
""" extract the library/compiler flags from other Environment.
Optionally accepts a list or just sting(s) representing keys
in our own libInfo Dictionary
"""
if isinstance(other, list):
for elm in other:
self.mergeConf(elm)
elif isinstance(other, str):
if other in self.libInfo:
self.mergeConf(self.libInfo[other])
else:
self.Append (LIBS = other.get ('LIBS',[]))
self.Append (LIBPATH = other.get ('LIBPATH', []))
self.Append (CPPPATH = other.get('CPPPATH', []))
self.Append (LINKFLAGS = other.get('LINKFLAGS', []))
return self
def addLibInfo (self, libID, minVersion=0):
""" use pkg-config to create an Environment describing the lib.
Don't add this defs to the current Environment, rather store
them in the libInfo Dictionary.
"""
minVersion = str(minVersion)
if 0 != os.system('pkg-config --print-errors --exists "%s >= %s"' % (libID,minVersion)):
print "Problems configuring the Library %s (>= %s)" % (libID,minVersion)
return False
self.libInfo[libID] = libInfo = LumieraEnvironment()
libInfo.ParseConfig ('pkg-config --cflags --libs '+ libID )
return libInfo
def Glob (self, pattern):
""" temporary workaround; newer versions of SCons provide this as a global function
"""
pattern = self.subst(pattern)
return glob.glob(pattern)
class LumieraConfigContext(SConf):
""" Extends the SCons Configure context with some convenience methods
"""
def __init__(self, *args,**kw):
SConf.__init__(self,*args,**kw)
def CheckPkgConfig (self, libID, minVersion=0):
print "Checking for library configuration: %s " % libID
# self.Message(self,"Checking for library configuration: %s " % libID)
return self.env.addLibInfo (libID, minVersion)

157
src/gui/lumiera_ui.rc Normal file
View file

@ -0,0 +1,157 @@
#
# This is the GTK style file for Lumiera
#
#
#---------- Styles for Standard Widgets ----------#
style "medium_text"
{
font_name = "sans 10"
}
style "medium_bold_entry" = "medium_text"
{
fg[NORMAL] = { 0.70, 0.70, 0.70 }
fg[ACTIVE] = { 0.70, 0.70, 0.70 }
bg[NORMAL] = { 0.35, 0.35, 0.40 }
base[NORMAL] = { 0, 0, 0 }
base[ACTIVE] = { 0, 0, 0 }
base[SELECTED] = { 0, 0, 0 }
}
style "default_base" = "medium_text"
{
GtkWidget::cursor_color = {1.0, 1.0, 1.0 }
GtkButton::default_border = { 0, 0, 0, 0 }
GtkButton::default_outside_border = { 0, 0, 0, 0 }
GtkTreeView::vertical-padding = 0
GtkTreeView::horizontal-padding = 0
GtkTreeView::even-row-color = { 0, 0, 0 }
GtkTreeView::odd-row-color = { 0, 0, 0 }
fg[NORMAL] = { 0.80, 0.80, 0.80 }
fg[ACTIVE] = { 0.80, 0.80, 0.80 }
fg[PRELIGHT] = { 1.0, 1.0, 1.0 }
fg[INSENSITIVE] = { 0.80, 0.80, 0.80 }
fg[SELECTED] = { 0.80, 0.80, 0.80 }
bg[NORMAL] = { 0.35, 0.35, 0.40 }
bg[ACTIVE] = { 0.35, 0.35, 0.40 }
bg[PRELIGHT] = "#565690"
bg[INSENSITIVE] = { 0.10, 0.10, 0.10 }
bg[SELECTED] = { 0, 0.40, 0.60 }
text[NORMAL] = { 0.80, 0.80, 0.80 }
text[ACTIVE] = { 0.80, 0.80, 0.80 }
text[PRELIGHT] = { 0.80, 0.80, 0.80 }
text[INSENSITIVE] = { 0.80, 0.80, 0.80}
text[SELECTED] = { 1.0, 1.0, 1.0 }
base[ACTIVE] = "#272a2f"
base[NORMAL] = "#1a1e20"
base[PRELIGHT] = { 0.20, 0.20, 0.20 }
base[INSENSITIVE] = "#4c5159"
base[SELECTED] = { 0.25, 0.25, 0.25 }
engine "clearlooks"
{
menubarstyle = 2 # 0 = flat, 1 = sunken, 2 = flat gradient
# menuitemstyle = 1 # 0 = flat, 1 = 3d-ish (gradient), 2 = 3d-ish (button)
# listviewitemstyle = 1 # 0 = flat, 1 = 3d-ish (gradient)
# progressbarstyle = 1 # 0 = candy bar, 1 = fancy candy bar, 2 = flat
}
}
style "default_buttons_menus"
{
font_name = "sans 10"
fg[ACTIVE] = { 1.0, 1.0, 1.0 }
bg[NORMAL] = { 0.30, 0.30, 0.35 }
bg[ACTIVE] = "#565690"
bg[PRELIGHT] = { 0.15, 0.15, 0.20 }
bg[INSENSITIVE] = { 0.15, 0.15, 0.20 }
bg[SELECTED] = { 0.15, 0.15, 0.20 }
}
style "lumiera_adjusters" = "default_buttons_menus"
{
fg[NORMAL] = { 0.80, 0.80, 0.80 }
fg[ACTIVE] = { 0.80, 0.80, 0.80 }
fg[PRELIGHT] = { 1.0, 1.0, 1.0 }
fg[INSENSITIVE] = { 0.80, 0.80, 0.80 }
fg[SELECTED] = { 0.80, 0.80, 0.80 }
bg[NORMAL] = { 0.35, 0.35, 0.40 }
bg[ACTIVE] = { 0.35, 0.35, 0.40 }
bg[PRELIGHT] = "#565690"
bg[INSENSITIVE] = { 0.10, 0.10, 0.10 }
bg[SELECTED] = { 0, 0.40, 0.60 }
}
style "lumiera_progressbars" = "default_buttons_menus"
{
bg[NORMAL] = { 0, 0, 0 }
bg[PRELIGHT] = { 0.00, 0.36, 0.40 }
}
style "lumiera_button" = "default_buttons_menus"
{
xthickness = 1
ythickness = 1
}
style "tearoff_arrow" = "medium_bold_entry"
{
fg[NORMAL] = { 0.80, 0.80, 0.80 }
fg[PRELIGHT] = { 0.80, 0.80, 0.80 }
bg[NORMAL] = { 0.80, 0.80, 0.80 }
bg[PRELIGHT] = { 0.80, 0.80, 0.80 }
}
class "GtkWidget" style:highest "default_base"
class "GtkScrollbar" style:highest "lumiera_adjusters"
class "GtkLabel" style:highest "default_buttons_menus"
class "GtkButton" style:highest "lumiera_button"
class "GtkArrow" style:highest "tearoff_arrow"
class "GtkProgressBar" style:highest "lumiera_progressbars"
#---------- Styles for Lumiera Widgets ----------#
style "timeline_body"
{
gtkmm__CustomObject_TimelineBody::background = "#7E838B"
}
style "timeline_ruler" = "default_base"
{
font_name = "sans 8"
gtkmm__CustomObject_TimelineRuler::height = 18
gtkmm__CustomObject_TimelineRuler::major_tick_height = 18
gtkmm__CustomObject_TimelineRuler::minor_long_tick_height = 6
gtkmm__CustomObject_TimelineRuler::minor_short_tick_height = 3
gtkmm__CustomObject_TimelineRuler::annotation_horz_margin = 3
gtkmm__CustomObject_TimelineRuler::annotation_vert_margin = 0
gtkmm__CustomObject_TimelineRuler::min_division_width = 100
gtkmm__CustomObject_TimelineRuler::mouse_chevron_size = 5
}
style "timeline_header_base" = "default_base"
{
# fg[NORMAL] = { 0.77, 0.77, 0.72 }
# bg[NORMAL] = { 0.18, 0.19, 0.22 }
# bg[ACTIVE] = { 0.20, 0.20, 0.20 }
# bg[PRELIGHT] = { 0.20, 0.20, 0.20 }
# bg[INSENSITIVE] = { 0.20, 0.20, 0.20 }
# bg[SELECTED] = { 0.20, 0.20, 0.20 }
}
class "gtkmm__CustomObject_TimelineBody" style:highest "timeline_body"
class "gtkmm__CustomObject_TimelineRuler" style:highest "timeline_ruler"
widget "*TimelineHeaderBaseUnselected" style:highest "timeline_header_base"