All pastes #885785 Raw Edit

Stuff

public text v1 · immutable
#885785 ·published 2008-01-31 03:06 UTC
rendered paste body
# this will emerge some programs...

# call this with "emerge.py <packageName> <action>"
# where packageName is the program you want to install
# and action is the action you want to do, see base.py
#
# copyright:
# Holger Schroeder <holger [AT] holgis [DOT] net>
# Patrick Spendrin <ps_ml [AT] gmx [DOT] de>

# syntax:
# emerge <options> <action> <packageName>
#
# action can be:
# --fetch, --unpack, --compile, --install, --qmerge
#
# options can be:
# -p for pretend

import sys
import os
import utils

def usage():
    print
    print 'Usage: emerge [-f|-p|-q|-v|--offline][--compile|--fetch|--full-package|'
    print '               --install|--manifest|--package|--print-targets|--qmerge|'
    print '               --unmerge|--unpack] PACKAGES'
    print '       emerge [--print-installable|--print-installed]'
    print 'emerge.py is a script for easier building.'
    print
    print 'Flags:'
    print '-p               pretend to do everything - a dry run'
    print '-q               suppress all output'
    print '-f               force removal of files with unmerge'
    print '-v               print additional output (increase the verbosity level)'
    print '--offline        don\'t try to download anything'
    print '--buildtype=[KdeBuildType] where KdeBuildType is one of the used BuildTypes'
    print '                 This will automatically overrun all buildtype definitions'
    print '                 made in the package\'s .py-file'
    print 'Options:'
    print '--compile PACKAGES       configure and build the PACKAGES'
    print '--fetch PACKAGES         just fetch the PACKAGES'
    print '--full-package PACKAGES  make all of the above steps'
    print '--install PACKAGES       install the PACKAGES to an image directory'
    print '--manifest PACKAGES      add the installdb files to the image directory'
    print '--package PACKAGES       package the image directory with the kdewin-packager[*]'
    print '--print-installable      displays packages that can be installed'
    print '--print-installed        displays installed packages'
    print '--print-targets PACKAGES displays targets for PACKAGES'
    print '--qmerge PACKAGES        install the image directories contents to the kderoot'
    print '--unmerge PACKAGES       try to unmerge PACKAGES'
    print '--unpack PACKAGES        unpack the PACKAGES and apply the patches if needed'
    print
    print '[*] - this requires the packager to be installed already.'
    print 'Please see http://windows.kde.org for more information.'
    print 'Send bugs and feature requests to <kde-windows@kde.org>.'
    print

def doExec( category, package, version, action, opts ):
    if utils.verbose() > 2:
        print "emerge doExec called. action: %s opts: %s" % (action, opts)
    fileName = os.path.join( utils.getPortageDir(), category, package, "%s-%s.py" % \
                         ( package, version ) )
    opts_string = ( "%s " * len( opts ) ) % tuple( opts )
    commandstring = "python %s %s %s" % ( fileName, action, opts_string )
    if utils.verbose() > 1:
        print "file:", fileName
        print "commandstring", commandstring
    try:
        utils.system( commandstring ) or utils.die( "running %s" % commandstring )
    except:
        return False
    return True

def handlePackage( category, package, version, buildAction, opts ):
    if utils.verbose() > 1:
        print "emerge handlePackage called: %s %s %s %s" % (category, package, version, buildAction)

    if ( buildAction == "all" or buildAction == "full-package" ):
        success = doExec( category, package, version, "fetch", opts )
        success = success and doExec( category, package, version, "unpack", opts )
        success = success and doExec( category, package, version, "compile", opts )
        success = success and doExec( category, package, version, "cleanimage", opts )
        success = success and doExec( category, package, version, "install", opts )
        if ( buildAction == "all" ):
            success = success and doExec( category, package, version, "manifest", opts )
        if ( buildAction == "all" ):
            success = success and doExec( category, package, version, "qmerge", opts )
        if( buildAction == "full-package" ):
            success = success and doExec( category, package, version, "package", opts )

    elif ( buildAction in [ "fetch", "unpack", "compile", "configure", "make", "qmerge", "package", "manifest", "unmerge" ] ):
        success = doExec( category, package, version, buildAction, opts )
    elif ( buildAction == "install" ):
        success = doExec( category, package, version, "cleanimage", opts )
        success = success and doExec( category, package, version, "install", opts )
    elif ( buildAction == "version-dir" ):
        print "%s-%s" % ( package, version )
        success = True
    elif ( buildAction == "version-package" ):
        print "%s-%s-%s" % ( package, os.getenv( "KDECOMPILER" ), version )
        success = True
    elif ( buildAction == "print-installable" ):
        utils.printInstallables()
        success = True
    elif ( buildAction == "print-installed" ):
        utils.printInstalled()
        success = True
    elif ( buildAction == "print-targets" ):
        utils.printTargets( category, package, version )
        success = True
    else:
        success = utils.error( "could not understand this buildAction: %s" % buildAction )

    return success

buildAction = "all"
packageName = None
doPretend = False
stayQuiet = False
opts = ""
environ = dict()
if len( sys.argv ) < 2:
    usage()
    utils.die("")

environ["EMERGE_NOCOPY"]        = os.getenv( "EMERGE_NOCOPY" )
environ["EMERGE_NOUPDATE"]      = os.getenv( "EMERGE_NOUPDATE" )
environ["EMERGE_NOCLEAN"]       = os.getenv( "EMERGE_NOCLEAN" )
environ["EMERGE_VERBOSE"]       = os.getenv( "EMERGE_VERBOSE" )
environ["EMERGE_BUILDTESTS"]    = os.getenv( "EMERGE_BUILDTESTS" )
environ["EMERGE_OFFLINE"]       = os.getenv( "EMERGE_OFFLINE" )
environ["EMERGE_FORCED"]        = os.getenv( "EMERGE_FORCED" )
environ["EMERGE_VERSION"]       = os.getenv( "EMERGE_VERSION" )
environ["EMERGE_BUILDTYPE"]     = os.getenv( "EMERGE_BUILDTYPE" )
environ["EMERGE_TARGET"]        = os.getenv( "EMERGE_TARGET" )

if ( environ['EMERGE_NOCOPY'] == "True" ):
    nocopy = True
else:
    nocopy = False

if ( environ['EMERGE_NOUPDATE'] == "True" ):
    noupdate = True
else:
    noupdate = False

if environ['EMERGE_VERBOSE'] == None or not environ['EMERGE_VERBOSE'].isdigit():
    verbose = 1
    os.environ["EMERGE_VERBOSE"] = str( verbose )
else:
    verbose = int( environ[ "EMERGE_VERBOSE" ] )
   
opts = list()

executableName = sys.argv.pop( 0 )
for i in sys.argv:
    if ( i == "-p" ):
        doPretend = True
    elif ( i == "-q" ):
        stayQuiet = True
    elif ( i == "-t" ):
        os.environ["EMERGE_BUILDTESTS"] = "True"
    elif ( i == "--offline" ):
        opts.append( "--offline" )
        os.environ["EMERGE_OFFLINE"] = "True"
    elif ( i == "-f" ):
        os.environ["EMERGE_FORCED"] = "True"
    elif ( i.startswith( "--version=" ) ):
        os.environ["EMERGE_VERSION"]   = i.replace( "--version=", "" )
    elif ( i.startswith( "--buildtype=" ) ):
        os.environ["EMERGE_BUILDTYPE"] = i.replace( "--buildtype=", "" )
    elif ( i.startswith( "--target=" ) ):
        os.environ["EMERGE_TARGET"] = i.replace( "--target=", "" )
    elif ( i == "-v" ):
        verbose = verbose + 1
        os.environ["EMERGE_VERBOSE"] = str( verbose )
    elif ( i == "--nocopy" ):
        os.environ["EMERGE_NOCOPY"] = str( True )
    elif ( i == "--noclean" ):
        os.environ["EMERGE_NOCLEAN"] = str( True )
    elif ( i == "--clean" ):
        os.environ["EMERGE_NOCLEAN"] = str( False )
    elif ( i in [ "--version-dir", "--version-package", "--print-installable",
                  "--print-installed", "--print-targets" ] ):
        buildAction = i[2:]
        stayQuiet = True
        if i in [ "--print-installable", "--print-installed" ]:
            break
    elif ( i in [ "--fetch", "--unpack", "--compile", "--configure", "--make",
                  "--install", "--qmerge", "--manifest", "--package", "--unmerge",
                  "--full-package" ] ):
        buildAction = i[2:]
    elif ( i.startswith( "-" ) ):
        usage()
        exit ( 1 )
    else:
        packageName = i
        break

nextArguments = sys.argv[ (sys.argv.index( i ) + 1): ]

if stayQuiet == True:
    verbose = 0
    os.environ["EMERGE_VERBOSE"] = str( verbose )

# get KDEROOT from env
KDEROOT = os.getenv( "KDEROOT" )

if utils.verbose() >= 1:
    print "buildAction:", buildAction
    print "doPretend:", doPretend
    print "packageName:", packageName
    print "buildType:", os.getenv( "EMERGE_BUILDTYPE" )
    print "buildTests:", os.getenv( "EMERGE_BUILDTESTS" )
    print "verbose:", os.getenv( "EMERGE_VERBOSE" )
    print "KDEROOT:", KDEROOT
   
if not os.getenv( "CMAKE_INCLUDE_PATH" ) == None:
    print
    utils.warning( "CMAKE_INCLUDE_PATH found as environment variable. you cannot override emerge"\
                   " with this - unsetting CMAKE_INCLUDE_PATH locally" )
    os.environ["CMAKE_INCLUDE_PATH"]=""

if not os.getenv( "CMAKE_LIBRARY_PATH" ) == None:
    print
    utils.warning( "CMAKE_LIBRARY_PATH found as environment variable. you cannot override emerge"\
                   " with this - unsetting CMAKE_LIBRARY_PATH locally" )
    os.environ["CMAKE_LIBRARY_PATH"]=""

if not os.getenv( "CMAKE_FIND_PREFIX" ) == None:
    print
    utils.warning( "CMAKE_FIND_PREFIX found as environment variable. you cannot override emerge"\
                   " with this - unsetting CMAKE_FIND_PREFIX locally" )
    os.environ["CMAKE_FIND_PREFIX"]=""
   

# adding emerge/bin to find base.py and gnuwin32.py etc.
os.environ["PYTHONPATH"] = os.getenv( "PYTHONPATH" ) + ";" +\
                           os.path.join( os.getcwd(), os.path.dirname( executableName ) )
sys.path.append( os.path.join( os.getcwd(), os.path.dirname( executableName ) ) )

deplist = []

if packageName:
    utils.solveDependencies( "", packageName, "", deplist )
   
if utils.verbose() > 2:
    print "deplist:", deplist

deplist.reverse()

success = True

# package[0] -> category
# package[1] -> package
# package[2] -> version

if ( buildAction != "all" ):
    """if a buildAction is given, then do not try to build dependencies"""
    """and do the action although the package might already be installed"""
    if packageName:
        package = deplist[ -1 ]
    else:
        package = [ None, None, None ]
    ok = handlePackage( package[ 0 ], package[ 1 ], package[ 2 ], buildAction, opts )
else:
    for package in deplist:
        if ( utils.isInstalled( package[0], package[1], package[2] ) ):
            if utils.verbose() > 1 and package[1] == packageName:
                utils.warning( "already installed %s/%s-%s" % ( package[0], package[1], package[2] ) )
            elif utils.verbose() > 2 and not package[1] == packageName:
                utils.warning( "already installed %s/%s-%s" % ( package[0], package[1], package[2] ) )
        else:
            if ( doPretend ):
                if utils.verbose() > 0:
                    utils.warning( "pretending %s/%s-%s" % ( package[0], package[1], package[2] ) )
            else:
                if not handlePackage( package[0], package[1], package[2], buildAction, opts ):
                    utils.error( "fatal error: package %s/%s-%s %s failed" % \
                        (package[0], package[1], package[2], buildAction) )

print                       
if len( nextArguments ) > 0:
    command = "emerge.py " + " ".join( nextArguments )
    if utils.verbose() > 1:
        print command

    for element in environ.keys():
        if environ[ element ]:
            os.environ[ element ] = environ[ element ]
        elif element == "EMERGE_VERBOSE":
            os.environ[ element ] = "1"
        else:
            os.environ[ element ] = ""
    utils.system( command ) or utils.die( "cannot execute next commands cmd: %s" % command )