From 764a38abe641fb52ae7c3f20498132554fc9436a Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Fri, 28 Jan 2011 23:31:00 +0100 Subject: [PATCH] SCons: experimental support for some library lookup concerns - setting -rpath with $ORIGIN to build a relocatable package - fix missing DT_SONAME (likely just a problem of very old SCons version) --- SConstruct | 10 +++---- admin/scons/LumieraEnvironment.py | 46 +++++++++++++++++++++++++++++++ src/tool/SConscript | 8 +++--- tests/SConscript | 6 ++-- 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/SConstruct b/SConstruct index eaf03c54e..958ba3328 100644 --- a/SConstruct +++ b/SConstruct @@ -337,14 +337,14 @@ def defineBuildTargets(env, artifacts): - lApp = env.SharedLibrary('$LIBDIR/lumieracommon', srcSubtree(env,'$SRCDIR/common')) - lBack = env.SharedLibrary('$LIBDIR/lumierabackend', srcSubtree(env,'$SRCDIR/backend')) - lProc = env.SharedLibrary('$LIBDIR/lumieraproc', srcSubtree(env,'$SRCDIR/proc')) - lLib = env.SharedLibrary('$LIBDIR/lumiera', srcSubtree(env,'$SRCDIR/lib')) + lLib = env.LumieraLibrary('$LIBDIR/lumiera', srcSubtree(env,'$SRCDIR/lib')) + lApp = env.LumieraLibrary('$LIBDIR/lumieracommon', srcSubtree(env,'$SRCDIR/common'), LIBS=lLib) + lBack = env.LumieraLibrary('$LIBDIR/lumierabackend', srcSubtree(env,'$SRCDIR/backend')) + lProc = env.LumieraLibrary('$LIBDIR/lumieraproc', srcSubtree(env,'$SRCDIR/proc')) core = lLib+lApp+lBack+lProc - artifacts['lumiera'] = env.Program('$BINDIR/lumiera', ['$SRCDIR/lumiera/main.cpp'], LIBS=core) + artifacts['lumiera'] = env.LumieraExe('$BINDIR/lumiera', ['$SRCDIR/lumiera/main.cpp'], LIBS=core) artifacts['corelib'] = lLib+lApp artifacts['support'] = lLib diff --git a/admin/scons/LumieraEnvironment.py b/admin/scons/LumieraEnvironment.py index 8b6a4b594..6f2f188b3 100644 --- a/admin/scons/LumieraEnvironment.py +++ b/admin/scons/LumieraEnvironment.py @@ -27,6 +27,7 @@ import SCons.SConf from SCons.Environment import Environment from Buildhelper import * +from os import path @@ -79,6 +80,51 @@ class LumieraEnvironment(Environment): if alias: self.libInfo[alias] = libInfo return libInfo + + + def LumieraLibrary (self, *args,**kw): + """ add some tweaks missing in SCons 1.0 + like proper handling for SONAME + """ + print "hurgha" + if 'soname' in kw: + soname = self.subst(kw['soname']) + else: + if len(args) > 0: + pathname = args[0] + elif 'target' in kw: + pathname = kw['target'] + else: + raise SyntaxError("Library builder requires target spec. Arguments: %s %s" % (args,kw)) + print "SharedLib: path=%s" % pathname + (dirprefix, libname) = path.split(pathname) + if not libname: + raise ValueError("Library name missing. Only got a directory: "+pathname) + libname = "${SHLIBPREFIX}%s$SHLIBSUFFIX" % libname + print "name = "+libname + soname = self.subst(libname) + print "konstruierter name "+soname + + assert soname + subEnv = self.Clone() + subEnv.Append(LINKFLAGS = "-Wl,-soname="+soname ) + + libBuilder = self.get_builder('SharedLibrary') + print "libBuilder=%s" % libBuilder + print "args = %s, kw = %s" % (args,kw) + return libBuilder(subEnv, *args,**kw); + + + def LumieraExe (self, *args,**kw): + """ add handling for rpath with $ORIGIN + """ + print "progrom" + + subEnv = self.Clone() + subEnv.Append( LINKFLAGS = "-Wl,-rpath=\\$$ORIGIN/$LIBDIR,--enable-new-dtags" ) + + programBuilder = self.get_builder('Program') + return programBuilder (subEnv, *args,**kw); diff --git a/src/tool/SConscript b/src/tool/SConscript index bae8d7d12..0930ffbe3 100644 --- a/src/tool/SConscript +++ b/src/tool/SConscript @@ -12,12 +12,12 @@ envSvg.mergeConf(['librsvg-2.0']) envSvg.Append(LIBS=support_lib) -luidgen = env.Program('#$BINDIR/luidgen', 'luidgen.c', LIBS=support_lib) ## for generating Lumiera-UIDs -rsvg = envSvg.Program('#$BINDIR/rsvg-convert','rsvg-convert.c') ## for rendering SVG icons (uses librsvg) +luidgen = env.LumieraExe('#$BINDIR/luidgen', 'luidgen.c', LIBS=support_lib) ## for generating Lumiera-UIDs +rsvg = envSvg.LumieraExe('#$BINDIR/rsvg-convert','rsvg-convert.c') ## for rendering SVG icons (uses librsvg) # build additional test and administrative tools.... -artifacts['tools'] = [ env.Program('#$BINDIR/hello-world','hello.c') #### hello world (checks C build) - + env.Program('#$BINDIR/try', 'try.cpp') #### to try out some feature... +artifacts['tools'] = [ env.LumieraExe('#$BINDIR/hello-world','hello.c') #### hello world (checks C build) + + env.LumieraExe('#$BINDIR/try', 'try.cpp') #### to try out some feature... # + luidgen + rsvg ] diff --git a/tests/SConscript b/tests/SConscript index 5e97f03e6..8dcfe4bf3 100644 --- a/tests/SConscript +++ b/tests/SConscript @@ -35,7 +35,7 @@ def testExecutable(env,tree, exeName=None, obj=None): obj = srcSubtree(env,tree, isShared=False) # use all sourcefiles found in subtree if not exeName: exeName = 'test-%s' % tree - return env.Program('#$BINDIR/'+exeName, obj + core) + return env.LumieraExe('#$BINDIR/'+exeName, obj + core) def testCollection(env,dir): @@ -44,7 +44,7 @@ def testCollection(env,dir): """ srcpatt = ['test-*.c'] exeName = lambda p: path.basename(path.splitext(p)[0]) - buildIt = lambda p: env.Program("#$BINDIR/"+exeName(p), [p] + core) + buildIt = lambda p: env.LumieraExe("#$BINDIR/"+exeName(p), [p] + core) return [buildIt(f) for f in scanSubtree(dir,srcpatt)] @@ -67,7 +67,7 @@ artifacts['testsuite'] = ts = ( [ testExecutable(env, dir) for dir in ['bugs'] ] # for creating a Valgrind-Suppression file -vgsuppr = env.Program('#$BINDIR/vgsuppression','tool/vgsuppression.c', LIBS=core) ## for suppressing false valgrind alarms +vgsuppr = env.LumieraExe('#$BINDIR/vgsuppression','tool/vgsuppression.c', LIBS=core) ## for suppressing false valgrind alarms artifacts['tools'] += [vgsuppr] Depends(ts,vgsuppr)