git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@77064 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			259 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			AppleScript
		
	
	
	
	
	
			
		
		
	
	
			259 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			AppleScript
		
	
	
	
	
	
| -- script for regenerating Xcode projects from templates and bakefile file lists
 | |
| -- needs an Xcode version 3 application, no later versions have the AppleScript commands needed
 | |
| -- implemented properly
 | |
| -- in order to avoid your Xcode version 3 getting updated with later versions
 | |
| -- put it into a folder which you hide from spotlight
 | |
| 
 | |
| global oldDelimiters
 | |
| global variables
 | |
| global variablesRef
 | |
| global bakefilesXML
 | |
| global bakefilesXMLRef
 | |
| global projectFile
 | |
| 
 | |
| global osxBuildFolder
 | |
| 
 | |
| property test : false
 | |
| 
 | |
| -- retrieves the files from the xml node including optional conditions
 | |
| on parseSources(theName, theElement, theVariables, theConditions)
 | |
| 	set AppleScript's text item delimiters to " "
 | |
| 	set allElements to {}
 | |
| 	repeat with currElement in XML contents of theElement
 | |
| 		if class of currElement is text then
 | |
| 			set allElements to allElements & (every text item of currElement)
 | |
| 		else
 | |
| 			if class of currElement is XML element and XML tag of currElement is "if" then
 | |
| 				if (cond of XML attributes of currElement is in theConditions) then
 | |
| 					set allElements to allElements & (every text item of (item 1 of XML contents of currElement))
 | |
| 				end if
 | |
| 			end if
 | |
| 		end if
 | |
| 	end repeat
 | |
| 	set AppleScript's text item delimiters to oldDelimiters
 | |
| 	copy {varname:theName, entries:allElements} to end of theVariables
 | |
| end parseSources
 | |
| 
 | |
| on parseEntry(theElement, theVariables, theConditions)
 | |
| 	set theName to var of XML attributes of theElement
 | |
| 	parseSources(theName, theElement, theVariables, theConditions)
 | |
| end parseEntry
 | |
| 
 | |
| on parseLib(theElement, theVariables, theConditions)
 | |
| 	set theName to |id| of XML attributes of theElement
 | |
| 	repeat with currElement in XML contents of theElement
 | |
| 		if class of currElement is XML element and XML tag of currElement is "sources" then
 | |
| 			parseSources(theName, currElement, theVariables, theConditions)
 | |
| 		end if
 | |
| 	end repeat
 | |
| end parseLib
 | |
| 
 | |
| on parseNode(anElement, theVariables, theConditions)
 | |
| 	if class of anElement is XML element and ¬
 | |
| 		XML tag of anElement is "set" then
 | |
| 		parseEntry(anElement, theVariables, theConditions)
 | |
| 	else
 | |
| 		if class of anElement is XML element and ¬
 | |
| 			XML tag of anElement is "lib" then
 | |
| 			parseLib(anElement, theVariables, theConditions)
 | |
| 		end if
 | |
| 	end if
 | |
| end parseNode
 | |
| 
 | |
| -- iterates through the entire xml tree and populates the variables
 | |
| on parseFiles(theXML, theVariables, theConditions)
 | |
| 	if class of theXML is XML element or class of theXML is XML document then
 | |
| 		repeat with anElement in XML contents of theXML
 | |
| 			try
 | |
| 				parseNode(anElement, theVariables, theConditions)
 | |
| 			on error number -1728
 | |
| 				-- ignore this error
 | |
| 			end try
 | |
| 		end repeat
 | |
| 	else if class of theXML is list then
 | |
| 		repeat with anElement in theXML
 | |
| 			try
 | |
| 				parseNode(anElement, theVariables, theConditions)
 | |
| 			on error number -1728
 | |
| 				-- ignore this error
 | |
| 			end try
 | |
| 		end repeat
 | |
| 	end if
 | |
| end parseFiles
 | |
| 
 | |
| -- gets the entries of the variable named theName
 | |
| on getVar(theName)
 | |
| 	repeat with anElement in variablesRef
 | |
| 		if (varname of anElement is theName) then
 | |
| 			return entries of anElement
 | |
| 		end if
 | |
| 	end repeat
 | |
| end getVar
 | |
| 
 | |
| -- adds sources from fileList to a group named container
 | |
| on addNode(theContainer, fileList, theTargets)
 | |
| 	tell application "Xcode3"
 | |
| 		tell project 1
 | |
| 			--			set theTargets to targets
 | |
| 			repeat with listItem in fileList
 | |
| 				if (listItem starts with "$(") then
 | |
| 					set AppleScript's text item delimiters to ""
 | |
| 					set variableName to (characters 3 through ((length of listItem) - 1) of listItem) as text
 | |
| 					set AppleScript's text item delimiters to oldDelimiters
 | |
| 					my addNode(theContainer, my getVar(variableName), theTargets)
 | |
| 				else
 | |
| 					set AppleScript's text item delimiters to "/"
 | |
| 					set currPath to every text item in listItem
 | |
| 					set currFile to "../../" & listItem
 | |
| 					set currFileName to (item -1 in currPath)
 | |
| 					--					set currGroup to (items 1 through -2 in currPath as text)
 | |
| 					set AppleScript's text item delimiters to oldDelimiters
 | |
| 					try
 | |
| 						set theGroup to group theContainer
 | |
| 					on error
 | |
| 						tell root group
 | |
| 							make new group with properties {name:theContainer}
 | |
| 						end tell
 | |
| 					end try
 | |
| 					tell group theContainer
 | |
| 						set newFile to make new file reference with properties {name:currFileName, path:currFile, path type:project relative}
 | |
| 						repeat with theTarget in theTargets
 | |
| 							-- silently ignore targets that don't exist in this project
 | |
| 							try
 | |
| 								add newFile to (get compile sources phase of target theTarget of project 1)
 | |
| 							end try
 | |
| 						end repeat
 | |
| 					end tell
 | |
| 				end if
 | |
| 			end repeat
 | |
| 		end tell
 | |
| 	end tell
 | |
| end addNode
 | |
| 
 | |
| -- retrieves contents of file at posixFilePath
 | |
| on readFile(posixFilePath)
 | |
| 	set fileRef to open for access POSIX file posixFilePath
 | |
| 	set theData to read fileRef
 | |
| 	close access fileRef
 | |
| 	return theData
 | |
| end readFile
 | |
| 
 | |
| on init()
 | |
| 	tell application "Xcode3"
 | |
| 		quit
 | |
| 	end tell
 | |
| 	set variablesRef to a reference to variables
 | |
| 	set bakefilesXMLRef to a reference to bakefilesXML
 | |
| 	set oldDelimiters to AppleScript's text item delimiters
 | |
| 	tell application "Finder"
 | |
| 		set osxBuildFolder to POSIX path of ((folder of (path to me)) as Unicode text)
 | |
| 	end tell
 | |
| end init
 | |
| 
 | |
| -- reads the files list and evaluates the conditions
 | |
| on readFilesList(theFiles, theConditions)
 | |
| 	set variables to {}
 | |
| 	repeat with theFile in theFiles
 | |
| 		set bakefilesXML to parse XML (readFile(osxBuildFolder & theFile))
 | |
| 		parseFiles(bakefilesXMLRef, variablesRef, theConditions)
 | |
| 	end repeat
 | |
| end readFilesList
 | |
| 
 | |
| -- creates a new project file from the respective template
 | |
| on instantiateProject(theProject)
 | |
| 	set projectName to projectName of theProject
 | |
| 	set template to (osxBuildFolder & projectName & "_in.xcodeproj")
 | |
| 	set projectFile to (osxBuildFolder & projectName & ".xcodeproj")
 | |
| 	tell application "Finder"
 | |
| 		if exists projectFile as POSIX file then
 | |
| 			set templateContentFile to (osxBuildFolder & projectName & "_in.xcodeproj/project.pbxproj")
 | |
| 			set projectContentFile to (osxBuildFolder & projectName & ".xcodeproj/project.pbxproj")
 | |
| 			try
 | |
| 				tell me
 | |
| 					do shell script "rm -f " & quoted form of projectContentFile
 | |
| 				end tell
 | |
| 			end try
 | |
| 			try
 | |
| 				tell me
 | |
| 					do shell script "cp " & quoted form of templateContentFile & " " & quoted form of projectContentFile
 | |
| 				end tell
 | |
| 			end try
 | |
| 		else
 | |
| 			set duplicateProject to duplicate (template as POSIX file) with replace
 | |
| 			set name of duplicateProject to (projectName & ".xcodeproj")
 | |
| 		end if
 | |
| 	end tell
 | |
| end instantiateProject
 | |
| 
 | |
| -- adds the source files of the nodes of theProject to the xcode project
 | |
| on populateProject(theProject)
 | |
| 	tell application "Xcode3"
 | |
| 		open projectFile
 | |
| 	end tell
 | |
| 	repeat with theNode in nodes of theProject
 | |
| 		-- reopen xcode for each pass, as otherwise the undomanager
 | |
| 		-- happens to crash quite frequently
 | |
| 		addNode(label of theNode, entries of theNode, targets of theNode)
 | |
| 	end repeat
 | |
| 	tell application "Xcode3"
 | |
| 		quit
 | |
| 	end tell
 | |
| 	do shell script (osxBuildFolder as text) & "fix_xcode_ids.py \"" & (POSIX path of projectFile as Unicode text) & "\""
 | |
| 	-- reopen again to let Xcode sort identifiers
 | |
| 	tell application "Xcode3"
 | |
| 		open projectFile
 | |
| 	end tell
 | |
| 	tell application "Xcode3"
 | |
| 		quit
 | |
| 	end tell
 | |
| end populateProject
 | |
| 
 | |
| on makeProject(theProject)
 | |
| 	instantiateProject(theProject)
 | |
| 	readFilesList(bklfiles of theProject, conditions of theProject)
 | |
| 	populateProject(theProject)
 | |
| end makeProject
 | |
| 
 | |
| -- main
 | |
| 
 | |
| init()
 | |
| set theProject to {projectName:"", conditions:{}, bklfiles:{¬
 | |
| 	"../bakefiles/files.bkl", "../bakefiles/zlib.bkl", "../bakefiles/regex.bkl", "../bakefiles/tiff.bkl", "../bakefiles/png.bkl", "../bakefiles/jpeg.bkl", "../bakefiles/scintilla.bkl", "../bakefiles/expat.bkl"}, nodes:{¬
 | |
| 	{label:"base", entries:{"$(BASE_SRC)"}, targets:{"dynamic", "static", "base"}}, ¬
 | |
| 	{label:"base", entries:{"$(BASE_AND_GUI_SRC)"}, targets:{"dynamic", "static", "base", "core"}}, ¬
 | |
| 	{label:"core", entries:{"$(CORE_SRC)"}, targets:{"dynamic", "static", "core"}}, ¬
 | |
| 	{label:"net", entries:{"$(NET_SRC)"}, targets:{"dynamic", "static", "net"}}, ¬
 | |
| 	{label:"adv", entries:{"$(ADVANCED_SRC)"}, targets:{"dynamic", "static", "adv"}}, ¬
 | |
| 	{label:"webview", entries:{"$(WEBVIEW_SRC)"}, targets:{"dynamic", "static", "webview"}}, ¬
 | |
| 	{label:"media", entries:{"$(MEDIA_SRC)"}, targets:{"dynamic", "static", "media"}}, ¬
 | |
| 	{label:"html", entries:{"$(HTML_SRC)"}, targets:{"dynamic", "static", "html"}}, ¬
 | |
| 	{label:"xrc", entries:{"$(XRC_SRC)"}, targets:{"dynamic", "static", "xrc"}}, ¬
 | |
| 	{label:"qa", entries:{"$(QA_SRC)"}, targets:{"dynamic", "static", "qa"}}, ¬
 | |
| 	{label:"xml", entries:{"$(XML_SRC)"}, targets:{"dynamic", "static", "xml"}}, ¬
 | |
| 	{label:"opengl", entries:{"$(OPENGL_SRC)"}, targets:{"dynamic", "static", "gl"}}, ¬
 | |
| 	{label:"aui", entries:{"$(AUI_SRC)"}, targets:{"dynamic", "static", "aui"}}, ¬
 | |
| 	{label:"ribbon", entries:{"$(RIBBON_SRC)"}, targets:{"dynamic", "static", "ribbon"}}, ¬
 | |
| 	{label:"propgrid", entries:{"$(PROPGRID_SRC)"}, targets:{"dynamic", "static", "propgrid"}}, ¬
 | |
| 	{label:"richtext", entries:{"$(RICHTEXT_SRC)"}, targets:{"dynamic", "static", "richttext"}}, ¬
 | |
| 	{label:"stc", entries:{"$(STC_SRC)"}, targets:{"dynamic", "static", "stc"}}, ¬
 | |
| 	{label:"libzlib", entries:{"$(wxzlib)"}, targets:{"dynamic", "static", "wxzlib"}}, ¬
 | |
| 	{label:"libtiff", entries:{"$(wxtiff)"}, targets:{"dynamic", "static", "wxtiff"}}, ¬
 | |
| 	{label:"libjpeg", entries:{"$(wxjpeg)"}, targets:{"dynamic", "static", "wxjpeg"}}, ¬
 | |
| 	{label:"libpng", entries:{"$(wxpng)"}, targets:{"dynamic", "static", "wxpng"}}, ¬
 | |
| 	{label:"libregex", entries:{"$(wxregex)"}, targets:{"dynamic", "static", "wxregex"}}, ¬
 | |
| 	{label:"libscintilla", entries:{"$(wxscintilla)"}, targets:{"dynamic", "static", "wxscintilla"}}, ¬
 | |
| 	{label:"libexpat", entries:{"$(wxexpat)"}, targets:{"dynamic", "static", "wxexpat"}} ¬
 | |
| 		}}
 | |
| set conditions of theProject to {"PLATFORM_MACOSX=='1'", "TOOLKIT=='OSX_CARBON'", "WXUNIV=='0'", "USE_GUI=='1' and WXUNIV=='0'"}
 | |
| set projectName of theProject to "wxcarbon"
 | |
| makeProject(theProject)
 | |
| 
 | |
| set conditions of theProject to {"PLATFORM_MACOSX=='1'", "TOOLKIT=='OSX_COCOA'", "WXUNIV=='0'", "USE_GUI=='1' and WXUNIV=='0'"}
 | |
| set projectName of theProject to "wxcocoa"
 | |
| 
 | |
| makeProject(theProject)
 | |
| 
 | |
| set conditions of theProject to {"PLATFORM_MACOSX=='1'", "TOOLKIT=='OSX_IPHONE'", "WXUNIV=='0'", "USE_GUI=='1' and WXUNIV=='0'"}
 | |
| set projectName of theProject to "wxiphone"
 | |
| makeProject(theProject)
 |