| #! /usr/bin/env python |
| # -*- coding: utf-8 -*- |
| |
| # the following two variables are used by the target "waf dist" |
| # if you change 'em here, you need to change it also in cloud.spec, add a %changelog entry there, and add an entry in debian/changelog |
| VERSION = '1.0.8' |
| APPNAME = 'cloud-bridge' |
| |
| import shutil,os,glob |
| import email,time |
| import optparse |
| import platform |
| import Utils,Node,Options,Logs,Scripting,Environment,Build,Configure |
| from subprocess import Popen as _Popen,PIPE |
| import os |
| import sys |
| from os import unlink as _unlink, makedirs as _makedirs, getcwd as _getcwd, chdir as _chdir |
| from os.path import abspath as _abspath, basename as _basename, dirname as _dirname, exists as _exists, isdir as _isdir, split as _split, join as _join, sep, pathsep, pardir, curdir |
| from glob import glob as _glob |
| import zipfile,tarfile |
| try: |
| from os import chmod as _chmod,chown as _chown |
| import pwd,stat,grp |
| except ImportError: |
| _chmod,_chown,pwd,stat,grp = (None,None,None,None,None) |
| import xml.dom.minidom |
| import re |
| |
| # CENTOS does not have this -- we have to put this here |
| try: |
| from subprocess import check_call as _check_call |
| from subprocess import CalledProcessError |
| except ImportError: |
| def _check_call(*popenargs, **kwargs): |
| import subprocess |
| retcode = subprocess.call(*popenargs, **kwargs) |
| cmd = kwargs.get("args") |
| if cmd is None: cmd = popenargs[0] |
| if retcode: raise CalledProcessError(retcode, cmd) |
| return retcode |
| |
| class CalledProcessError(Exception): |
| def __init__(self, returncode, cmd): |
| self.returncode = returncode ; self.cmd = cmd |
| def __str__(self): return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode) |
| |
| # these variables are mandatory ('/' are converted automatically) |
| srcdir = '.' |
| blddir = 'artifacts' |
| |
| Configure.autoconfig = True |
| |
| # things never to consider when building or installing |
| for pattern in ["**/.project","**/.classpath"]: Node.exclude_regs += "\n%s"%pattern |
| |
| # Support functions |
| |
| # this will enforce the after= ordering constraints in the javac task generators |
| from TaskGen import after, feature |
| @feature('*') |
| @after('apply_core', 'apply_java', 'apply_subst') |
| def process_after(self): |
| lst = self.to_list(getattr(self, 'after', [])) |
| for x in lst: |
| obj = self.bld.name_to_obj(x,self.bld.env) |
| if not obj: break |
| obj.post() |
| for a in obj.tasks: |
| for b in self.tasks: |
| b.set_run_after(a) |
| |
| Build.BuildContext.process_after = staticmethod(process_after) |
| |
| def _getbuildcontext(): |
| ctx = Build.BuildContext() |
| ctx.load_dirs(_abspath(srcdir),_abspath(blddir)) |
| ctx.load_envs() |
| return ctx |
| |
| def set_options(opt): |
| """Register command line options""" |
| opt.tool_options('gnu_dirs') |
| |
| inst_dir = opt.get_option_group('--bindir') # get the group that contains bindir |
| inst_dir.add_option('--javadir', # add javadir to the group that contains bindir |
| help = 'Java class and jar files [Default: ${DATADIR}/java]', |
| default = '', |
| dest = 'JAVADIR') |
| inst_dir.add_option('--no-dep-check', |
| action='store_true', |
| help = 'Skip dependency check and assume JARs already exist', |
| default = False, |
| dest = 'NODEPCHECK') |
| inst_dir.add_option('--fast', |
| action='store_true', |
| help = 'does ---no-dep-check', |
| default = False, |
| dest = 'NODEPCHECK') |
| inst_dir.add_option('--package-version', |
| help = 'package version', |
| default = '', |
| dest = 'VERNUM') |
| |
| def showconfig(conf): |
| """prints out the current configure environment configuration""" |
| conf = _getbuildcontext() |
| |
| Utils.pprint("WHITE","Build environment:") |
| for key,val in sorted(conf.env.get_merged_dict().items()): |
| if "CLASSPATH" in key: |
| Utils.pprint("BLUE"," %s:"%key) |
| for v in val.split(pathsep): |
| Utils.pprint("BLUE"," %s"%v) |
| continue |
| Utils.pprint("BLUE"," %s: %s"%(key,val)) |
| |
| def runant(tsk): |
| environ = dict(os.environ) |
| environ["CATALINA_HOME"] = tsk.env.TOMCATHOME |
| environ["AXIS2_HOME"] = "." |
| if tsk.generator.env.DISTRO == "Windows": |
| stanzas = [ |
| "ant", |
| "-Dcloud-bridge.classpath=\"%s\""%(tsk.env.CLASSPATH.replace(os.pathsep,",")), |
| ] |
| else: |
| stanzas = [ |
| 'ant', |
| "-Dcloud-bridge.classpath=%s"%(tsk.env.CLASSPATH.replace(os.pathsep,",")), |
| ] |
| stanzas += tsk.generator.antargs + tsk.generator.anttgts |
| return Utils.exec_command(" ".join(stanzas),cwd=tsk.generator.bld.srcnode.abspath(),env=environ,log=True,shell=False) |
| Utils.runant = runant |
| |
| def relpath(path, start="."): |
| if not path: raise ValueError("no path specified") |
| |
| start_list = os.path.abspath(start).split(sep) |
| path_list = os.path.abspath(path).split(sep) |
| |
| # Work out how much of the filepath is shared by start and path. |
| i = len(os.path.commonprefix([start_list, path_list])) |
| |
| rel_list = [pardir] * (len(start_list)-i) + path_list[i:] |
| if not rel_list: |
| return curdir |
| return os.path.join(*rel_list) |
| Utils.relpath = relpath |
| |
| def mkdir_p(directory): |
| if not _isdir(directory): |
| Utils.pprint("GREEN","Creating directory %s and necessary parents"%directory) |
| _makedirs(directory) |
| |
| def getdebdeps(): |
| def debdeps(fileset): |
| for f in fileset: |
| lines = file(f).readlines() |
| lines = [ x[len("Build-Depends: "):] for x in lines if x.startswith("Build-Depends") ] |
| for l in lines: |
| deps = [ x.strip() for x in l.split(",") ] |
| for d in deps: |
| if "%s-"%APPNAME in d: continue |
| yield d |
| yield "build-essential" |
| yield "devscripts" |
| yield "debhelper" |
| |
| deps = set(debdeps(["debian/control"])) |
| return deps |
| |
| def throws_command_errors(f): |
| def g(*args,**kwargs): |
| try: return f(*args,**kwargs) |
| except CalledProcessError,e: |
| raise Utils.WafError("system command %s failed with error value %s"%(e.cmd[0],e.returncode)) |
| except IOError,e: |
| if e.errno is 32: |
| raise Utils.WafError("system command %s terminated abruptly, closing communications with parent's pipe"%e.cmd[0]) |
| raise |
| return g |
| |
| def c(cmdlist,cwd=None): |
| # Run a command with _check_call, pretty-printing the cmd list |
| Utils.pprint("BLUE"," ".join(cmdlist)) |
| return _check_call(cmdlist,cwd=cwd) |
| |
| |
| """ """ |
| """ Custom waf targets """ |
| """ """ |
| |
| def viewdebdeps(context): |
| """shows all the necessary dependencies to build the DEB packages of the Bridge""" |
| for dep in getdebdeps(): print dep |
| |
| @throws_command_errors |
| def deb(context): |
| """Builds DEB packages of the Bridge""" |
| Utils.pprint("GREEN","Building DEBs") |
| basedir = os.path.realpath(os.path.curdir) + "/packages/config" |
| checkdeps = lambda: c(["dpkg-checkbuilddeps"], basedir) |
| dodeb = lambda: c(["debuild", '-e','WAFCACHE','--no-lintian', "-us","-uc", "-b"], basedir) |
| try: checkdeps() |
| except (CalledProcessError,OSError),e: |
| Utils.pprint("YELLOW","Dependencies might be missing.") |
| dodeb() |
| |
| |
| @throws_command_errors |
| def rpm(context): |
| """Builds RPM packages of the Bridge""" |
| Utils.pprint("GREEN","Building RPMs") |
| basedir = os.path.realpath(os.path.curdir) + "/packages/config/rpm" |
| outputdir = basedir + "/tmp" |
| sourcedir = _join(outputdir,"SOURCES") |
| specfile = basedir + "/cloudbridge.spec" |
| if Options.options.VERNUM: |
| ver = Options.options.VERNUM |
| else: ver = "1.0.1" |
| |
| tarball = Scripting.dist('', ver) |
| |
| if _exists(outputdir): shutil.rmtree(outputdir) |
| for a in ["RPMS/noarch","SRPMS","BUILD","SPECS","SOURCES"]: mkdir_p(_join(outputdir,a)) |
| shutil.copy(tarball,_join(sourcedir,tarball)) |
| |
| packagever = ["--define", "_ver %s" % ver] |
| checkdeps = lambda: c(["rpmbuild", "--define", "_topdir %s"%outputdir, "--nobuild", specfile]+packagever) |
| dorpm = lambda: c(["rpmbuild", "--define", "_topdir %s"%outputdir, "-bb", specfile]+packagever) |
| try: checkdeps() |
| except (CalledProcessError,OSError),e: |
| Utils.pprint("YELLOW","Dependencies might be missing.") |
| dorpm() |
| for rpm in glob.glob(basedir + "/tmp/RPMS/*/*.rpm"): |
| shutil.copy(rpm, basedir + "/../..") |
| |
| def uninstallrpms(context): |
| """uninstalls any Cloud Bridge RPMs on this system""" |
| Utils.pprint("GREEN","Uninstalling any installed RPMs") |
| cmd = "rpm -qa | grep cloud-bridge | xargs -r sudo rpm -e" |
| Utils.pprint("BLUE",cmd) |
| os.system(cmd) |
| |
| def uninstalldebs(context): |
| """uninstalls any Cloud Bridge DEBs on this system""" |
| Utils.pprint("GREEN","Uninstalling any installed DEBs") |
| cmd = "dpkg -l 'cloud-bridge*' | grep ^i | awk '{ print $2 } ' | xargs aptitude purge -y" |
| Utils.pprint("BLUE",cmd) |
| os.system(cmd) |