srcanamdw/codescanner/pyinstaller/MakeCOMServer_old.py
author noe\swadi
Thu, 18 Feb 2010 12:29:02 +0530
changeset 1 22878952f6e2
permissions -rw-r--r--
Committing the CodeScanner Core tool This component has been moved from the StaticAnaApps package. BUG : 5889 (http://developer.symbian.org/webbugs/show_bug.cgi?id=5889).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     1
# Copyright (C) 2005, Giovanni Bajo
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     2
# Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     3
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     4
# This program is free software; you can redistribute it and/or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     5
# modify it under the terms of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     6
# as published by the Free Software Foundation; either version 2
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     7
# of the License, or (at your option) any later version.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     8
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
     9
# This program is distributed in the hope that it will be useful,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    12
# GNU General Public License for more details.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    13
#
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    14
# You should have received a copy of the GNU General Public License
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    15
# along with this program; if not, write to the Free Software
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    17
import string, os, sys, win32api, Makespec
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    18
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    19
modspec = """\
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    20
    %(mod)s.%(klass)s._reg_class_spec_ = "%(mod)s.%(klass)s"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    21
    if (not hasattr(%(mod)s.%(klass)s, '_reg_clsctx_') or
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    22
        %(mod)s.%(klass)s._reg_clsctx_ & pythoncom.CLSCTX_INPROC):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    23
        %(mod)s.%(klass)s._reg_options_ = {'InprocServer32':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    24
             os.path.abspath(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    25
                 os.path.join(
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    26
                     os.path.dirname(sys.executable), "%(dllname)s"))}
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    27
""" #mod, klass, dllname
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    28
tmplt = """\
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    29
import sys
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    30
import string
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    31
import os
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    32
inprocess = getattr(sys, 'frozen', None)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    33
%(modimports)s
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    34
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    35
register = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    36
for i in range(1, len(sys.argv)):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    37
    arg = sys.argv[i]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    38
    if string.find(arg, "reg") > -1:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    39
        register = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    40
        if arg == '/unreg':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    41
            sys.argv[i] = '--unregister'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    42
if register:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    43
    import pythoncom
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    44
    pythoncom.frozen = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    45
%(modspecs)s
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    46
    from win32com.server import register
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    47
    register.UseCommandLine(%(regspecs)s, %(flags)s)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    48
else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    49
    #older Python's need to force this import before pythoncom does it
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    50
    import win32com.server.policy
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    51
    if inprocess == 'dll':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    52
        pass
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    53
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    54
        import win32com.server.localserver
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    55
        win32com.server.localserver.main()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    56
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    57
""" #modimports, modspecs regspecs, flags
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    58
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    59
def create(scripts, debug, verbosity, workdir, ascii=0):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    60
    infos = []  # (path, module, klasses)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    61
    for script in scripts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    62
        infos.append(analscriptname(script))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    63
    outfnm = 'drive%s.py' % infos[0][1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    64
    dllname = 'drive%s.dll' % infos[0][1]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    65
    if not os.path.exists(workdir):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    66
        os.makedirs(workdir)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    67
    outfnm = os.path.join(workdir, outfnm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    68
    outf = open(outfnm, 'w')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    69
    modspecs = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    70
    regspecs = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    71
    modimports = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    72
    flags = 'debug=0, quiet=%s' % (verbosity==0)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    73
    paths = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    74
    for path, module, klasses in infos:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    75
        if path:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    76
            paths.append(path)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    77
        for klass in klasses:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    78
            d = { 'mod':module, 'klass':klass, 'dllname':dllname }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    79
            modspecs.append(modspec % d)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    80
            regspecs.append('%(mod)s.%(klass)s' % d)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    81
            modimports.append("import %(mod)s" % d)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    82
    for i in range(len(paths)):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    83
        path = paths[i]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    84
        paths[i] = win32api.GetShortPathName(os.path.normpath(path))
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    85
    modspecs = string.join(modspecs, '\n')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    86
    modimports = string.join(modimports, '\n')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    87
    regspecs = string.join(regspecs, ', ')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    88
    d = { 'modspecs':modspecs,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    89
          'regspecs':regspecs,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    90
          'modimports':modimports,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    91
          'flags':flags }
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    92
    outf.write( tmplt % d )
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    93
    outf.close()
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    94
    print "**********************************"
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    95
    print "Driver script %s created" % outfnm
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    96
    specfnm = Makespec.main([outfnm], console=debug, debug=debug,
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    97
                            workdir=workdir, pathex=paths, comserver=1, ascii=ascii)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    98
    print "Spec file %s created" % specfnm
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
    99
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   100
def analscriptname(script):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   101
    # return (path, module, klasses)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   102
    path, basename = os.path.split(script)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   103
    module = os.path.splitext(basename)[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   104
    while ispkgdir(path):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   105
        path, basename = os.path.split(path)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   106
        module = '%s.%s' % (basename, module)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   107
    try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   108
        __import__(module)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   109
    except ImportError:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   110
        oldpath = sys.path[:]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   111
        sys.path.insert(0, path)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   112
        try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   113
            __import__(module)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   114
        finally:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   115
            sys.path = oldpath
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   116
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   117
        path = None
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   118
    m = sys.modules[module]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   119
    klasses = []
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   120
    for nm, thing in m.__dict__.items():
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   121
        if hasattr(thing, '_reg_clsid_'):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   122
            klasses.append(nm)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   123
    return (path, module, klasses)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   124
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   125
def ispkgdir(path):
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   126
    try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   127
        open(os.path.join(path, '__init__.py'), 'r')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   128
    except IOError:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   129
        try:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   130
            open(os.path.join(path, '__init__.pyc'), 'rb')
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   131
        except IOError:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   132
            return 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   133
    return 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   134
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   135
usage = """\
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   136
Usage: python %s [options] <scriptname>.py [<scriptname>.py ...]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   137
 --debug -> use debug console build and register COM servers with debug
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   138
 --verbose -> use verbose flag in COM server registration
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   139
 --out dir -> generate script and spec file in dir
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   140
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   141
The next step is to run Build.py against the generated spec file.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   142
See doc/Tutorial.html for details.
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   143
"""
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   144
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   145
if __name__ == '__main__':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   146
    #scripts, debug, verbosity, workdir
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   147
    debug = verbosity = ascii = 0
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   148
    workdir = '.'
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   149
    import getopt
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   150
    opts, args = getopt.getopt(sys.argv[1:], '', ['debug', 'verbose', 'ascii', 'out='])
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   151
    for opt, val in opts:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   152
        if opt == '--debug':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   153
            debug = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   154
        elif opt == '--verbose':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   155
            verbosity = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   156
        elif opt == '--out':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   157
            workdir = val
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   158
        elif opt == '--ascii':
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   159
            ascii = 1
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   160
        else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   161
            print usage % sys.argv[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   162
            sys.exit(1)
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   163
    if not args:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   164
        print usage % sys.argv[0]
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   165
    else:
22878952f6e2 Committing the CodeScanner Core tool
noe\swadi
parents:
diff changeset
   166
        create(args, debug, verbosity, workdir, ascii)