mirror of https://github.com/python/cpython
110 lines
3.9 KiB
Python
110 lines
3.9 KiB
Python
"""macgen_info - Generate CodeWarrior project, config source, resource file"""
|
|
import EasyDialogs
|
|
import os
|
|
import sys
|
|
import macfs
|
|
import MacOS
|
|
import macostools
|
|
import macgen_rsrc
|
|
# Note: this depends on being frozen, or on sys.path already being
|
|
# modified by macmodulefinder.
|
|
import makeconfig
|
|
|
|
TEMPLATEDIR=os.path.join(sys.prefix, ':Mac:mwerks:projects:build.macfreeze')
|
|
PROJECT_TEMPLATE=os.path.join(TEMPLATEDIR, ':frozen.prj')
|
|
CONFIG_TEMPLATE=os.path.join(TEMPLATEDIR, ':templatefrozenconfig.c')
|
|
BUNDLE_TEMPLATE=os.path.join(TEMPLATEDIR, ':frozenbundle.rsrc')
|
|
|
|
def generate(output, module_dict, debug=0, with_ifdef=0):
|
|
problems = 0
|
|
output_created=0
|
|
if not os.path.exists(output):
|
|
print 'Creating project folder', output
|
|
os.mkdir(output)
|
|
output_created = 1
|
|
# Resolve aliases, if needed
|
|
try:
|
|
fss, dummy1, dummy2 = macfs.ResolveAliasFile(output)
|
|
except macfs.error:
|
|
pass
|
|
else:
|
|
newname = fss.as_pathname()
|
|
if newname != output:
|
|
if debug:
|
|
print 'Alias', output
|
|
print 'Resolved to', newname
|
|
output = newname
|
|
# Construct the filenames
|
|
dummy, outfile = os.path.split(output)
|
|
build, ext = os.path.splitext(outfile)
|
|
if build == 'build' and ext[0] == '.':
|
|
# This is probably a good name for the project
|
|
projname = ext[1:]
|
|
else:
|
|
projname = 'frozenapplet.prj'
|
|
config_name = os.path.join(output, ':macfrozenconfig.c')
|
|
project_name = os.path.join(output, ':' + projname + '.prj')
|
|
resource_name = os.path.join(output, ':frozenmodules.rsrc')
|
|
bundle_name = os.path.join(output, ':frozenbundle.rsrc')
|
|
|
|
# Fill the output folder, if needed.
|
|
if output_created:
|
|
# Create the project, if needed
|
|
if not os.path.exists(project_name):
|
|
print 'Creating project', project_name
|
|
if not os.path.exists(PROJECT_TEMPLATE):
|
|
print '** No template CodeWarrior project found at', PROJECT_TEMPLATE
|
|
print ' To generate standalone Python applications from source you need'
|
|
print ' a full source distribution. Check http://www.cwi.nl/~jack/macpython.html'
|
|
print ' for details.'
|
|
problems = 1
|
|
else:
|
|
macostools.copy(PROJECT_TEMPLATE, project_name)
|
|
print 'A template CodeWarrior project has been copied to', project_name
|
|
print 'It is up to you to make the following changes:'
|
|
print '- Change the output file name'
|
|
print '- Change the search path, unless the folder is in the python home'
|
|
print '- Add sourcefiles/libraries for any extension modules used'
|
|
print '- Remove unused sources, to speed up the build process'
|
|
print '- Remove unused resource files (like tcl/tk) for a smaller binary'
|
|
problems = 1
|
|
macostools.copy(BUNDLE_TEMPLATE, bundle_name)
|
|
print 'A template bundle file has also been copied to', bundle_name
|
|
print 'You may want to adapt signature, size resource, etc'
|
|
|
|
|
|
# Create the resource file
|
|
macgen_rsrc.generate(resource_name, module_dict, debug=debug)
|
|
|
|
# Create the config.c file
|
|
if not os.path.exists(CONFIG_TEMPLATE):
|
|
print '** No template config.c found at', PROJECT_TEMPLATE
|
|
print ' To generate standalone Python applications from source you need'
|
|
print ' a full source distribution. Check http://www.cwi.nl/~jack/macpython.html'
|
|
print ' for details.'
|
|
problems = 1
|
|
else:
|
|
# Find elegible modules (builtins and dynamically loaded modules)
|
|
c_modules = []
|
|
for module in module_dict.keys():
|
|
if module_dict[module].gettype() in ('builtin', 'dynamic'):
|
|
c_modules.append(module)
|
|
ifp = open(CONFIG_TEMPLATE)
|
|
ofp = open(config_name, 'w')
|
|
makeconfig.makeconfig(ifp, ofp, c_modules, with_ifdef)
|
|
ifp.close()
|
|
ofp.close()
|
|
MacOS.SetCreatorAndType(config_name, 'CWIE', 'TEXT')
|
|
|
|
if warnings(module_dict):
|
|
problems = 1
|
|
return problems
|
|
|
|
def warnings(module_dict):
|
|
problems = 0
|
|
for name, module in module_dict.items():
|
|
if module.gettype() not in ('builtin', 'module', 'dynamic', 'package'):
|
|
problems = problems + 1
|
|
print 'Warning: %s not included: %s %s'%(name, module.gettype(), module)
|
|
return problems
|