Skip to content
Snippets Groups Projects
dct_launch.py 7.77 KiB
Newer Older
#!/usr/bin/env python
'''
Created on Feb 3, 2013

@author: vigano
'''

import sys
import os

import zUtil_Python as dct

class DCTLauncher(object):

    def __init__(self, args):
        self.initialized = False

        self.dct_dir = os.path.abspath(os.path.dirname(args[0]))

        self.confPath = os.path.join(self.dct_dir, "conf.xml")
        self.confPath = os.path.abspath(self.confPath)
        try:
            if len(args) is 1:
                print("Defaulting to matlab")
                args.append("matlab")

            cmd = args[1]
            if cmd in ("-h", "--help"):
                self.command = "help"
            else:
                self.command = cmd

            self.args = args[2:]
            self.initialized = True
        except ValueError as ex:
            dct.dct_io_xml.DCTOutput.printError(ex.args)

    def run(self):
        if self.command == "help":
            self.printHelp()
        elif self.command == "matlab":
            self._launchMatlab()
        elif self.command == "matlab_script":
            self._launchMatlabScript()
        elif self.command == "update":
            self._launchUpdate()
        elif self.command == "compile_mex":
            self._launchCompileMex()
        elif self.command == "compile_matlab":
            self._launchCompileMatlab()
        elif self.command == "update_conf":
            self._launchUpdateConf()
        elif self.command == "batch":
            self._launchBatch()
        elif self.command == "make":
            self._launchMake()
        elif self.command == "publish":
            self._launchPublish()
            raise ValueError("Command not recognized: '%s'" % self.command)
        from zUtil_Python.dct_compile_matlab_functions import FunctionsBuilder
        if os.path.exists(self.confPath) is False:
            raise SystemError("File conf.xml not found in DCT directory")

        if (len(self.args) is not 0) and self.args[0] in ("-h", "--help"):
            print(" Usage:")
            print("   # python %s matlab [options]" % os.path.basename(__file__))
            print(" Where [options] are the options for matlab")
        else:
            invoker = dct.dct_matlab_invocation.DCTMatlabInvocation(dct_dir = self.dct_dir, \
                                                                    extra_args = self.args)
            func_builder = FunctionsBuilder(matlab_path = "", \
                                            dct_dir = self.dct_dir, \
                                            verboseLevel = 0)
            func_builder.generateMfile()
            
    def _launchMatlabScript(self):
        from zUtil_Python.dct_compile_matlab_functions import FunctionsBuilder
        if os.path.exists(self.confPath) is False:
            raise SystemError("File conf.xml not found in DCT directory")

        if (len(self.args) is not 0) and self.args[0] in ("-h", "--help"):
            print(" Usage:")
            print("   # python %s matlab_script [matlab_commands]" % os.path.basename(__file__))
            print(" Where [matlab_commands] could be a script name or malab commands")
        else:
            invoker = dct.dct_matlab_invocation.DCTMatlabInvocation(dct_dir = self.dct_dir, \
                                                                    extra_cmds = self.args, \
                                                                    skip_functions_check = True)

            invoker.invoke()

    def _launchUpdate(self):
        util = dct.dct_utils_git.DCTGit(self.dct_dir)
        util.updateRepo()

    def _launchCompileMex(self):
        from zUtil_Python.dct_compile_mex_functions import MexBuilder

        try:
            mex_builder = MexBuilder.getInstanceFromArgs(args_compile, dct_dir = self.dct_dir)
            mex_builder.findMexs()
            mex_builder.compileFuncs()
        except ValueError as ex:
            if (len(ex.args) is not 0) and (ex.args[0] is not ""):
                dct.dct_io_xml.DCTOutput.printError(ex.args)
            MexBuilder("").printHelp();
        except EnvironmentError as ex:
            if ex.filename is not None:
                args = ", ".join([str(x) for x in ex.args]);
                ":".join((args, " "))
                dct.dct_io_xml.DCTOutput.printError((args, ex.filename))
            else:
                dct.dct_io_xml.DCTOutput.printError(ex.args)
        except Exception as ex:
            dct.dct_io_xml.DCTOutput.printError(ex.args)

    def _launchCompileMatlab(self):
        from zUtil_Python.dct_compile_matlab_functions import FunctionsBuilder

        try:
            func_builder = FunctionsBuilder.getInstanceFromArgs(args_compile, dct_dir = self.dct_dir)

            if func_builder.do_generate is True:
                func_builder.generateMfile()
            if func_builder.do_compile is True:
                func_builder.compileFuncs()
        except ValueError as ex:
            if (len(ex.args) is not 0) and (ex.args[0] is not ""):
                dct.dct_io_xml.DCTOutput.printError(ex.args)
            FunctionsBuilder("").printHelp();

    def _launchUpdateConf(self):
        upd = dct.dct_io_xml.DCTConfUpdater(self.dct_dir)
        confexamplefile = os.path.join(self.dct_dir, "zUtil_Conf", "conf.example.xml")
        upd.safelyInstallNewFile(confexamplefile, "conf.xml")

    def _launchBatch(self):
        args = [__file__] + self.args
        bt = dct.dct_batch.DCTBatch.getInstanceFromArgs(args)
        bt.execute(self.args)

    def _launchMake(self):
        if len(self.args) is 0:
            raise ValueError("Not enough arguments")

        if self.args[0] == "install_zip":
            builder = dct.dct_distrib.DCTMakeInstallBundle()
            if len(self.args) >= 2:
                builder.run(self.dct_dir, destFile = self.args[1])
            else:
                builder.run(self.dct_dir)
        else:
            raise ValueError("Unsupported make option: '%s'" % " ".join(self.args))

    def _launchPublish(self):
        if len(self.args) is 0:
            raise ValueError("Not enough arguments")

        if self.args[0] == "install_zip":
            utils = dct.dct_utils_git.DCTGit(self.dct_dir)
            sf_account = utils.getSourceForgeAccount()

            if len(self.args) >= 2:
                filename = self.args[1]
            else:
                filename = "dct-install.zip"
            destination = "%s,dct@frs.sourceforge.net:/home/frs/project/dct/%s" \
                            % (sf_account, os.path.basename(filename))
            utils_p = dct.dct_utils_platform.UtilsFactory.getMachineDep()
            utils_p.scpFile(filename, destination)
        else:
            raise ValueError("Unsupported publish option: '%s'" % " ".join(self.args))
        launchname = os.path.basename(__file__)
        print("\"%s\" launches dct or one of the maintenance routines in the DCT directory: \"%s\"" %
              (launchname, self.dct_dir) )
        print("   # python %s command [options]" % launchname)
        print("   # python %s command -h | --help : to show command's help" % launchname)
        print("   # python %s -h | --help : to show this help" % launchname)
        print("   matlab\n   update\n   compile_mex\n   compile_matlab\n   update_conf\n   batch")


if __name__ == '__main__':
    launcher = DCTLauncher(sys.argv)
    if launcher.initialized is False:
        launcher.printHelp()
        sys.exit(1)

    try:
        launcher.run()
    except SystemError as ex:
        dct.dct_io_xml.DCTOutput.printError(ex.args)
        print("Try running:\n  # python %s update_conf" % __file__)
    except ValueError as ex:
        dct.dct_io_xml.DCTOutput.printError(ex.args)