2010-03-16 11:18:09 -05:00
#!/usr/bin/env python
import sys
import re
import os
import os . path
2012-11-16 06:46:27 -06:00
import datetime
2010-03-16 11:18:09 -05:00
import socket
import subprocess
import optparse
2012-11-16 06:46:27 -06:00
class ErrorMessage ( Exception ) :
def __init__ ( self , code , * arguments ) :
self . _code = code
self . _errors = [ ' Malformed call to ErrorMessage() '
, ' %s ' % str ( arguments ) ]
text = None
if len ( arguments ) == 1 :
if isinstance ( arguments [ 0 ] , Exception ) : text = str ( arguments [ 0 ] ) . split ( ' \n ' )
else :
self . _errors = arguments [ 0 ]
elif len ( arguments ) > 1 :
text = list ( arguments )
if text :
self . _errors = [ ]
while len ( text [ 0 ] ) == 0 : del text [ 0 ]
lstrip = 0
if text [ 0 ] . startswith ( ' [ERROR] ' ) : lstrip = 8
for line in text :
if line [ 0 : lstrip ] == ' ' * lstrip or \
line [ 0 : lstrip - 1 ] == ' [ERROR] ' :
self . _errors + = [ line [ lstrip : ] ]
else :
self . _errors + = [ line . lstrip ( ) ]
return
def __str__ ( self ) :
if not isinstance ( self . _errors , list ) :
return " [ERROR] %s " % self . _errors
formatted = " \n "
for i in range ( len ( self . _errors ) ) :
if i == 0 : formatted + = " [ERROR] %s " % self . _errors [ i ]
else : formatted + = " %s " % self . _errors [ i ]
if i + 1 < len ( self . _errors ) : formatted + = " \n "
return formatted
def addMessage ( self , message ) :
if not isinstance ( self . _errors , list ) :
self . _errors = [ self . _errors ]
if isinstance ( message , list ) :
for line in message :
self . _errors + = [ line ]
else :
self . _errors + = [ message ]
return
def terminate ( self ) :
print self
sys . exit ( self . _code )
def _getCode ( self ) : return self . _code
code = property ( _getCode )
2010-03-16 11:18:09 -05:00
class Project :
def __init__ ( self , name , tools , repository ) :
self . _name = name
self . _tools = tools
self . _repository = repository
self . _actives = [ ]
return
def getName ( self ) : return self . _name
def getTools ( self ) : return self . _tools
def getRepository ( self ) : return self . _repository
def getActives ( self ) : return self . _actives
2010-03-23 04:36:38 -05:00
def hasTool ( self , tool ) : return tool in self . _tools
2010-03-16 11:18:09 -05:00
def desactivate ( self ) :
self . _active = [ ]
return
def activateAll ( self ) :
self . _actives = self . _tools
return
def activate ( self , tools ) :
# Build the ordered list.
for tool in self . _tools :
2010-04-04 05:19:38 -05:00
if ( tool in tools ) and not ( tool in self . _actives ) :
2010-03-16 11:18:09 -05:00
self . _actives + = [ tool ]
# Find the tools not part of the project.
rejecteds = [ ]
for tool in tools :
2010-04-04 05:19:38 -05:00
if not ( tool in self . _tools ) and ( not tool in rejecteds ) :
2010-03-16 11:18:09 -05:00
rejecteds + = [ tool ]
return rejecteds
class ProjectBuilder :
def __init__ ( self ) :
self . _projects = [ ]
self . _standalones = [ ]
self . _svnTag = " x "
2012-11-16 06:46:27 -06:00
self . _svnMethod = None
self . _projectDir = ' coriolis-2.x '
self . _rootDir = os . path . join ( os . environ [ " HOME " ] , self . _projectDir )
self . _packageName = None
self . _packageVersion = None
self . _packageExcludes = [ ]
self . _packageProject = [ ]
2010-03-19 05:05:30 -05:00
self . _quiet = False
2010-03-16 11:18:09 -05:00
self . _buildMode = " Release "
2010-04-28 10:54:30 -05:00
self . _rmBuild = False
2010-03-16 11:18:09 -05:00
self . _doBuild = True
self . _noCache = False
self . _enableShared = " ON "
self . _enableDoc = " OFF "
self . _checkDatabase = " OFF "
self . _checkDeterminism = " OFF "
self . _verboseMakefile = " OFF "
self . _libMode = " Shared "
self . _makeArguments = [ ]
2010-03-18 10:38:10 -05:00
self . _environment = os . environ
2010-03-16 11:18:09 -05:00
self . _guessOs ( )
self . _updateSecondary ( )
return
def __setattr__ ( self , attribute , value ) :
if attribute [ 0 ] == " _ " :
self . __dict__ [ attribute ] = value
return
if attribute == " svnTag " : self . _svnTag = value
2010-04-20 07:05:52 -05:00
elif attribute == " svnMethod " : self . _svnMethod = value
2012-11-16 06:46:27 -06:00
elif attribute == " projectDir " : self . _projectDir = value
2010-03-22 09:13:40 -05:00
elif attribute == " rootDir " : self . _rootDir = os . path . expanduser ( value )
2012-11-16 06:46:27 -06:00
elif attribute == " packageName " : self . _packageName = value
elif attribute == " packageVersion " : self . _packageVersion = value
2010-03-19 05:05:30 -05:00
elif attribute == " quiet " : self . _quiet = value
2010-03-16 11:18:09 -05:00
elif attribute == " buildMode " : self . _buildMode = value
2010-04-28 10:54:30 -05:00
elif attribute == " rmBuild " : self . _rmBuild = value
2010-03-16 11:18:09 -05:00
elif attribute == " doBuild " : self . _doBuild = value
elif attribute == " noCache " : self . _noCache = value
elif attribute == " enableShared " : self . _enableShared = value
elif attribute == " enableDoc " : self . _enableDoc = value
elif attribute == " enableShared " : self . _enableShared = value
elif attribute == " checkDatabase " : self . _checkDatabase = value
elif attribute == " checkDeterminism " : self . _checkDeterminism = value
elif attribute == " verboseMakefile " : self . _verboseMakefile = value
elif attribute == " makeArguments " : self . _makeArguments = value . split ( )
elif attribute == " libMode " : self . _libMode = value
self . _updateSecondary ( )
return
def _updateSecondary ( self ) :
2012-11-16 08:59:20 -06:00
#self._rootDir = os.path.join ( os.environ["HOME"], self._projectDir )
2011-02-02 06:02:39 -06:00
self . _rpmbuildDir = os . path . join ( self . _rootDir , " rpmbuild " )
self . _debbuildDir = os . path . join ( self . _rootDir , " debbuild " )
2010-06-08 07:15:31 -05:00
self . _tmppathDir = os . path . join ( self . _rpmbuildDir , " tmp " )
2011-02-02 06:02:39 -06:00
self . _tarballDir = os . path . join ( self . _rootDir , " tarball " )
2012-11-16 06:46:27 -06:00
self . _archiveDir = os . path . join ( self . _tarballDir , " %s - %s . %s " % ( self . _packageName
, self . _packageVersion
, self . _svnTag ) )
2011-02-02 06:02:39 -06:00
self . _sourceDir = os . path . join ( self . _rootDir , " src " )
2010-06-08 07:15:31 -05:00
self . _osDir = os . path . join ( self . _rootDir
2010-03-16 11:18:09 -05:00
, self . _osType
, " %s . %s " % ( self . _buildMode , self . _libMode ) )
2010-06-08 07:15:31 -05:00
self . _buildDir = os . path . join ( self . _osDir , " build " )
self . _installDir = os . path . join ( self . _osDir , " install " )
2010-03-16 11:18:09 -05:00
if self . _enableShared == " ON " : self . _libMode = " Shared "
else : self . _libMode = " Static "
2010-05-17 09:45:55 -05:00
2012-11-16 06:46:27 -06:00
self . _specFileIn = os . path . join ( self . _sourceDir , " bootstrap " , " %s .spec.in " % self . _packageName )
self . _specFile = os . path . join ( self . _sourceDir , " bootstrap " , " %s .spec " % self . _packageName )
2011-02-02 08:08:12 -06:00
self . _debianDir = os . path . join ( self . _sourceDir , " bootstrap " , " debian " )
self . _debChangelogIn = os . path . join ( self . _debianDir , " changelog.in " )
self . _debChangelog = os . path . join ( self . _debianDir , " changelog " )
2012-11-16 06:46:27 -06:00
self . _sourceTarBz2 = " %s - %s . %s .tar.bz2 " % ( self . _packageName , self . _packageVersion , self . _svnTag )
self . _binaryTarBz2 = " %s -binary- %s . %s -1.slsoc6.tar.bz2 " % ( self . _packageName , self . _packageVersion , self . _svnTag )
self . _distribPatch = os . path . join ( self . _sourceDir , " bootstrap " , " %s -for-distribution.patch " % self . _packageName )
2010-03-16 11:18:09 -05:00
return
def _guessOs ( self ) :
2012-11-16 06:46:27 -06:00
self . _libSuffix = None
self . _osSlsoc6x_64 = re . compile ( " .*Linux.*el6.*x86_64.* " )
self . _osSlsoc6x = re . compile ( " .*Linux.*el6.* " )
self . _osSLSoC5x_64 = re . compile ( " .*Linux.*el5.*x86_64.* " )
self . _osSLSoC5x = re . compile ( " .*Linux.*(el5|2.6.23.13.*SoC).* " )
self . _osLinux_64 = re . compile ( " .*Linux.*x86_64.* " )
self . _osLinux = re . compile ( " .*Linux.* " )
self . _osFreeBSD8x_amd64 = re . compile ( " .*FreeBSD 8.*amd64.* " )
self . _osFreeBSD8x_64 = re . compile ( " .*FreeBSD 8.*x86_64.* " )
self . _osFreeBSD8x = re . compile ( " .*FreeBSD 8.* " )
self . _osDarwin = re . compile ( " .*Darwin.* " )
2010-03-16 11:18:09 -05:00
uname = subprocess . Popen ( [ " uname " , " -srm " ] , stdout = subprocess . PIPE )
lines = uname . stdout . readlines ( )
2011-03-18 08:41:02 -05:00
if self . _osSlsoc6x_64 . match ( lines [ 0 ] ) :
self . _osType = " Linux.slsoc6x_64 "
self . _libSuffix = " 64 "
elif self . _osSlsoc6x . match ( lines [ 0 ] ) : self . _osType = " Linux.slsoc6x "
elif self . _osSLSoC5x_64 . match ( lines [ 0 ] ) :
2010-05-17 16:19:02 -05:00
self . _osType = " Linux.SLSoC5x_64 "
self . _libSuffix = " 64 "
2010-03-16 11:18:09 -05:00
elif self . _osSLSoC5x . match ( lines [ 0 ] ) : self . _osType = " Linux.SLSoC5x "
2010-05-17 16:19:02 -05:00
elif self . _osLinux_64 . match ( lines [ 0 ] ) :
self . _osType = " Linux.x86_64 "
self . _libSuffix = " 64 "
2010-03-16 11:18:09 -05:00
elif self . _osLinux . match ( lines [ 0 ] ) : self . _osType = " Linux.i386 "
elif self . _osDarwin . match ( lines [ 0 ] ) : self . _osType = " Darwin "
2012-11-16 06:46:27 -06:00
elif self . _osFreeBSD8x_amd64 . match ( lines [ 0 ] ) :
self . _osType = " FreeBSD.8x.amd64 "
self . _libSuffix = " 64 "
elif self . _osFreeBSD8x_64 . match ( lines [ 0 ] ) :
self . _osType = " FreeBSD.8x.x86_64 "
self . _libSuffix = " 64 "
elif self . _osFreeBSD8x . match ( lines [ 0 ] ) : self . _osType = " FreeBSD.8x.i386 "
2010-03-16 11:18:09 -05:00
else :
uname = subprocess . Popen ( [ " uname " , " -sr " ] , stdout = subprocess . PIPE )
self . _osType = uname . stdout . readlines ( ) [ 0 ] [ : - 1 ]
print " [WARNING] Unrecognized OS: \" %s \" . " % lines [ 0 ] [ : - 1 ]
print " (using: \" %s \" ) " % self . _osType
return
2010-05-16 11:41:25 -05:00
def _guessSvnTag ( self , project ) :
revisionPattern = re . compile ( r " ^Revision: \ s*(?P<revision> \ d+) " )
projectSvnDir = os . path . join ( self . _svnMethod + project . getRepository ( ) )
command = [ " svn " , " info " , projectSvnDir ]
svnInfo = subprocess . Popen ( command , stdout = subprocess . PIPE )
for line in svnInfo . stdout . readlines ( ) :
m = revisionPattern . match ( line )
if m :
self . _svnTag = m . group ( " revision " )
print " Latest revision of project %s is %s . " % ( project . getName ( ) , self . _svnTag )
2010-05-17 09:45:55 -05:00
self . _updateSecondary ( )
2010-05-16 11:41:25 -05:00
return
print " [WARNING] Cannot guess revision for project \" %s \" . " % project . getName ( )
print " (using: \" x \" ) "
return
2011-02-02 08:08:12 -06:00
def _configure ( self , fileIn , file ) :
2011-02-02 08:09:40 -06:00
fdFileIn = open ( fileIn , " r " )
fdFile = open ( file , " w " )
2010-05-17 09:45:55 -05:00
2011-02-02 08:08:12 -06:00
for line in fdFileIn . readlines ( ) :
2010-05-17 09:45:55 -05:00
stable = False
substituted0 = line
while not stable :
substituted1 = re . sub ( r " @svntag@ " , self . _svnTag , substituted0 )
substituted1 = re . sub ( r " @coriolisTop@ " , " /opt/coriolis2 " , substituted1 )
if substituted0 == substituted1 : stable = True
else : substituted0 = substituted1
2011-02-02 08:08:12 -06:00
fdFile . write ( substituted0 )
fdFileIn . close ( )
fdFile . close ( )
return
def _doSpec ( self ) :
self . _configure ( self . _specFileIn , self . _specFile )
return
2010-05-17 09:45:55 -05:00
2011-02-02 08:08:12 -06:00
def _doDebChangelog ( self ) :
self . _configure ( self . _debChangelogIn , self . _debChangelog )
2010-05-17 09:45:55 -05:00
return
2010-03-18 10:38:10 -05:00
def _execute ( self , command , error ) :
2010-04-20 06:11:08 -05:00
sys . stdout . flush ( )
sys . stderr . flush ( )
2010-03-18 10:38:10 -05:00
child = subprocess . Popen ( command , env = self . _environment , stdout = None )
2010-03-16 11:18:09 -05:00
( pid , status ) = os . waitpid ( child . pid , 0 )
2010-03-26 13:09:30 -05:00
status >> = 8
2010-03-16 11:18:09 -05:00
if status != 0 :
2012-11-16 06:46:27 -06:00
ErrorMessage ( status , " %s (status: %d ). " % ( error , status ) ) . terminate ( )
return
def _enableTool ( self , tool ) :
2010-03-16 11:18:09 -05:00
return
def _build ( self , tool ) :
toolSourceDir = os . path . join ( self . _sourceDir , tool )
toolBuildDir = os . path . join ( self . _buildDir , tool )
# Supplied directly in the CMakeLists.txt.
2010-05-22 08:39:38 -05:00
#cmakeModules = os.path.join ( self._installDir, "share", "cmake", "Modules" )
2010-03-16 11:18:09 -05:00
if not os . path . isdir ( toolSourceDir ) :
2012-11-16 06:46:27 -06:00
print ErrorMessage ( 0 , " Missing tool source directory: \" %s \" (skipped). " % toolSourceDir )
2010-03-16 11:18:09 -05:00
return
2010-04-28 10:54:30 -05:00
if self . _rmBuild :
print " Removing tool build directory: \" %s \" . " % toolBuildDir
2010-05-19 09:47:48 -05:00
command = [ " /bin/rm " , " -rf " , toolBuildDir ]
2010-04-28 10:54:30 -05:00
self . _execute ( command , " Removing tool build directory " )
2010-03-16 11:18:09 -05:00
if not os . path . isdir ( toolBuildDir ) :
print " Creating tool build directory: \" %s \" . " % toolBuildDir
os . makedirs ( toolBuildDir )
os . chdir ( toolBuildDir )
command = [ " cmake " , " -D " , " CMAKE_BUILD_TYPE:STRING= %s " % self . _buildMode
, " -D " , " BUILD_SHARED_LIBS:STRING= %s " % self . _enableShared
#, "-D", "CMAKE_MODULE_PATH:STRING=%s" % cmakeModules
, toolSourceDir ]
2010-03-18 10:38:10 -05:00
self . _execute ( command , " First CMake failed " )
2010-03-16 11:18:09 -05:00
os . chdir ( toolBuildDir )
if self . _noCache :
2010-03-22 09:13:40 -05:00
cmakeCache = os . path . join ( toolBuildDir , " CMakeCache.txt " )
2010-03-22 11:38:25 -05:00
if os . path . isfile ( cmakeCache ) : os . unlink ( cmakeCache )
2010-03-16 11:18:09 -05:00
2010-03-22 09:13:40 -05:00
command = [ " cmake " , " -D " , " CMAKE_BUILD_TYPE:STRING= %s " % self . _buildMode
, " -D " , " BUILD_SHARED_LIBS:STRING= %s " % self . _enableShared
2010-03-16 11:18:09 -05:00
, " -D " , " BUILD_DOC:STRING= %s " % self . _enableDoc
, " -D " , " CHECK_DATABASE:STRING= %s " % self . _checkDatabase
, " -D " , " CHECK_DETERMINISM:STRING= %s " % self . _checkDeterminism
, " -D " , " CMAKE_VERBOSE_MAKEFILE:STRING= %s " % self . _verboseMakefile
2010-05-16 11:41:25 -05:00
, " -D " , " CMAKE_INSTALL_PREFIX:STRING= %s " % self . _installDir
2010-05-17 16:19:02 -05:00
]
if self . _libSuffix :
command + = [ " -D " , " LIB_SUFFIX:STRING= %s " % self . _libSuffix ]
command + = [ toolSourceDir ]
2010-03-18 10:38:10 -05:00
self . _execute ( command , " Second CMake failed " )
2010-03-16 11:18:09 -05:00
if self . _doBuild :
2010-05-25 11:00:53 -05:00
command = [ " make " ]
#command += [ "DESTDIR=%s" % self._installDir ]
2011-01-09 13:21:01 -06:00
if self . _enableDoc == " ON " :
2012-11-16 06:46:27 -06:00
#if tool == "crlcore" or tool == "stratus1":
if tool == " stratus1 " :
2011-01-09 13:21:01 -06:00
command + = [ " dvi " , " safepdf " , " html " ]
2010-05-17 03:20:02 -05:00
command + = self . _makeArguments
2010-05-25 11:00:53 -05:00
print " Make command: " , command
sys . stdout . flush ( )
2010-03-18 10:38:10 -05:00
self . _execute ( command , " Build failed " )
2010-03-16 11:18:09 -05:00
return
def _svnStatus ( self , tool ) :
toolSourceDir = os . path . join ( self . _sourceDir , tool )
2010-03-19 05:01:54 -05:00
if not os . path . isdir ( toolSourceDir ) :
2010-03-19 05:05:30 -05:00
if not self . _quiet :
2012-11-16 06:46:27 -06:00
print ErrorMessage ( 0 , " Missing tool source directory: \" %s \" (skipped). " % toolSourceDir )
2010-03-19 05:07:12 -05:00
return
2010-03-16 11:18:09 -05:00
os . chdir ( toolSourceDir )
print " Checking SVN status of tool: " , tool
command = [ " svn " , " status " , " -u " , " -q " ]
2010-03-18 10:38:10 -05:00
self . _execute ( command , " svn status -u -q " )
2010-03-16 11:18:09 -05:00
print
return
2012-12-14 09:36:52 -06:00
def _svnDiff ( self , tool ) :
toolSourceDir = os . path . join ( self . _sourceDir , tool )
if not os . path . isdir ( toolSourceDir ) :
if not self . _quiet :
print ErrorMessage ( 0 , " Missing tool source directory: \" %s \" (skipped). " % toolSourceDir )
return
os . chdir ( toolSourceDir )
print " Doing a SVN diff of tool: " , tool
command = [ " svn " , " diff " ]
if self . _svnTag != " x " :
command + = [ " --revision " , self . _svnTag ]
self . _execute ( command , " svn diff %s " % tool )
print
return
2010-03-16 11:18:09 -05:00
def _svnUpdate ( self , tool ) :
toolSourceDir = os . path . join ( self . _sourceDir , tool )
2010-03-19 05:01:54 -05:00
if not os . path . isdir ( toolSourceDir ) :
2010-03-19 05:05:30 -05:00
if not self . _quiet :
2012-11-16 06:46:27 -06:00
print ErrorMessage ( 0 , " Missing tool source directory: \" %s \" (skipped). " % toolSourceDir )
2010-03-19 05:01:54 -05:00
return
2010-03-16 11:18:09 -05:00
os . chdir ( toolSourceDir )
print " Doing a SVN update of tool: " , tool
command = [ " svn " , " update " ]
2010-03-18 10:38:10 -05:00
self . _execute ( command , " svn update " )
2010-03-16 11:18:09 -05:00
print
return
def _svnCheckout ( self , tool ) :
project = self . getToolProject ( tool )
if not project :
2012-11-16 06:46:27 -06:00
print ErrorMessage ( 0 , " Tool \" %s \" is not part of any project. " % tool
, " Cannot guess the SVN repository. " )
2010-03-16 11:18:09 -05:00
return
if not project . getRepository ( ) :
2012-11-16 06:46:27 -06:00
print ErrorMessage ( 0 , " Project \" %s \" isn ' t associated to a repository. " % project . getName ( ) )
2010-03-16 11:18:09 -05:00
return
2012-12-12 08:15:10 -06:00
if not os . path . isdir ( self . _sourceDir ) :
print ErrorMessage ( 0 , " Source directory < %s > doesn ' t exists. Creating. " % self . _sourceDir )
os . makedirs ( self . _sourceDir )
2010-03-16 11:18:09 -05:00
2010-04-20 07:05:52 -05:00
toolSvnTrunkDir = os . path . join ( self . _svnMethod + project . getRepository ( ) , tool , " trunk " )
2010-03-16 11:18:09 -05:00
os . chdir ( self . _sourceDir )
print " Doing a SVN checkout of tool: " , tool
command = [ " svn " , " co " , toolSvnTrunkDir , tool ]
2012-12-12 08:15:10 -06:00
if self . _svnTag != " x " :
command + = [ " --revision " , self . _svnTag ]
2010-03-18 10:38:10 -05:00
self . _execute ( command , " svn checkout %s " % tool )
2010-03-16 11:18:09 -05:00
print
return
2010-05-16 11:41:25 -05:00
def _svnExport ( self , tool ) :
project = self . getToolProject ( tool )
if not project :
2012-11-16 06:46:27 -06:00
print ErrorMessage ( 0 , " Tool \" %s \" is not part of any project. " % tool
, " Cannot guess the SVN repository. " )
2010-05-16 11:41:25 -05:00
return
if not project . getRepository ( ) :
2012-11-16 06:46:27 -06:00
print ErrorMessage ( 0 , " Project \" %s \" isn ' t associated to a repository. " % project . getName ( ) )
2010-05-16 11:41:25 -05:00
return
toolSvnTrunkDir = os . path . join ( self . _svnMethod + project . getRepository ( ) , tool , " trunk " )
if not os . path . isdir ( self . _archiveDir ) :
os . mkdir ( self . _archiveDir )
os . chdir ( self . _archiveDir )
toolExportDir = os . path . join ( self . _archiveDir , tool )
if os . path . isdir ( toolExportDir ) :
print " Removing tool export (tarball) directory: \" %s \" . " % toolExportDir
command = [ " /bin/rm " , " -r " , toolExportDir ]
self . _execute ( command , " Removing tool export (tarball) directory " )
print " Doing a SVN export of tool: " , tool
command = [ " svn " , " export " , toolSvnTrunkDir , toolExportDir ]
if self . _svnTag != " x " :
command + = [ " --revision " , self . _svnTag ]
self . _execute ( command , " svn export %s " % toolExportDir )
print
return
2010-03-16 11:18:09 -05:00
def getProject ( self , name ) :
for project in self . _projects :
if project . getName ( ) == name :
return project
return None
def getToolProject ( self , name ) :
for project in self . _projects :
if project . hasTool ( name ) :
return project
return None
def register ( self , project ) :
for registered in self . _projects :
if registered . getName ( ) == project . getName ( ) :
2012-11-16 06:46:27 -06:00
print ErrorMessage ( 0 , " Project \" %s \" is already registered (ignored). " )
2010-03-16 11:18:09 -05:00
return
self . _projects + = [ project ]
return
2010-07-01 07:05:15 -05:00
def _setEnvironment ( self , systemVariable , userVariable ) :
2011-02-15 07:15:24 -06:00
if not self . _environment . has_key ( systemVariable ) or self . _environment [ systemVariable ] == " " :
if not self . _environment . has_key ( userVariable ) or self . _environment [ userVariable ] == " " :
self . _environment [ systemVariable ] = self . _installDir
print " [WARNING] Neither < %s > nor < %s > environment variables are sets. " \
% ( systemVariable , userVariable )
print " Setting < %s > to < %s >. " % ( systemVariable , self . _installDir )
else :
self . _environment [ systemVariable ] = self . _environment [ userVariable ]
2010-07-01 07:05:15 -05:00
if not self . _quiet :
2011-02-15 07:15:24 -06:00
print " Setting < %s > to < %s >. " % ( systemVariable , self . _environment [ systemVariable ] )
2010-07-01 07:05:15 -05:00
if self . _environment . has_key ( userVariable ) :
2011-02-15 07:15:24 -06:00
print " Transmitting < %s > as < %s >. " % ( userVariable , self . _environment [ userVariable ] )
2010-07-01 07:05:15 -05:00
return
2010-04-03 09:06:08 -05:00
def _commandTemplate ( self , tools , projects , command ) :
2010-03-18 10:38:10 -05:00
# Set or guess the various projects TOP environment variables.
for project in self . _projects :
topVariable = " %s _TOP " % project . getName ( ) . upper ( )
topUserVariable = " %s _USER_TOP " % project . getName ( ) . upper ( )
2010-07-01 07:05:15 -05:00
self . _setEnvironment ( topVariable , topUserVariable )
2010-03-18 10:38:10 -05:00
2010-04-04 05:19:38 -05:00
if tools :
# Checks if the requested tools are in the various projects.
self . _standalones = tools
for project in self . _projects :
self . _standalones = project . activate ( self . _standalones )
for tool in self . _standalones :
print " [WARNING] Tool \" %s \" is not part of any project. " % tool
2010-04-03 09:06:08 -05:00
if projects :
for projectName in projects :
project = self . getProject ( projectName )
if not project :
2012-11-16 06:46:27 -06:00
ErrorMessage ( 1 , " No project of name \" %s \" . " % projectName ) . terminate ( )
2010-04-03 09:06:08 -05:00
project . activateAll ( )
2010-04-04 05:19:38 -05:00
if not tools and not projects :
2010-03-16 11:18:09 -05:00
for project in self . _projects :
2010-04-04 05:19:38 -05:00
project . activateAll ( )
for project in self . _projects :
for tool in project . getActives ( ) :
2010-03-19 09:47:32 -05:00
print " \n Processing tool: \" %s \" . " % tool
2010-03-16 11:18:09 -05:00
getattr ( self , command ) ( tool )
2010-04-04 05:19:38 -05:00
for tool in self . _standalones :
print " \n Processing tool: \" %s \" . " % tool
getattr ( self , command ) ( tool )
2010-03-16 11:18:09 -05:00
return
2012-11-16 06:46:27 -06:00
def enable ( self , tools , projects ) :
self . _commandTemplate ( tools , projects , " _enableTool " )
return
def enabledTools ( self ) :
tools = [ ]
for project in self . _projects :
tools + = project . getActives ( )
return tools
2010-04-03 09:06:08 -05:00
def build ( self , tools , projects ) :
self . _commandTemplate ( tools , projects , " _build " )
2010-03-16 11:18:09 -05:00
return
2010-04-03 09:06:08 -05:00
def svnStatus ( self , tools , projects ) :
self . _commandTemplate ( tools , projects , " _svnStatus " )
2010-03-16 11:18:09 -05:00
return
2010-04-03 09:06:08 -05:00
def svnUpdate ( self , tools , projects ) :
self . _commandTemplate ( tools , projects , " _svnUpdate " )
2010-03-16 11:18:09 -05:00
return
2010-04-03 09:06:08 -05:00
def svnCheckout ( self , tools , projects ) :
self . _commandTemplate ( tools , projects , " _svnCheckout " )
2010-03-16 11:18:09 -05:00
return
2012-12-14 09:36:52 -06:00
def svnDiff ( self , tools , projects ) :
self . _commandTemplate ( tools , projects , " _svnDiff " )
return
2010-05-16 11:41:25 -05:00
def svnExport ( self , tools , projects ) :
self . _commandTemplate ( tools , projects , " _svnExport " )
return
2012-11-16 06:46:27 -06:00
def svnTarball ( self , tools , projects ) :
2010-05-16 11:41:25 -05:00
if self . _svnTag == " x " :
self . _guessSvnTag ( self . getProject ( projects [ 0 ] ) )
2010-05-17 09:45:55 -05:00
self . _doSpec ( )
2011-02-02 08:08:12 -06:00
self . _doDebChangelog ( )
2010-05-16 11:41:25 -05:00
if os . path . isdir ( self . _tarballDir ) :
print " Removing previous tarball directory: \" %s \" . " % self . _tarballDir
2011-02-02 06:02:39 -06:00
command = [ " /bin/rm " , " -rf " , self . _tarballDir ]
2010-05-16 11:41:25 -05:00
self . _execute ( command , " Removing top export (tarball) directory " )
2010-05-17 09:45:55 -05:00
2010-05-16 11:41:25 -05:00
print " Creating tarball directory: \" %s \" . " % self . _tarballDir
os . makedirs ( self . _tarballDir )
self . svnExport ( tools , projects )
2010-05-25 11:00:53 -05:00
2010-05-27 06:54:24 -05:00
# Remove unpublisheds (yet) tools/files.
2012-11-16 06:46:27 -06:00
for item in self . _packageExcludes :
2012-12-03 09:10:56 -06:00
command = [ " /bin/rm " , " -rf " , os . path . join ( self . _archiveDir , item ) ]
2010-05-27 06:54:24 -05:00
self . _execute ( command , " rm of %s failed " % item )
2011-01-09 13:21:01 -06:00
# Adds files neededs only for packaging purpose.
command = [ " /bin/cp " , " -r " , os . path . join ( self . _sourceDir , " bootstrap " , " Makefile.package " )
, os . path . join ( self . _archiveDir , " Makefile " ) ]
self . _execute ( command , " copy of %s failed " % " boostrap/Makefile.package " )
2011-02-02 04:40:25 -06:00
command = [ " /bin/cp " , self . _specFile , self . _archiveDir ]
self . _execute ( command , " Copying RPM spec file " )
command = [ " /bin/cp " , " -r " , self . _debianDir , self . _archiveDir ]
self . _execute ( command , " Copying Debian/Ubuntu package control files " )
2010-05-17 09:45:55 -05:00
2010-05-27 06:54:24 -05:00
os . chdir ( self . _archiveDir )
2011-01-09 13:21:01 -06:00
#command = [ "/usr/bin/patch", "--remove-empty-files"
# , "--no-backup-if-mismatch"
# , "-p0", "-i", self._distribPatch ]
#self._execute ( command, "patch for distribution command failed" )
2010-05-27 06:54:24 -05:00
2010-05-16 11:41:25 -05:00
os . chdir ( self . _tarballDir )
2011-02-02 06:02:39 -06:00
command = [ " /bin/tar "
2012-11-16 06:46:27 -06:00
, " --exclude-backups "
, " --exclude-vcs "
2011-02-02 06:02:39 -06:00
, " -jcvf " , self . _sourceTarBz2 , os . path . basename ( self . _archiveDir ) ]
2010-05-16 11:41:25 -05:00
self . _execute ( command , " tar command failed " )
2010-05-17 09:45:55 -05:00
2010-05-16 11:41:25 -05:00
print " Cleanup SVN export tarball archive directory: \" %s \" . " % self . _archiveDir
2011-02-02 06:02:39 -06:00
command = [ " /bin/rm " , " -rf " , self . _archiveDir ]
2010-05-16 11:41:25 -05:00
self . _execute ( command , " Removing archive export (tarball) directory " )
return
2012-11-16 06:46:27 -06:00
def userTarball ( self , tools , projects ) :
self . enable ( tools , projects )
userSourceTarBz2 = os . path . join ( self . _tarballDir
, datetime . date . today ( ) . strftime ( ' %s - %s - %% Y %% m %% d.tar.bz2 ' %
( self . _packageName
, self . _packageVersion ) ) )
excludes = [ ]
for exclude in self . _packageExcludes :
excludes + = [ ' --exclude= ' + exclude ]
os . chdir ( self . _sourceDir )
command = [ " /bin/tar "
, " --exclude-backups "
, " --exclude-vcs "
, " --transform=s,^, %s /src/, " % self . _projectDir ] \
+ excludes \
+ [ " -jcvf " , userSourceTarBz2 ] \
+ self . enabledTools ( )
self . _execute ( command , " tar command failed " )
return
def doRpm ( self ) :
self . svnTarball ( [ ] , self . _packageProjects )
2010-05-17 09:45:55 -05:00
2010-06-08 07:15:31 -05:00
for rpmDir in [ " SOURCES " , " SPECS " , " BUILD " , " tmp "
, " SRPMS " , " RPMS/i386 " , " RPMS/i686 " , " RPMS/x86_64 " ] :
rpmFullDir = os . path . join ( self . _rpmbuildDir , rpmDir )
if not os . path . isdir ( rpmFullDir ) :
os . makedirs ( rpmFullDir )
2010-05-17 09:45:55 -05:00
2011-02-02 04:40:25 -06:00
#rpmSpecFile = os.path.join ( self._rpmbuildDir, "SPECS" , "coriolis2.spec" )
2010-06-08 07:15:31 -05:00
rpmSourceFile = os . path . join ( self . _rpmbuildDir , " SOURCES " , self . _sourceTarBz2 )
sourceFile = os . path . join ( self . _tarballDir , self . _sourceTarBz2 )
2010-05-17 09:45:55 -05:00
2011-02-02 04:40:25 -06:00
#if os.path.isfile ( rpmSpecFile ):
# os.unlink ( rpmSpecFile )
#os.symlink ( self._specFile, rpmSpecFile )
2010-05-22 08:21:24 -05:00
2010-05-17 09:45:55 -05:00
if not os . path . islink ( rpmSourceFile ) :
os . symlink ( sourceFile , rpmSourceFile )
2010-06-08 07:15:31 -05:00
os . chdir ( self . _rpmbuildDir )
command = [ " /usr/bin/rpmbuild "
, " --define " , " _topdir %s " % self . _rpmbuildDir
, " --define " , " _tmppath %s " % self . _tmppathDir
, " --define " , " _enable_debug_packages 0 "
2011-02-02 04:40:25 -06:00
, " -ta " , " --with " , " binarytar " , rpmSourceFile ]
2010-05-17 09:45:55 -05:00
self . _execute ( command , " Rebuild rpm packages " )
return
2012-11-16 06:46:27 -06:00
def doDeb ( self ) :
self . svnTarball ( [ ] , self . _packageProjects )
2011-02-02 04:40:25 -06:00
if not os . path . isdir ( self . _debbuildDir ) :
os . makedirs ( self . _debbuildDir )
os . chdir ( self . _debbuildDir )
2011-02-02 08:08:12 -06:00
sourceFile = os . path . join ( self . _tarballDir , self . _sourceTarBz2 )
debOrigFile = os . path . join ( self . _debbuildDir , " coriolis2_1.0. %s .orig.tar.bz2 " % self . _svnTag )
2011-02-02 07:05:51 -06:00
if not os . path . islink ( debOrigFile ) :
2011-02-02 06:56:49 -06:00
os . link ( sourceFile , debOrigFile )
2011-02-02 04:40:25 -06:00
2011-02-02 06:56:49 -06:00
command = [ " /bin/tar " , " jxf " , debOrigFile ]
2011-02-02 04:40:25 -06:00
self . _execute ( command , " Unpacking pristine sources " )
#command = [ "/bin/cp", "-r", self._debianDir, "." ]
#self._execute ( command, "Copying Debian/Ubuntu package control files" )
packageDir = os . path . join ( self . _debbuildDir , " coriolis2-1.0. %s " % self . _svnTag )
os . chdir ( packageDir )
self . _environment [ " CFLAGS " ] = " -O2 "
self . _environment [ " CXXFLAGS " ] = " -O2 "
command = [ " /usr/bin/debuild " , " -us " , " -uc " ]
self . _execute ( command , " Rebuild Debian packages " )
return
2012-11-16 06:46:27 -06:00
def loadConfiguration ( self , confFile ) :
moduleGlobals = globals ( )
2012-11-17 09:01:05 -06:00
if not confFile :
print ' Making an educated guess to locate the configuration file: '
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-2.x/src/bootstrap '
, os . environ [ ' HOME ' ] + ' /chams/src/bootstrap '
, ' /users/outil/coriolis/coriolis-2.x/src/bootstrap '
, self . _rootDir + ' /src/bootstrap '
]
for location in locations :
confFile = location + ' /build.conf '
print ' < %s > ' % confFile
if os . path . isfile ( confFile ) : break
if not confFile :
ErrorMessage ( 1 , ' Cannot locate any configuration file. ' ) . terminate ( )
else :
if not os . path . isfile ( confFile ) :
ErrorMessage ( 1 , ' Missing configuration file: ' , ' < %s > ' % confFile ) . terminate ( )
2012-11-16 06:46:27 -06:00
print ' Reading configuration from: '
print ' < %s > ' % options . conf
try :
execfile ( confFile , moduleGlobals )
except Exception , e :
ErrorMessage ( 1 , ' An exception occured while loading the configuration file: '
, ' < %s > \n ' % ( confFile )
, ' You should check for simple python errors in this file. '
, ' Error was: '
, ' %s \n ' % e ) . terminate ( )
if moduleGlobals . has_key ( ' projects ' ) :
entryNb = 0
for entry in moduleGlobals [ ' projects ' ] :
entryNb + = 1
if not entry . has_key ( ' name ' ) :
raise ErrorMessage ( 1 , ' Missing project name in project entry # %d . ' % entryNb )
if not entry . has_key ( ' tools ' ) :
raise ErrorMessage ( 1 , ' Missing tools list in project entry # %d (< %s >). ' \
% ( entryNb , entry [ ' name ' ] ) )
if not isinstance ( entry [ ' tools ' ] , list ) :
raise ErrorMessage ( 1 , ' Tools item of project entry # %d (< %s >) is not a list. ' \
% ( entryNb , entry [ ' name ' ] ) )
if not entry . has_key ( ' repository ' ) :
raise ErrorMessage ( 1 , ' Missing project repository in project entry # %d . ' \
% entryNb )
self . register ( Project ( entry [ ' name ' ] , entry [ ' tools ' ] , entry [ ' repository ' ] ) )
else :
ErrorMessage ( 1 , ' Configuration file is missing the \' project \' symbol. '
, ' < %s > ' % confFile ) . terminate ( )
if moduleGlobals . has_key ( ' projectdir ' ) :
self . projectDir = moduleGlobals [ ' projectdir ' ]
if moduleGlobals . has_key ( ' svnconfig ' ) :
svnconfig = moduleGlobals [ ' svnconfig ' ]
if svnconfig . has_key ( ' method ' ) : self . _svnMethod = svnconfig [ ' method ' ]
if moduleGlobals . has_key ( ' package ' ) :
package = moduleGlobals [ ' package ' ]
if package . has_key ( ' name ' ) : self . packageName = package [ ' name ' ]
if package . has_key ( ' version ' ) : self . packageVersion = package [ ' version ' ]
if package . has_key ( ' excludes ' ) :
if not isinstance ( package [ ' excludes ' ] , list ) :
raise ErrorMessage ( 1 , ' Excludes of package configuration is not a list. ' )
self . _packageExcludes = package [ ' excludes ' ]
if package . has_key ( ' projects ' ) :
if not isinstance ( package [ ' projects ' ] , list ) :
raise ErrorMessage ( 1 , ' Projects to package is not a list. ' )
self . _packageProjects = package [ ' projects ' ]
return
def showConfiguration ( self ) :
print ' BuildCoriolis Configuration: '
if self . _svnMethod :
print ' SVN Method: < %s > ' % self . _svnMethod
else :
print ' SVN Method not defined, will not be able to checkout/commit. '
for project in self . _projects :
print ' project: %-15s repository:< %s > ' % ( ( ' < %s > ' % project . getName ( ) ) , project . getRepository ( ) )
toolOrder = 1
for tool in project . getTools ( ) :
print ' %s %02d :< %s > ' % ( ' ' * 26 , toolOrder , tool )
toolOrder + = 1
print
return
2010-03-16 11:18:09 -05:00
if __name__ == " __main__ " :
2012-11-16 06:46:27 -06:00
try :
scriptPath = os . path . abspath ( os . path . dirname ( sys . argv [ 0 ] ) )
print ' buildCoriolis.py is run from: '
print ' < %s > ' % scriptPath
parser = optparse . OptionParser ( )
# Build relateds.
2012-11-17 09:01:05 -06:00
parser . add_option ( " -c " , " --conf " , type = " string " , dest = " conf " , help = " Fichier de configuration. " )
2012-11-16 06:46:27 -06:00
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. " )
2012-12-14 09:36:52 -06:00
parser . add_option ( " --svn-diff " , action = " store_true " , dest = " svnDiff " , help = " Perform a diff against the SVN repository. " )
2012-11-16 06:46:27 -06:00
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 ( )
builder = ProjectBuilder ( )
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 "
if options . checkDeterminism : builder . enableDeterminism = " ON "
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 )
2012-12-14 09:36:52 -06:00
elif options . svnDiff : builder . svnDiff ( tools = options . tools , projects = options . projects )
2012-11-16 06:46:27 -06:00
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
sys . exit ( e . code )
#except Exception, e:
# print e
# sys.exit(1)
2010-03-16 11:18:09 -05:00
sys . exit ( 0 )