Skip to content
Snippets Groups Projects
senfutil.py 3.94 KiB
Newer Older
import os.path
from SCons.Script import *

def parseLogOption(value):
    stream, area, level = ( x.strip() for x in value.strip().split('|') )
    stream = ''.join('(%s)' % x for x in stream.split('::') )
    if area : area = ''.join( '(%s)' % x for x in area.split('::') )
    else    : area = '(_)'
    return '((%s,%s,%s))' % (stream,area,level)
def expandLogOption(target, source, env, for_signature):
    if env.get('LOGLEVELS'):
        return [ 'SENF_LOG_CONF="' + ''.join( parseLogOption(x) for x in env.subst('$LOGLEVELS').split() )+'"']
    else:
        return []
###########################################################################
# This looks much more complicated than it is: We do three things here:
# a) switch between final or debug options
# b) parse the LOGLEVELS parameter into the correct SENF_LOG_CONF syntax
# c) check for a local SENF, set options accordingly and update that SENF if needed

def SetupForSENF(env):
    env.Append( LIBS           = [ 'senf', 'rt', '$BOOSTREGEXLIB',
                                   '$BOOSTIOSTREAMSLIB', '$BOOSTSIGNALSLIB',
                                   '$BOOSTFSLIB' ],
                BOOSTREGEXLIB  = 'boost_regex',
                BOOSTIOSTREAMSLIB = 'boost_iostreams',
                BOOSTSIGNALSLIB = 'boost_signals',
                BOOSTFSLIB = 'boost_filesystem',
                                   '${"$CXXFLAGS_"+(final and "final" or "debug")}',
                                   '${profile and ("-g","-pg") or None}' ],
                LINKFLAGS      = [ '${"$LINKFLAGS_"+(final and "final" or "debug")}',
                                   '${profile and "-pg" or None}' ],
                SENF_BUILDOPTS = [ '-j%s' % (env.GetOption('num_jobs') or "1") ],
                CXXFLAGS_debug  = [ '-O0', '-g', '-fno-inline' ],
                LINKFLAGS_debug = [ '-g', '-rdynamic' ],
                
                expandLogOption = expandLogOption,
                CPPDEFINES      = [ '$expandLogOptions' ],
                )

    # Add command-line options: 'LOGLEVELS' and 'final'
    opts = Options()
    opts.Add( 'LOGLEVELS', 'Special log levels. Syntax: <stream>|[<area>]|<level> ...',
              '${"$LOGLEVELS_"+(final and "final" or "debug")}' )
    opts.Add( BoolOption('final', 'Build final (optimized) build', False) )
    opts.Add( BoolOption('debug', 'Link in debug symbols', False) )
    opts.Add( BoolOption('profile', 'Add profile information', False) )
    opts.Update(env)

    env.Help(opts.GenerateHelpText(env))

    # If we have a symbolic link (or directory) 'senf', we use it as our
    # senf repository
    if os.path.exists('senf'):
        print "\nUsing SENF in './senf'\n"
        env.Append( LIBPATH = [ 'senf' ],
                    CPPPATH = [ 'senf/include' ],
                    SENF_BUILDOPTS = [ '${final and "final=1" or None}',
                                       '${debug and "debug=1" or None}',
                                       '${profile and "profile=1" or None}' ],
                    CPPDEFINES = [ '${not(final) and "SENF_DEBUG" or None}' ] )

        #env.Default(
        #    env.AlwaysBuild(
        #        env.Command('senf/libsenf.a', [],  [ 'scons -C %s $SENF_BUILDOPTS libsenf.a' % os.path.realpath('senf')])))
    elif os.path.exists('../senf'):
        print "\nUsing SENF in '../senf'\n"
        env.Append( LIBPATH = [ '../senf' ],
                    CPPPATH = [ '../senf/include' ],
                    SENF_BUILDOPTS = [ '${final and "final=1" or None}',
                                       '${debug and "debug=1" or None}',
                                       '${profile and "profile=1" or None}' ],
                    CPPDEFINES = [ '${not(final) and "SENF_DEBUG" or None}' ] )

        #env.Default(
        #    env.AlwaysBuild(
        #        env.Command('senf/libsenf.a', [],  [ 'scons -C %s $SENF_BUILDOPTS libsenf.a' % os.path.realpath('senf')])))