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
*.gch
,valgrind.log*
Buildhelper.pyc
admin/scons/*.pyc
optcache
Makefile.in
build/*

View file

@ -26,6 +26,8 @@ sys.path.append("./admin/scons")
import os
from Buildhelper import *
from LumieraEnvironment import *
#-----------------------------------Configuration
OPTIONSCACHEFILE = 'optcache'
@ -33,6 +35,7 @@ CUSTOPTIONSFILE = 'custom-options'
SRCDIR = 'src'
BINDIR = 'bin'
TESTDIR = 'tests'
ICONDIR = 'icons'
VERSION = '0.1+pre.01'
#-----------------------------------Configuration
@ -53,13 +56,13 @@ def setupBasicEnvironment():
EnsureSConsVersion(0,96,90)
opts = defineCmdlineOptions()
env = Environment(options=opts)
env = LumieraEnvironment(options=opts)
env.Append ( CCCOM=' -std=gnu99') # workaround for a bug: CCCOM currently doesn't honor CFLAGS, only CCFLAGS
env.Replace( VERSION=VERSION
, SRCDIR=SRCDIR
, BINDIR=BINDIR
, ICONDIR=ICONDIR
, 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
, CCFLAGS='-Wall ' # -fdiagnostics-show-option
@ -74,7 +77,7 @@ def setupBasicEnvironment():
appendVal(env,'ARCHFLAGS', 'CCFLAGS') # for both C and C++
appendVal(env,'OPTIMIZE', 'CCFLAGS', val=' -O3')
appendVal(env,'DEBUG', 'CCFLAGS', val=' -ggdb')
prepareOptionsHelp(opts,env)
opts.Save(OPTIONSCACHEFILE, env)
return env
@ -127,7 +130,7 @@ def defineCmdlineOptions():
,PathOption('SRCTAR', 'Create source tarball prior to compiling', '..', PathOption.PathAccept)
,PathOption('DOCTAR', 'Create tarball with dev documentaionl', '..', PathOption.PathAccept)
)
return opts
@ -161,38 +164,42 @@ def configurePlatform(env):
setup platform specific options.
Abort build in case of failure.
"""
conf = Configure(env)
# run all configuration checks in the current env
conf = env.Configure()
# 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'):
print 'Did not find math.h / libm, exiting.'
Exit(1)
if not conf.CheckLibWithHeader('dl', 'dlfcn.h', 'C'):
print 'Functions for runtime dynamic loading not available, exiting.'
Exit(1)
if not conf.CheckLibWithHeader('nobugmt', 'nobug.h', 'C'):
print 'Did not find NoBug [http://www.pipapo.org/pipawiki/NoBug], exiting.'
Exit(1)
if not conf.CheckLibWithHeader('pthread', 'pthread.h', 'C'):
print 'Did not find the pthread lib or pthread.h, exiting.'
else:
conf.env.Append(CPPFLAGS = ' -DHAVE_PTHREAD')
conf.env.Append(CCFLAGS = ' -pthread')
if conf.CheckCHeader('execinfo.h'):
conf.env.Append(CPPFLAGS = ' -DHAS_EXECINFO_H')
if conf.CheckCHeader('valgrind/valgrind.h'):
conf.env.Append(CPPFLAGS = ' -DHAS_VALGRIND_VALGIND_H')
if not conf.CheckCXXHeader('tr1/memory'):
print 'We rely on the std::tr1 proposed standard extension for shared_ptr.'
Exit(1)
if not conf.CheckCXXHeader('boost/config.hpp'):
print 'We need the C++ boost-lib.'
Exit(1)
@ -206,8 +213,36 @@ def configurePlatform(env):
if not conf.CheckLibWithHeader('boost_regex-mt','boost/regex.hpp','C++'):
print 'We need the boost regular expression lib (incl. binary lib for linking).'
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
return conf.Finish()
@ -221,7 +256,7 @@ def definePackagingTargets(env, artifacts):
artifacts['src.tar'] = t
env.Alias('src.tar', t)
env.Alias('tar', t)
t = Tarball(env,location='$DOCTAR',suffix='-doc',dirs='admin doc wiki uml tests')
artifacts['doc.tar'] = t
env.Alias('doc.tar', t)
@ -240,7 +275,7 @@ def defineBuildTargets(env, artifacts):
objlib = ( srcSubtree(env,'$SRCDIR/common')
+ 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)
+ env.StaticLibrary('$BINDIR/lumiproc.la', objproc)
+ env.StaticLibrary('$BINDIR/lumi.la', objlib)
@ -253,7 +288,16 @@ def defineBuildTargets(env, artifacts):
env.Depends(objlib, precomp)
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
SConscript(dirs=[SRCDIR+'/tool'], exports='env artifacts core')
@ -269,13 +313,13 @@ def definePostBuildTargets(env, artifacts):
il = env.Alias('install-lib', '$DESTDIR/lib')
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'])
env.Default('build')
# additional files to be cleaned when cleaning 'build'
env.Clean ('build', [ 'scache.conf', '.sconf_temp', '.sconsign.dblite', 'config.log' ])
env.Clean ('build', [ '$SRCDIR/pre.gch' ])
# Doxygen documentation
# Note: at the moment we only depend on Doxyfile
# 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):
""" Registeres an Custom Builder for generating a precompiled Header.
Note you should define a dependency to the PCH file
@ -111,7 +123,7 @@ def RegisterPrecompiledHeader_Builder(env):
def Tarball(env,location,dirs,suffix=''):
""" 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
dirs: directories to include in the tar
@ -132,7 +144,7 @@ def Tarball(env,location,dirs,suffix=''):
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
into a virtual subdirectory containing the Version number,
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"