2013-01-12 08:57:35 -06:00
#!/usr/bin/env python
#
# -*- mode:Python -*-
#
# This file is part of the Coriolis Software.
2013-11-05 07:27:24 -06:00
# Copyright (c) UPMC 2008-2013, All Rights Reserved
2013-01-12 08:57:35 -06:00
#
# +-----------------------------------------------------------------+
# | C O R I O L I S |
# | C o r i o l i s / C h a m s B u i l d e r |
# | |
# | Authors : Jean-Paul Chaput |
# | Damien Dupuis |
# | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
# | =============================================================== |
# | Python : "./ccb.py" |
# +-----------------------------------------------------------------+
showTrace = True
try :
import sys
import os . path
import optparse
import traceback
import distutils . sysconfig
import subprocess
import re
except ImportError , e :
module = str ( e ) . split ( ) [ - 1 ]
print ' [ERROR] The < %s > python module or symbol cannot be loaded. ' % module
print ' Please check your standard Python installation, it may have problems. '
quit ( )
def safeImport ( moduleName , symbol = None ) :
try :
module = __import__ ( moduleName , globals ( ) , locals ( ) , symbol )
except ImportError , e :
print ' [ERROR] The < %s > python module or symbol cannot be loaded. ' % moduleName
print ' Please check the integrity of the <coriolis/boostrap> package. '
if showTrace : traceback . print_tb ( sys . exc_info ( ) [ 2 ] )
sys . exit ( 1 )
except Exception , e :
print ' [ERROR] An exception occured while importing module < %s >. Is is a bug, ' % moduleName
print ' you may want to report it... '
print ' %s ' % e
if showTrace : traceback . print_tb ( sys . exc_info ( ) [ 2 ] )
sys . exit ( 2 )
if symbol : return module . __dict__ [ symbol ]
return module
def guessOs ( ) :
libDir = ' lib '
2013-11-05 07:27:24 -06:00
osSlsoc6x_64 = re . compile ( " .*Linux.*(el6|slsoc6).*x86_64.* " )
osSlsoc6x = re . compile ( " .*Linux.*(el6|slsoc6).* " )
2013-01-12 08:57:35 -06:00
osSLSoC5x_64 = re . compile ( " .*Linux.*el5.*x86_64.* " )
osSLSoC5x = re . compile ( " .*Linux.*(el5|2.6.23.13.*SoC).* " )
osLinux_64 = re . compile ( " .*Linux.*x86_64.* " )
osLinux = re . compile ( " .*Linux.* " )
osFreeBSD8x_amd64 = re . compile ( " .*FreeBSD 8.*amd64.* " )
osFreeBSD8x_64 = re . compile ( " .*FreeBSD 8.*x86_64.* " )
osFreeBSD8x = re . compile ( " .*FreeBSD 8.* " )
osDarwin = re . compile ( " .*Darwin.* " )
uname = subprocess . Popen ( [ " uname " , " -srm " ] , stdout = subprocess . PIPE )
lines = uname . stdout . readlines ( )
if osSlsoc6x_64 . match ( lines [ 0 ] ) :
osType = " Linux.slsoc6x_64 "
libDir = " lib64 "
2013-11-05 07:27:24 -06:00
elif osSlsoc6x . match ( lines [ 0 ] ) :
osType = " Linux.slsoc6x "
2013-01-12 08:57:35 -06:00
elif osSLSoC5x_64 . match ( lines [ 0 ] ) :
osType = " Linux.SLSoC5x_64 "
libDir = " lib64 "
2013-11-05 07:27:24 -06:00
elif osSLSoC5x . match ( lines [ 0 ] ) :
osType = " Linux.SLSoC5x "
2013-01-12 08:57:35 -06:00
elif osLinux_64 . match ( lines [ 0 ] ) :
osType = " Linux.x86_64 "
libDir = " lib64 "
2013-11-05 07:27:24 -06:00
elif osLinux . match ( lines [ 0 ] ) :
osType = " Linux.i386 "
elif osDarwin . match ( lines [ 0 ] ) :
osType = " Darwin "
2013-01-12 08:57:35 -06:00
elif osFreeBSD8x_amd64 . match ( lines [ 0 ] ) :
osType = " FreeBSD.8x.amd64 "
libDir = " lib64 "
elif osFreeBSD8x_64 . match ( lines [ 0 ] ) :
osType = " FreeBSD.8x.x86_64 "
libDir = " lib64 "
elif osFreeBSD8x . match ( lines [ 0 ] ) :
osType = " FreeBSD.8x.i386 "
else :
uname = subprocess . Popen ( [ " uname " , " -sr " ] , stdout = subprocess . PIPE )
osType = uname . stdout . readlines ( ) [ 0 ] [ : - 1 ]
print " [WARNING] Unrecognized OS: \" %s \" . " % lines [ 0 ] [ : - 1 ]
print " (using: \" %s \" ) " % osType
return osType , libDir
def guessPythonSitePackage ( ) :
pathes = distutils . sysconfig . get_python_lib ( ) . split ( ' / ' ) [ - 2 : ]
return os . path . join ( pathes [ 0 ] , pathes [ 1 ] )
def autoLocate ( ) :
2013-11-05 07:27:24 -06:00
osType , libDir = guessOs ( )
print ' Building for target: < %s > ' % osType
2013-01-12 08:57:35 -06:00
print ' Making an educated guess to locate myself: '
sitePackage = guessPythonSitePackage ( )
builderDir = None
locations = [ os . path . abspath ( os . path . dirname ( sys . argv [ 0 ] ) )
, os . environ [ ' HOME ' ] + ' /coriolis-2.x/src/bootstrap '
, os . environ [ ' HOME ' ] + ' /coriolis/src/bootstrap '
, os . environ [ ' HOME ' ] + ' /chams-1.x/src/bootstrap '
, os . environ [ ' HOME ' ] + ' /chams/src/bootstrap '
, ' /users/outil/coriolis/coriolis-2.x/src/bootstrap '
, os . environ [ ' HOME ' ] + ' /coriolis-2.x/ ' + osType + ' /Release.Shared/install/ ' + libDir + ' / ' + sitePackage
, os . environ [ ' HOME ' ] + ' /chams-1.x/ ' + osType + ' /Release.Shared/install/ ' + libDir + ' / ' + sitePackage
, os . environ [ ' HOME ' ] + ' /chams/ ' + osType + ' /Release.Shared/install/ ' + libDir + ' / ' + sitePackage
, ' /users/outil/coriolis/coriolis-2.x/ ' + osType + ' /Release.Shared/install/ ' + libDir + ' / ' + sitePackage
]
for location in locations :
print ' < %s > ' % location ,
if os . path . isfile ( location + ' /builder/__init__.py ' ) :
if not builderDir :
builderDir = location
print ' (Found*) '
else :
print ' (Found) '
else :
print ' (No) '
if not builderDir :
print ' [ERROR] Failed to locate the builder modules in any of the normal pathes. '
print ' Please check your Coriolis/Bootsrap installation. '
if showTrace : traceback . print_tb ( sys . exc_info ( ) [ 2 ] )
sys . exit ( 1 )
sys . path . insert ( 0 , builderDir )
2013-11-05 07:27:24 -06:00
2013-01-12 08:57:35 -06:00
return
# -------------------------------------------------------------------
# CCB Main Part.
autoLocate ( )
parser = optparse . OptionParser ( )
parser . add_option ( " -g " , " --gui " , action = " store_true " , dest = " gui " , help = " Lauch the graphical interface. " )
# Build relateds.
parser . add_option ( " -c " , " --conf " , type = " string " , dest = " conf " , help = " Fichier de configuration. " )
parser . add_option ( " --show-conf " , action = " store_true " , dest = " showConf " , help = " Display the Project/Tools configuration, then exit. " )
parser . add_option ( " -q " , " --quiet " , action = " store_true " , dest = " quiet " , help = " Do not print all the informative messages. " )
parser . add_option ( " -r " , " --release " , action = " store_true " , dest = " release " , help = " Build a <Release> aka optimized version. " )
parser . add_option ( " -d " , " --debug " , action = " store_true " , dest = " debug " , help = " Build a <Debug> aka (-g) version. " )
parser . add_option ( " -s " , " --static " , action = " store_true " , dest = " static " , help = " Try to link statically, as much as possible. " )
parser . add_option ( " --doc " , action = " store_true " , dest = " doc " , help = " Enable the documentation building (uses with -j1). " )
parser . add_option ( " -v " , " --verbose " , action = " store_true " , dest = " verboseMakefile " , help = " Tells CMake to print all compilation commands. " )
parser . add_option ( " --root " , action = " store " , type = " string " , dest = " rootDir " , help = " The root directory (default: <~/coriolis-2.x/>). " )
parser . add_option ( " --no-build " , action = " store_true " , dest = " noBuild " , help = " Do *not* build anything (by default: build). " )
parser . add_option ( " --no-cache " , action = " store_true " , dest = " noCache " , help = " Remove previous CMake cache before building. " )
parser . add_option ( " --rm-build " , action = " store_true " , dest = " rmBuild " , help = " Remove previous build directoty before building. " )
parser . add_option ( " --make " , action = " store " , type = " string " , dest = " makeArguments " , help = " Arguments to pass to make (ex: \" -j4 install \" ). " )
parser . add_option ( " --project " , action = " append " , type = " string " , dest = " projects " , help = " The name of a project to build (may appears any number of time). " )
parser . add_option ( " -t " , " --tool " , action = " append " , type = " string " , dest = " tools " , help = " The name of a tool to build (may appears any number of time). " )
# SVN repository relateds.
parser . add_option ( " --svn-tag " , action = " store " , type = " string " , dest = " svnTag " , help = " Explicitly select a SVN tag (for SVN related commands). " )
parser . add_option ( " --svn-method " , action = " store " , type = " string " , dest = " svnMethod " , help = " Allows to sets the svn checkout method (svn+ssh://coriolis.soc.lip6.fr). " )
parser . add_option ( " --svn-status " , action = " store_true " , dest = " svnStatus " , help = " Check status against the SVN repository. " )
parser . add_option ( " --svn-diff " , action = " store_true " , dest = " svnDiff " , help = " Perform a diff against the SVN repository. " )
parser . add_option ( " --svn-update " , action = " store_true " , dest = " svnUpdate " , help = " Update to the latest SVN version *or* the one given by svn-tag. " )
parser . add_option ( " --svn-checkout " , action = " store_true " , dest = " svnCheckout " , help = " Checkout the latest SVN version *or* the one given by svn-tag. " )
# Miscellaneous.
parser . add_option ( " --user-tarball " , action = " store_true " , dest = " userTarball " , help = " Regenerate a tarball from checked out sources (in <root>/tarball/. " )
parser . add_option ( " --tarball " , action = " store_true " , dest = " tarball " , help = " Regenerate a tarball (in <root>/tarball/. " )
parser . add_option ( " --rpm " , action = " store_true " , dest = " doRpm " , help = " Regenerate RPM packages. " )
parser . add_option ( " --deb " , action = " store_true " , dest = " doDeb " , help = " Regenerate Debian/Ubuntu packages. " )
# Katabatic/Kite specific options.
parser . add_option ( " -D " , " --check-db " , action = " store_true " , dest = " checkDb " , help = " Enable Katabatic/Kite data-base checking (*very* slow). " )
parser . add_option ( " -u " , " --check-deter " , action = " store_true " , dest = " checkDeterminism " , help = " Enable Katabatic/Kite determinism checking (*very* slow). " )
( options , args ) = parser . parse_args ( )
if options . gui :
ErrorMessage = safeImport ( ' builder ' , ' ErrorMessage ' )
QApplication = safeImport ( ' PyQt4.QtGui ' , ' QApplication ' )
BuilderGui = safeImport ( ' builder.BuilderGui ' , ' BuilderGui ' )
try :
app = QApplication ( sys . argv )
app . setOrganizationName ( ' UPMC ' )
app . setOrganizationDomain ( ' lip6.fr ' )
app . setApplicationName ( ' CoriolisBuilder ' )
gui = BuilderGui ( options . conf )
gui . show ( )
rcode = app . exec_ ( )
sys . exit ( rcode )
except ErrorMessage , e :
print e
if showTrace : traceback . print_tb ( sys . exc_info ( ) [ 2 ] )
sys . exit ( 2 )
except Exception , e :
print ' [ERROR] An exception occured while running the Qt application. '
print ' %s ' % e
if showTrace : traceback . print_tb ( sys . exc_info ( ) [ 2 ] )
sys . exit ( 2 )
else :
ErrorMessage = safeImport ( ' builder ' , ' ErrorMessage ' )
Builder = safeImport ( ' builder.Builder ' , ' Builder ' )
try :
builder = Builder ( )
builder . loadConfiguration ( options . conf )
if options . showConf :
builder . showConfiguration ( )
sys . exit ( 0 )
if options . quiet : builder . quiet = True
if options . release : builder . buildMode = " Release "
if options . debug : builder . buildMode = " Debug "
if options . static : builder . enableShared = " OFF "
if options . doc : builder . enableDoc = " ON "
if options . checkDb : builder . checkDatabase = " ON "
2013-11-05 07:27:24 -06:00
if options . checkDeterminism : builder . checkDeterminism = " ON "
2013-01-12 08:57:35 -06:00
if options . verboseMakefile : builder . verboseMakefile = " ON "
if options . rootDir : builder . rootDir = options . rootDir
if options . noBuild : builder . doBuild = False
if options . noCache : builder . noCache = True
if options . rmBuild : builder . rmBuild = True
if options . makeArguments : builder . makeArguments = options . makeArguments
if options . svnMethod : builder . svnMethod = options . svnMethod
if options . svnTag : builder . svnTag = options . svnTag
if options . svnStatus : builder . svnStatus ( tools = options . tools , projects = options . projects )
elif options . svnUpdate : builder . svnUpdate ( tools = options . tools , projects = options . projects )
elif options . svnDiff : builder . svnDiff ( tools = options . tools , projects = options . projects )
elif options . svnCheckout : builder . svnCheckout ( tools = options . tools , projects = options . projects )
elif options . userTarball : builder . userTarball ( tools = options . tools , projects = options . projects )
elif options . tarball : builder . svnTarball ( tools = options . tools , projects = options . projects )
elif options . doRpm : builder . doRpm ( )
elif options . doDeb : builder . doDeb ( )
else : builder . build ( tools = options . tools , projects = options . projects )
except ErrorMessage , e :
print e
if showTrace : traceback . print_tb ( sys . exc_info ( ) [ 2 ] )
sys . exit ( e . code )
except KeyboardInterrupt , e :
print ' \n [ERROR] Interrupted by user \' s request (CTRL+C) '
sys . exit ( 1 )
sys . exit ( 0 )