#
# fullbuild creates everything that needs to be created before a
# distribution can be made, and puts it all in the right place.
#
# It expects the projects to be in the places where Jack likes them:
# in directories named like 'build.mac'. That is fixable,
# however.
#
# NOTE: You should proably make a copy of python with which to execute this
# script, rebuilding running programs does not work...

CARBON_ONLY = 1

MACBUILDNO=":Mac:Include:macbuildno.h"

import os
import sys
import macfs
import MacOS
import EasyDialogs
import re
import string
import genpluginprojects
import macresource

import aetools
from Carbon import AppleEvents

import CodeWarrior

from Carbon import Res
from Carbon import Dlg

import buildtools
import cfmfile

# Dialog resource. Note that the item numbers should correspond
# to those in the DITL resource. Also note that the order is important:
# things are built in this order, so there should be no forward dependencies.
DIALOG_ID = 512

I_OK=1
I_CANCEL=2
# label 3
I_PPC_EXTLIBS=4
I_GEN_PROJECTS=5
I_GEN_PROJECTS_FORCE=6
I_GEN_IMGPROJECTS=7
I_GEN_IMGPROJECTS_FORCE=8
I_INC_BUILDNO=9
# label 10
I_PPC_CORE=11
I_PPC_PLUGINS=12
I_PPC_EXTENSIONS=13
# label 14
I_CARBON_CORE=15
I_CARBON_PLUGINS=16
I_CARBON_EXTENSIONS=17
I_INTERPRETER=18
# label 19
I_PPC_FULL=20
I_PPC_SMALL=21
# label 22
I_CARBON_FULL=23
I_CARBON_SMALL=24
# label 25
I_APPLETS=26

N_BUTTONS=27

if CARBON_ONLY:
	BUTTONS_DISABLE = [
		I_PPC_EXTLIBS,
		I_PPC_CORE,
		I_PPC_PLUGINS,
		I_PPC_EXTENSIONS,
		I_INTERPRETER,
		I_PPC_FULL,
		I_PPC_SMALL,
	]
else:
	BUTTONS_DISABLE = []
	
RUNNING=[]

def buildmwproject(top, creator, projects):
	"""Build projects with an MW compiler"""
	mgr = CodeWarrior.CodeWarrior(creator, start=1)
	mgr.send_timeout = AppleEvents.kNoTimeOut
	
	failed = []
	for file in projects:
		if type(file) == type(()):
			file, target = file
		else:
			target = ''
		file = os.path.join(top, file)
		try:
			fss = macfs.FSSpec(file)
		except MacOS.Error:
			print '** file not found:', file
			continue
		print 'Building', file, target
		try:
			mgr.open(fss)
		except aetools.Error, detail:
			print '**', detail, file
			continue
		if target:
			try:
				mgr.Set_Current_Target(target)
			except aetools.Error, arg:
				print '**', file, target, 'Cannot select:', arg
		try:
			mgr.Make_Project()
		except aetools.Error, arg:
			print '**', file, target, 'Failed:', arg
			failed.append(fss)
		mgr.Close_Project()
	if failed:
		print 'Open failed projects and exit?',
		rv = sys.stdin.readline()
		if rv[0] in ('y', 'Y'):
			for fss in failed:
				mgr.open(fss)
			sys.exit(0)
##	mgr.quit()
	
def buildapplet(top, dummy, list):
	"""Create python applets"""
	for src, dst, tmpl in list:
		template = buildtools.findtemplate(tmpl)
		if src[-3:] != '.py':
			raise 'Should end in .py', src
		base = os.path.basename(src)
		src = os.path.join(top, src)
		dst = os.path.join(top, dst)
		try:
			os.unlink(dst)
		except os.error:
			pass
		print 'Building applet', dst
		try:
			buildtools.process(template, src, dst, 1)
		except buildtools.BuildError, arg:
			print '**', dst, arg
		
def buildprojectfile(top, arg, list):
	"""Create CodeWarrior project files with a script"""
	for folder, module, routine in list:
		print "Generating project files with", module
		sys.path.insert(0, os.path.join(top, folder))
		m = __import__(module)
		r = getattr(m, routine)
		r(arg)
		del sys.path[0]
		
def buildfat(top, dummy, list):
	"""Build fat binaries"""
	for dst, src1, src2 in list:
		dst = os.path.join(top, dst)
		src1 = os.path.join(top, src1)
		src2 = os.path.join(top, src2)
		print 'Building fat binary', dst
		cfmfile.mergecfmfiles((src1, src2), dst)
		
def buildcopy(top, dummy, list):
	import macostools
	for src, dst in list:
		src = os.path.join(top, src)
		dst = os.path.join(top, dst)
		macostools.copy(src, dst, forcetype="APPL")
		
def buildsetup(top, dummy, list):
	print 'Building extensions with setup.py ', ' '.join(list)
	argv = ['setup.py'] + list[:]
	save_argv = sys.argv
	sys.argv = argv
	sys.path.insert(0, top)
	m = __import__('setup')
	r = getattr(m, 'main')
	r()
	del sys.path[0]
	sys.argv = save_argv

def buildcarbonplugins(top, dummy1, dummy2):
## XXXX Need to convert pathnames, I guess, and adapt distutils Mac-specific
## code to not call GetArgv if not needed.
##	buildsetup(top, None, [
##		'--dry_run',
##        	'install',
##                '--prefix=%s' % sys.prefix,
##                '--install-scripts=%s' % os.path.join(sys.prefix, 'Scripts'),
##                '--install-platlib=%s' % os.path.join(sys.prefix, 'Lib', 'lib-dynload')
##		])
	buildmwproject(top, "CWIE", [
		(":Mac:Build:_weakref.carbon.mcp", "_weakref.carbon"),
		(":Mac:Build:_symtable.carbon.mcp", "_symtable.carbon"),
		(":Mac:Build:_testcapi.carbon.mcp", "_testcapi.carbon"),
		(":Mac:Build:_hotshot.carbon.mcp", "_hotshot.carbon"),
		(":Mac:Build:xx.carbon.mcp", "xx.carbon"),
		(":Mac:Build:xxsubtype.carbon.mcp", "xxsubtype.carbon"),
		(":Mac:Build:pyexpat.carbon.mcp", "pyexpat.carbon"),
		(":Mac:Build:calldll.carbon.mcp", "calldll.carbon"),
		(":Mac:Build:datetime.carbon.mcp", "datetime.carbon"),
		(":Mac:Build:gdbm.carbon.mcp", "gdbm.carbon"),
		(":Mac:Build:icglue.carbon.mcp", "icglue.carbon"),
		(":Mac:Build:waste.carbon.mcp", "waste.carbon"),
		(":Mac:Build:zlib.carbon.mcp", "zlib.carbon"),
		(":Mac:Build:hfsplus.carbon.mcp", "hfsplus.carbon"),
		(":Mac:Build:ColorPicker.carbon.mcp", "ColorPicker.carbon"),
		(":Mac:Build:_AE.carbon.mcp", "_AE.carbon"),
		(":Mac:Build:_AH.carbon.mcp", "_AH.carbon"),
		(":Mac:Build:_App.carbon.mcp", "_App.carbon"),
		(":Mac:Build:_CF.carbon.mcp", "_CF.carbon"),
		(":Mac:Build:_CG.carbon.mcp", "_CG.carbon"),
		(":Mac:Build:_CarbonEvt.carbon.mcp", "_CarbonEvt.carbon"),
		(":Mac:Build:_Cm.carbon.mcp", "_Cm.carbon"),
		(":Mac:Build:_Ctl.carbon.mcp", "_Ctl.carbon"),
		(":Mac:Build:_Dlg.carbon.mcp", "_Dlg.carbon"),
		(":Mac:Build:_Drag.carbon.mcp", "_Drag.carbon"),
		(":Mac:Build:_Evt.carbon.mcp", "_Evt.carbon"),
		(":Mac:Build:_File.carbon.mcp", "_File.carbon"),
		(":Mac:Build:_Fm.carbon.mcp", "_Fm.carbon"),
		(":Mac:Build:_Folder.carbon.mcp", "_Folder.carbon"),
		(":Mac:Build:_Help.carbon.mcp", "_Help.carbon"),
		(":Mac:Build:_IBCarbon.carbon.mcp", "_IBCarbon.carbon"),
		(":Mac:Build:_Icn.carbon.mcp", "_Icn.carbon"),
		(":Mac:Build:_List.carbon.mcp", "_List.carbon"),
		(":Mac:Build:_Menu.carbon.mcp", "_Menu.carbon"),
		(":Mac:Build:_Mlte.carbon.mcp", "_Mlte.carbon"),
		(":Mac:Build:_Qd.carbon.mcp", "_Qd.carbon"),
		(":Mac:Build:_Qdoffs.carbon.mcp", "_Qdoffs.carbon"),
		(":Mac:Build:_Qt.carbon.mcp", "_Qt.carbon"),
		(":Mac:Build:_Res.carbon.mcp", "_Res.carbon"),
		(":Mac:Build:_Scrap.carbon.mcp", "_Scrap.carbon"),
		(":Mac:Build:_Snd.carbon.mcp", "_Snd.carbon"),
		(":Mac:Build:_Sndihooks.carbon.mcp", "_Sndihooks.carbon"),
		(":Mac:Build:_TE.carbon.mcp", "_TE.carbon"),
		(":Mac:Build:_Win.carbon.mcp", "_Win.carbon"),
	])
	
def handle_dialog(filename):
	"""Handle selection dialog, return list of selected items"""
	d = Dlg.GetNewDialog(DIALOG_ID, -1)
	d.SetDialogDefaultItem(I_OK)
	d.SetDialogCancelItem(I_CANCEL)
	results = [0]*N_BUTTONS
	for n in BUTTONS_DISABLE:
		ctl = d.GetDialogItemAsControl(n)
		ctl.HideControl()
	while 1:
		n = Dlg.ModalDialog(None)
		if n == I_OK:
			break
		if n == I_CANCEL:
			return []
		if n == I_INC_BUILDNO:
			incbuildno(filename)
			continue
		if n < len(results):
			results[n] = (not results[n])
			ctl = d.GetDialogItemAsControl(n)
			ctl.SetControlValue(results[n])
	rv = []
	for i in range(len(results)):
		if results[i]:
			rv.append(i)
	return rv

#
# The build instructions. Entries are (routine, arg, list-of-files)
# XXXX We could also include the builds for stdwin and such here...
BUILD_DICT = {
I_GEN_PROJECTS : (buildprojectfile, 0, [
	(":Mac:scripts", "genpluginprojects", "genallprojects")
	]),
	
I_GEN_PROJECTS_FORCE : (buildprojectfile, 1, [
	(":Mac:scripts", "genpluginprojects", "genallprojects")
	]),
	
I_GEN_IMGPROJECTS : (buildprojectfile, 0, [
	(":Extensions:img:Mac", "genimgprojects", "genallprojects")
	]),
	
I_GEN_IMGPROJECTS_FORCE : (buildprojectfile, 1, [
	(":Extensions:img:Mac", "genimgprojects", "genallprojects")
	]),
	
I_INTERPRETER : (buildcopy, None, [
		("PythonInterpreterCarbon", "PythonInterpreter"),
	]),

I_PPC_CORE : (buildmwproject, "CWIE", [
		(":Mac:Build:PythonCore.mcp", "PythonCore"),
		(":Mac:Build:PythonInterpreter.mcp", "PythonInterpreterClassic"),
	]),

I_CARBON_CORE : (buildmwproject, "CWIE", [
		(":Mac:Build:PythonCore.mcp", "PythonCoreCarbon"),
		(":Mac:Build:PythonInterpreter.mcp", "PythonInterpreterCarbon"),
	]),

I_PPC_EXTLIBS : (buildmwproject, "CWIE", [
##	(":Mac:Build:buildlibs.mcp", "buildlibs ppc plus tcl/tk"),
	(":Mac:Build:buildlibs.mcp", "buildlibs ppc"),
	]),
	
I_PPC_PLUGINS : (buildmwproject, "CWIE", [
	(":Mac:Build:_weakref.mcp", "_weakref.ppc"),
	(":Mac:Build:_symtable.mcp", "_symtable.ppc"),
	(":Mac:Build:_testcapi.mcp", "_testcapi.ppc"),
	(":Mac:Build:_hotshot.mcp", "_hotshot.ppc"),
	(":Mac:Build:xx.mcp", "xx.ppc"),
	(":Mac:Build:xxsubtype.mcp", "xxsubtype.ppc"),
	(":Mac:Build:pyexpat.mcp", "pyexpat.ppc"),
	(":Mac:Build:calldll.mcp", "calldll.ppc"),
	(":Mac:Build:ctb.mcp", "ctb.ppc"),
	(":Mac:Build:gdbm.mcp", "gdbm.ppc"),
	(":Mac:Build:icglue.mcp", "icglue.ppc"),
	(":Mac:Build:macspeech.mcp", "macspeech.ppc"),
	(":Mac:Build:waste.mcp", "waste.ppc"),
	(":Mac:Build:zlib.mcp", "zlib.ppc"),
##	(":Mac:Build:_tkinter.mcp", "_tkinter.ppc"),
	(":Extensions:Imaging:_tkinter.mcp", "_tkinter.ppc"),
	(":Mac:Build:ColorPicker.mcp", "ColorPicker.ppc"),
	(":Mac:Build:Printing.mcp", "Printing.ppc"),
	(":Mac:Build:_AE.mcp", "_AE.ppc"),
	(":Mac:Build:_App.mcp", "_App.ppc"),
	(":Mac:Build:_Cm.mcp", "_Cm.ppc"),
	(":Mac:Build:_Ctl.mcp", "_Ctl.ppc"),
	(":Mac:Build:_Dlg.mcp", "_Dlg.ppc"),
	(":Mac:Build:_Drag.mcp", "_Drag.ppc"),
	(":Mac:Build:_Evt.mcp", "_Evt.ppc"),
	(":Mac:Build:_Fm.mcp", "_Fm.ppc"),
	(":Mac:Build:_Help.mcp", "_Help.ppc"),
	(":Mac:Build:_Icn.mcp", "_Icn.ppc"),
	(":Mac:Build:_List.mcp", "_List.ppc"),
	(":Mac:Build:_Menu.mcp", "_Menu.ppc"),
	(":Mac:Build:_Mlte.mcp", "_Mlte.ppc"),
	(":Mac:Build:_Qd.mcp", "_Qd.ppc"),
	(":Mac:Build:_Qdoffs.mcp", "_Qdoffs.ppc"),
	(":Mac:Build:_Qt.mcp", "_Qt.ppc"),
	(":Mac:Build:_Res.mcp", "_Res.ppc"),
	(":Mac:Build:_Scrap.mcp", "_Scrap.ppc"),
	(":Mac:Build:_Snd.mcp", "_Snd.ppc"),
	(":Mac:Build:_Sndihooks.mcp", "_Sndihooks.ppc"),
	(":Mac:Build:_TE.mcp", "_TE.ppc"),
	(":Mac:Build:_Win.mcp", "_Win.ppc"),
	]),

I_CARBON_PLUGINS :  (buildcarbonplugins, None, []),

I_PPC_FULL : (buildmwproject, "CWIE", [
		(":Mac:Build:PythonStandalone.mcp", "PythonStandalone"),
	]),

I_PPC_SMALL : (buildmwproject, "CWIE", [
		(":Mac:Build:PythonStandSmall.mcp", "PythonStandSmall"),
	]),

I_CARBON_FULL : (buildmwproject, "CWIE", [
		(":Mac:Build:PythonStandalone.mcp", "PythonCarbonStandalone"),
	]),

I_CARBON_SMALL : (buildmwproject, "CWIE", [
		(":Mac:Build:PythonStandSmall.mcp", "PythonStandSmallCarbon"),
	]),

I_PPC_EXTENSIONS : (buildmwproject, "CWIE", [
		(":Extensions:Imaging:_imaging.mcp", "_imaging.ppc"),
##		(":Extensions:Imaging:_tkinter.mcp", "_tkinter.ppc"),
		(":Extensions:img:Mac:imgmodules.mcp", "imgmodules.ppc"),
	]),

I_CARBON_EXTENSIONS : (buildmwproject, "CWIE", [
		(":Extensions:Imaging:_imaging.mcp", "_imaging.carbon"),
##		(":Extensions:Imaging:_tkinter.mcp", "_tkinter.carbon"),
		(":Extensions:img:Mac:imgmodules.mcp", "imgmodules.carbon"),
	]),
	
I_APPLETS : (buildapplet, None, [
		(":Mac:scripts:EditPythonPrefs.py", "EditPythonPrefs", None),
		(":Mac:scripts:BuildApplet.py", "BuildApplet", None),
		(":Mac:scripts:BuildApplication.py", "BuildApplication", None),
		(":Mac:scripts:ConfigurePython.py", "ConfigurePython", None),
##		(":Mac:scripts:ConfigurePython.py", "ConfigurePythonCarbon", "PythonInterpreterCarbon"),
##		(":Mac:scripts:ConfigurePython.py", "ConfigurePythonClassic", "PythonInterpreterClassic"),
		(":Mac:Tools:IDE:PythonIDE.py", "Python IDE", None),
		(":Mac:Tools:CGI:PythonCGISlave.py", ":Mac:Tools:CGI:PythonCGISlave", None),
		(":Mac:Tools:CGI:BuildCGIApplet.py", ":Mac:Tools:CGI:BuildCGIApplet", None),
	]),
}

def incbuildno(filename):
	fp = open(filename)
	line = fp.readline()
	fp.close()
	
	pat = re.compile('#define BUILD ([0-9]+)')
	m = pat.search(line)
	if not m or not m.group(1):
		raise 'Incorrect macbuildno.h line', line
	buildno = m.group(1)
	new = string.atoi(buildno) + 1
	fp = open(filename, 'w')
	fp.write('#define BUILD %d\n'%new)
	fp.close()
				
def main():
	macresource.need('DLOG', DIALOG_ID, 'fullbuild.rsrc')
	dir = EasyDialogs.AskFolder(message='Python source folder:')
	if not dir:
		sys.exit(0)
	# Set genpluginprojects to use this folder (slight hack)
	genpluginprojects.PYTHONDIR = dir
	
	todo = handle_dialog(os.path.join(dir, MACBUILDNO))
		
	instructions = []
	for i in todo:
		instructions.append(BUILD_DICT[i])
		
	for routine, arg, list in instructions:
		routine(dir, arg, list)
		
	if todo:
		print "All done!"
	
if __name__ == '__main__':
	main()
	
