git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63079 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			1 line
		
	
	
		
			8.8 KiB
		
	
	
	
		
			AppleScript
		
	
	
	
	
	
			
		
		
	
	
			1 line
		
	
	
		
			8.8 KiB
		
	
	
	
		
			AppleScript
		
	
	
	
	
	
| 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)
 | |
| 	tell application "Xcode"
 | |
| 		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))
 | |
| 				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
 | |
| 						try
 | |
| 							set theGroup to group named currGroup
 | |
| 						on error
 | |
| 							make new group with properties {name:currGroup}
 | |
| 						end try
 | |
| 						tell group currGroup
 | |
| 							set newFile to make new file reference with properties {name:currFileName, path:currFile, path type:project relative}
 | |
| 							repeat with theTarget in theTargets
 | |
| 								add newFile to (get compile sources phase of theTarget)
 | |
| 							end repeat
 | |
| 						end tell
 | |
| 					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 "Xcode"
 | |
| 		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 POSIX file (osxBuildFolder & projectName & "_in.xcodeproj")
 | |
| 	set projectFile to POSIX file (osxBuildFolder & projectName & ".xcodeproj")
 | |
| 	tell application "Finder"
 | |
| 		try
 | |
| 			delete file projectFile
 | |
| 		end try
 | |
| 		set duplicateProject to duplicate template with replace
 | |
| 		set name of duplicateProject to (projectName & ".xcodeproj")
 | |
| 	end tell
 | |
| end instantiateProject
 | |
| 
 | |
| -- adds the source files of the nodes of theProject to the xcode project
 | |
| on populateProject(theProject)
 | |
| 	tell application "Xcode"
 | |
| 		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)
 | |
| 	end repeat
 | |
| 	tell application "Xcode"
 | |
| 		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 {conditions:{"PLATFORM_MACOSX=='1'", "TOOLKIT=='OSX_CARBON'", "WXUNIV=='0'", "USE_GUI=='1' and WXUNIV=='0'"}, projectName:¬
 | |
| 	"wxcarbon", bklfiles:{¬
 | |
| 	"../bakefiles/files.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)"}}, ¬
 | |
| 	{label:"base", entries:{"$(BASE_AND_GUI_SRC)"}}, ¬
 | |
| 	{label:"core", entries:{"$(CORE_SRC)"}}, ¬
 | |
| 	{label:"net", entries:{"$(NET_SRC)"}}, ¬
 | |
| 	{label:"adv", entries:{"$(ADVANCED_SRC)"}}, ¬
 | |
| 	{label:"media", entries:{"$(MEDIA_SRC)"}}, ¬
 | |
| 	{label:"html", entries:{"$(HTML_SRC)"}}, ¬
 | |
| 	{label:"xrc", entries:{"$(XRC_SRC)"}}, ¬
 | |
| 	{label:"xml", entries:{"$(XML_SRC)"}}, ¬
 | |
| 	{label:"opengl", entries:{"$(OPENGL_SRC)"}}, ¬
 | |
| 	{label:"aui", entries:{"$(AUI_SRC)"}}, ¬
 | |
| 	{label:"ribbon", entries:{"$(RIBBON_SRC)"}}, ¬
 | |
| 	{label:"propgrid", entries:{"$(PROPGRID_SRC)"}}, ¬
 | |
| 	{label:"richtext", entries:{"$(RICHTEXT_SRC)"}}, ¬
 | |
| 	{label:"stc", entries:{"$(STC_SRC)"}}, ¬
 | |
| 	{label:"libtiff", entries:{"$(wxtiff)"}}, ¬
 | |
| 	{label:"libjpeg", entries:{"$(wxjpeg)"}}, ¬
 | |
| 	{label:"libpng", entries:{"$(wxpng)"}}, ¬
 | |
| 	{label:"libregex", entries:{"$(wxregex)"}}, ¬
 | |
| 	{label:"libscintilla", entries:{"$(wxscintilla)"}}, ¬
 | |
| 	{label:"libexpat", entries:{"$(wxexpat)"}} ¬
 | |
| 		}}
 | |
| makeProject(theProject)
 | |
| 
 | |
| set theProject to {conditions:{"PLATFORM_MACOSX=='1'", "TOOLKIT=='OSX_COCOA'", "WXUNIV=='0'", "USE_GUI=='1' and WXUNIV=='0'"}, projectName:¬
 | |
| 	"wxcocoa", bklfiles:{¬
 | |
| 	"../bakefiles/files.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)"}}, ¬
 | |
| 	{label:"base", entries:{"$(BASE_AND_GUI_SRC)"}}, ¬
 | |
| 	{label:"core", entries:{"$(CORE_SRC)"}}, ¬
 | |
| 	{label:"net", entries:{"$(NET_SRC)"}}, ¬
 | |
| 	{label:"adv", entries:{"$(ADVANCED_SRC)"}}, ¬
 | |
| 	{label:"media", entries:{"$(MEDIA_SRC)"}}, ¬
 | |
| 	{label:"html", entries:{"$(HTML_SRC)"}}, ¬
 | |
| 	{label:"xrc", entries:{"$(XRC_SRC)"}}, ¬
 | |
| 	{label:"xml", entries:{"$(XML_SRC)"}}, ¬
 | |
| 	{label:"opengl", entries:{"$(OPENGL_SRC)"}}, ¬
 | |
| 	{label:"aui", entries:{"$(AUI_SRC)"}}, ¬
 | |
| 	{label:"ribbon", entries:{"$(RIBBON_SRC)"}}, ¬
 | |
| 	{label:"propgrid", entries:{"$(PROPGRID_SRC)"}}, ¬
 | |
| 	{label:"richtext", entries:{"$(RICHTEXT_SRC)"}}, ¬
 | |
| 	{label:"stc", entries:{"$(STC_SRC)"}}, ¬
 | |
| 	{label:"libtiff", entries:{"$(wxtiff)"}}, ¬
 | |
| 	{label:"libjpeg", entries:{"$(wxjpeg)"}}, ¬
 | |
| 	{label:"libpng", entries:{"$(wxpng)"}}, ¬
 | |
| 	{label:"libregex", entries:{"$(wxregex)"}}, ¬
 | |
| 	{label:"libscintilla", entries:{"$(wxscintilla)"}}, ¬
 | |
| 	{label:"libexpat", entries:{"$(wxexpat)"}} ¬
 | |
| 		}}
 | |
| makeProject(theProject)
 | |
| 
 | |
| 
 |