diff -r 509e4801c378 -r 22878952f6e2 srcanamdw/codescanner/pyinstaller/Makespec.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srcanamdw/codescanner/pyinstaller/Makespec.py Thu Feb 18 12:29:02 2010 +0530 @@ -0,0 +1,273 @@ +#! /usr/bin/env/python +# Automatically build spec files containing a description of the project +# Copyright (C) 2005, Giovanni Bajo +# Based on previous work under copyright (c) 2002 McMillan Enterprises, Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +import sys, os, string + +# For Python 1.5 compatibility +try: + True +except: + True,False = 1,0 + +freezetmplt = """\ +a = Analysis(%(scripts)s, + pathex=%(pathex)s) +pyz = PYZ(a.pure) +exe = EXE(%(tkpkg)s pyz, + a.scripts, + a.binaries, + name='%(exename)s', + debug=%(debug)s, + strip=%(strip)s, + upx=%(upx)s, + console=%(console)s %(exe_options)s) +""" # pathex scripts exename tkpkg debug console + +collecttmplt = """\ +a = Analysis(%(scripts)s, + pathex=%(pathex)s) +pyz = PYZ(a.pure) +exe = EXE(pyz, + a.scripts, + exclude_binaries=1, + name='%(builddir)s/%(exename)s', + debug=%(debug)s, + strip=%(strip)s, + upx=%(upx)s, + console=%(console)s %(exe_options)s) +coll = COLLECT(%(tktree)s exe, + a.binaries, + strip=%(strip)s, + upx=%(upx)s, + name='%(distdir)s') +""" # scripts pathex, exename, debug, console tktree distdir + +comsrvrtmplt = """\ +a = Analysis(%(scripts)s, + pathex=%(pathex)s) +pyz = PYZ(a.pure) +exe = EXE(pyz, + a.scripts, + exclude_binaries=1, + name='%(builddir)s/%(exename)s', + debug=%(debug)s, + strip=%(strip)s, + upx=%(upx)s, + console=%(console)s %(exe_options)s) +dll = DLL(pyz, + a.scripts, + exclude_binaries=1, + name='%(builddir)s/%(dllname)s', + debug=%(debug)s) +coll = COLLECT(exe, dll, + a.binaries, + strip=%(strip)s, + upx=%(upx)s, + name='%(distdir)s') +""" # scripts pathex, exename, debug, console tktree distdir +HOME = os.path.dirname(sys.argv[0]) +if HOME == '': + HOME = os.getcwd() +if not os.path.isabs(HOME): + HOME = os.path.abspath(HOME) +iswin = sys.platform[:3] == "win" +cygwin = sys.platform == "cygwin" +try: + config = eval(open(os.path.join(HOME, 'config.dat'), 'r').read()) +except IOError: + print "You must run Configure.py before building!" + sys.exit(1) + +if config['pythonVersion'] != sys.version: + print "The current version of Python is not the same with which PyInstaller was configured." + print "Please re-run Configure.py with this version." + sys.exit(1) + +def quote_win_filepath( path ): + # quote all \ with another \ after using normpath to clean up the path + return string.join( string.split( os.path.normpath( path ), '\\' ), '\\\\' ) + +# Support for trying to avoid hard-coded paths in the .spec files. +# Eg, all files rooted in the Installer directory tree will be +# written using "HOMEPATH", thus allowing this spec file to +# be used with any Installer installation. +# Same thing could be done for other paths too. +path_conversions = ( + (HOME, "HOMEPATH"), + # Add Tk etc? + ) + +def make_variable_path(filename, conversions = path_conversions): + for (from_path, to_name) in conversions: + assert os.path.abspath(from_path)==from_path, \ + "path '%s' should already be absolute" % (from_path,) + if filename[:len(from_path)] == from_path: + rest = filename[len(from_path):] + if rest[0] in "\\/": + rest = rest[1:] + return to_name, rest + return None, filename + +# An object used in place of a "path string" which knows how to repr() +# itself using variable names instead of hard-coded paths. +class Path: + def __init__(self, *parts): + self.path = apply(os.path.join, parts) + self.variable_prefix = self.filename_suffix = None + def __repr__(self): + if self.filename_suffix is None: + self.variable_prefix, self.filename_suffix = make_variable_path(self.path) + if self.variable_prefix is None: + return repr(self.path) + return "os.path.join(" + self.variable_prefix + "," + repr(self.filename_suffix) + ")" + +def main(scripts, name=None, tk=0, freeze=0, console=1, debug=0, strip=0, upx=0, + comserver=0, ascii=0, workdir=None, pathex=[], version_file=None, icon_file=None): + if name is None: + name = os.path.splitext(os.path.basename(scripts[0]))[0] + distdir = "dist%s" % name + builddir = "build%s" % name + pathex = pathex[:] + if workdir is None: + workdir = os.getcwd() + pathex.append(workdir) + else: + pathex.append(os.getcwd()) + if workdir == HOME: + workdir = os.path.join(HOME, name) + if not os.path.exists(workdir): + os.makedirs(workdir) + exe_options = '' + if version_file: + exe_options = "%s, version='%s'" % (exe_options, quote_win_filepath(version_file)) + if icon_file: + exe_options = "%s, icon='%s'" % (exe_options, quote_win_filepath(icon_file)) + if not ascii and config['hasUnicode']: + scripts.insert(0, os.path.join(HOME, 'support', 'useUnicode.py')) + for i in range(len(scripts)): + scripts[i] = Path(scripts[i]) # Use relative path in specfiles + + d = {'tktree':'', + 'tkpkg' :'', + 'scripts':scripts, + 'pathex' :pathex, + 'exename': '', + 'distdir': distdir, + 'builddir': builddir, + 'debug': debug, + 'strip': strip, + 'upx' : upx, + 'console': console or debug, + 'exe_options': exe_options} + if tk: + d['tktree'] = "TkTree()," + if freeze: + scripts.insert(0, Path(HOME, 'support', 'useTK.py')) + scripts.insert(0, Path(HOME, 'support', 'unpackTK.py')) + scripts.append(Path(HOME, 'support', 'removeTK.py')) + d['tkpkg'] = "TkPKG()," + else: + scripts.insert(0, Path(HOME, 'support', 'useTK.py')) + scripts.insert(0, Path(HOME, 'support', '_mountzlib.py')) + if iswin or cygwin: + d['exename'] = name+'.exe' + d['dllname'] = name+'.dll' + else: + d['exename'] = name + d['console'] = 1 + specfnm = os.path.join(workdir, name+'.spec') + specfile = open(specfnm, 'w') + if freeze: + specfile.write(freezetmplt % d) + elif comserver: + specfile.write(comsrvrtmplt % d) + else: + specfile.write(collecttmplt % d) + specfile.close() + return specfnm + +if __name__ == '__main__': + import optparse + p = optparse.OptionParser( + usage="python %prog [opts] [ ...]" + ) + p.add_option("-F", "--onefile", dest="freeze", + action="store_true", default=False, + help="create a single file deployment") + p.add_option("-D", "--onedir", dest="freeze", action="store_false", + help="create a single directory deployment (default)") + p.add_option("-w", "--windowed", "--noconsole", dest="console", + action="store_false", default=True, + help="use a Windows subsystem executable (Windows only)") + p.add_option("-c", "--nowindowed", "--console", dest="console", + action="store_true", + help="use a console subsystem executable (Windows only) " + "(default)") + p.add_option("-a", "--ascii", action="store_true", default=False, + help="do NOT include unicode encodings " + "(default: included if available)") + p.add_option("-d", "--debug", action="store_true", default=False, + help="use the debug (verbose) build of the executable") + p.add_option("-s", "--strip", action="store_true", default=False, + help="strip the exe and shared libs " + "(don't try this on Windows)") + p.add_option("-X", "--upx", action="store_true", default=False, + help="use UPX if available (works differently between " + "Windows and *nix)") + p.add_option("-K", "--tk", default=False, action="store_true", + help="include TCL/TK in the deployment") + p.add_option("-o", "--out", type="string", default=None, + dest="workdir", metavar="DIR", + help="generate the spec file in the specified directory") + p.add_option("-n", "--name", type="string", default=None, + help="name to assign to the project, from which the spec file " + "name is generated. (default: use the basename of the " + "(first) script)") + p.add_option("-p", "--paths", type="string", default=[], dest="pathex", + metavar="DIR", action="append", + help="set base path for import (like using PYTHONPATH). " + "Multiple directories are allowed, separating them " + "with %s, or using this option multiple times" + % repr(os.pathsep)) + p.add_option("-v", "--version", type="string", + dest="version_file", metavar="FILE", + help="add a version resource from FILE to the exe " + "(Windows only)") + p.add_option("--icon", type="string", dest="icon_file", + metavar="FILE.ICO or FILE.EXE,ID", + help="If FILE is an .ico file, add the icon to the final " + "executable. Otherwise, the syntax 'file.exe,id' to " + "extract the icon with the specified id " + "from file.exe and add it to the final executable") + + opts,args = p.parse_args() + + # Split pathex by using the path separator + temppaths = opts.pathex[:] + opts.pathex = [] + for p in temppaths: + opts.pathex.extend(string.split(p, os.pathsep)) + + if not args: + p.print_help() + sys.exit(1) + + nm = apply(main, (args,), opts.__dict__) + print "wrote %s" % nm + print "now run Build.py to build the executable"