import cwxmlgen
import cwtalker
import os
from Carbon import AppleEvents
import Carbon.File

def mkproject(outputfile, modulename, settings, force=0, templatename=None):
	#
	# Copy the dictionary
	#
	dictcopy = {}
	for k, v in settings.items():
		dictcopy[k] = v
	#
	# Generate the XML for the project
	#
	dictcopy['mac_projectxmlname'] = outputfile + '.xml'
	dictcopy['mac_exportname'] = os.path.split(outputfile)[1] + '.exp'
	if not dictcopy.has_key('mac_dllname'):
		dictcopy['mac_dllname'] = modulename + '.ppc.slb'
	if not dictcopy.has_key('mac_targetname'):
		dictcopy['mac_targetname'] = modulename + '.ppc'
	
	xmlbuilder = cwxmlgen.ProjectBuilder(dictcopy, templatename=templatename)
	xmlbuilder.generate()
	if not force:
		# We do a number of checks and all must succeed before we decide to
		# skip the build-project step:
		# 1. the xml file must exist, and its content equal to what we've generated
		# 2. the project file must exist and be newer than the xml file
		# 3. the .exp file must exist
		if os.path.exists(dictcopy['mac_projectxmlname']):
			fp = open(dictcopy['mac_projectxmlname'])
			data = fp.read()
			fp.close()
			if data == dictcopy["tmp_projectxmldata"]:
				if os.path.exists(outputfile) and \
						os.stat(outputfile)[os.path.ST_MTIME] > os.stat(dictcopy['mac_projectxmlname'])[os.path.ST_MTIME]:
					if os.path.exists(outputfile + '.exp'):
						return
	fp = open(dictcopy['mac_projectxmlname'], "w")
	fp.write(dictcopy["tmp_projectxmldata"])
	fp.close()
	#
	# Generate the export file
	#
	fp = open(outputfile + '.exp', 'w')
	fp.write('init%s\n'%modulename)
	if dictcopy.has_key('extraexportsymbols'):
		for sym in dictcopy['extraexportsymbols']:
			fp.write('%s\n'%sym)
	fp.close()
	#
	# Generate the project from the xml
	#
	makeproject(dictcopy['mac_projectxmlname'], outputfile)
	
def makeproject(xmlfile, projectfile):
	cw = cwtalker.MyCodeWarrior(start=1)
	cw.send_timeout = AppleEvents.kNoTimeOut
	xmlfss = Carbon.File.FSSpec(xmlfile)
	prjfss = Carbon.File.FSSpec(projectfile)
	cw.my_mkproject(prjfss, xmlfss)
	cw.Close_Project()
	
def buildproject(projectfile):
	cw = cwtalker.MyCodeWarrior(start=1)
	cw.send_timeout = AppleEvents.kNoTimeOut
	prjfss = Carbon.File.FSSpec(projectfile)
	cw.open(prjfss)
	cw.Make_Project()	# XXX Should set target
	cw.Close_Project()
	
def cleanproject(projectfile):
	cw = cwtalker.MyCodeWarrior(start=1)
	cw.send_timeout = AppleEvents.kNoTimeOut
	prjfss = Carbon.File.FSSpec(projectfile)
	cw.open(prjfss)
	cw.Remove_Binaries()
		
