summaryrefslogtreecommitdiff
path: root/make/makeStat.met
blob: 72c985ee967b3eb1cd6b5823321093f640d9b53f (plain)
1
(*
	Make our stationery project from scratch that will 
	be used to make all other libraries. This allows us to get all of these common 
	settings out of the makeall script.
*)

-- create library or application stationery?
property pCreateLibrary : false

property pProjectFileExtension : ".mcp"

property pTargetList : {"Carbon Debug", "Carbon Final", "Mach-O Debug", "Mach-O Final"}
global gAccessRoot
global gMWCWfolder

(* ======  Stand alone. When run by itself, make the appropriate stationery. ====== *)

set my pCreateLibrary to true
SetGlobals()
CreateFolders()
CreateStationeryProject(gStationeryName, gRsrcsDir, gMWCWfolder)
set my pCreateLibrary to false
SetGlobals()
CreateFolders()
CreateStationeryProject(gStationeryName, gRsrcsDir, gMWCWfolder)



on CreateStationeryProject(projName, projDir, cwDir)
	
	-- make sure the Metrowerks folder spec is global.
	if gMWCWfolder is not cwDir then
		set gMWCWfolder to cwDir
	end if
	
	set projFilename to projName & pProjectFileExtension
	set projPathname to projDir & projFilename
	
	tell application "CodeWarrior IDE"
		
		try
			close (the first project document whose name is projFilename)
		end try
		
		-- try
		
		-- display dialog "creating project: " & projPathname buttons {"OK"} default button 1
		
		Create Project {projPathname}
		
		-- end try
		
		repeat with t in pTargetList
			my SetupTarget(t, projName)
		end repeat
		
		-- finish up.
		if my IsOSX() and not pCreateLibrary then
			display dialog "To finish add the following files into " & projFilename & "'s Mach-O targets:" & return & �
				"  /System/Library/Frameworks/Carbon.framework" & return & �
				"  /System/Library/Frameworks/System.framework" & return & �
				"  /usr/lib/crt1.o" & return & return & �
				"Sorry, but Codewarrior's Applescript won't do these." buttons {"OK"} default button 1
		else
			Close Project
		end if
		
	end tell
	
	CleanupFolder(projDir, projName)
	
end CreateStationeryProject

-- Delete files and folders created during this process we do not  need.
-- particularly the project's Data directory and output files and directories.
on CleanupFolder(thePath, projName)
	repeat with f in list folder (thePath) without invisibles
		if ((f as string) begins with "xxxx_" or (f as string) is projName & " Data") then
			try
				tell application "Finder" to delete folder (thePath & f)
			end try
			try
				tell application "Finder" to delete file (thePath & f)
			end try
		end if
	end repeat
end CleanupFolder

on SetupTarget(targetName, projName)
	tell application "CodeWarrior IDE"
		
		-- display dialog "Setup target: " & targetName & return & "project: " & projName
		
		-- Figure out what our output file will be (tentatively) named.
		
		set targetFilename to "xxxx" -- The real target's output name will get set later.
		set targetAPI to ""
		set debugFlag to ""
		
		-- Linker & Output type.
		
		if targetName contains "Carbon" then
			set targetFilename to targetFilename & "_C"
			set targetAPI to "Carbon"
		else if targetName contains "Mach-O" and my IsOSX() then
			set targetFilename to targetFilename & "_M"
			set targetAPI to "Mach-O"
		else
			-- I do not know what kind of target you are talking about.
			-- or we are on a OS 9 machine and I don't know what Mach-O is.
			-- ignore this argument.
			return
		end if
		
		-- Debug or not.
		if targetName contains "Final" or targetName contains "Release" then
			set debugFlag to "Final"
			set targetFilename to targetFilename & "_O" -- for Optimized.
		else
			-- Assume Debug if nothing else.
			set debugFlag to "Debug"
			set targetFilename to targetFilename & "_D"
		end if
		
		if pCreateLibrary then
			set targetFilename to targetFilename & ".lib"
			set targetName to "Library " & targetName
		else
			set targetFilename to targetFilename & ".app"
			set targetName to "Application " & targetName
		end if
		
		-- Make the new target, and set the current target to be it.
		
		if (count targets of project document 1) is 1 and �
			(name of target 1 of project document 1) is projName then
			-- brand new project comes with one default target, same name as the project.
			-- rename that one.
			set (name of target 1 of project document 1) to targetName
			set the current target of project document 1 to the target 1 of project document 1
		else
			-- make all the subsequent targets.
			make new target at project document 1 with properties {name:targetName}
			set the current target of project document 1 to the result
		end if
		
		-- set all the preference panels
		-- display dialog " API: " & targetAPI & return & " filename: " & targetFilename & return & debugFlag
		my SetPreferences(targetAPI, targetFilename, debugFlag is "Debug")
		
	end tell
end SetupTarget

------ All Preference Panel settings in here.  ----- 

on SetPreferences(targetAPI, targetFilename, shouldDebug)
	set weAreMach to (targetAPI is "Mach-O")
	
	tell application "CodeWarrior IDE"
		
		if weAreMach then
			set linkerName to "MacOS X PPC Linker"
			set targetPanelName to "PPC Mac OS X Project"
			set codeGenPanelName to "PPC CodeGen Mach-O"
			set linkerPanelName to "PPC Mac OS X Linker"
		else
			set linkerName to "MacOS PPC Linker"
			set targetPanelName to "PPC Project"
			set codeGenPanelName to "PPC CodeGen"
			set linkerPanelName to "PPC Linker"
		end if
		
		(* ===== Section "Target" ===== *)
		
		Set Preferences of panel "Target Settings" to {Linker:linkerName}
		
		-- Panel "PPC or Mac OS X Target"
		if pCreateLibrary then
			Set Preferences of panel targetPanelName to {Project Type:library, File Name:targetFilename}
		else
			if weAreMach then
				Set Preferences of panel targetPanelName to �
					{Project Type:application package, File Name:targetFilename, File Creator:"NCBI", File Type:"APPL"}
			else
				Set Preferences of panel targetPanelName to �
					{Project Type:standard application, File Name:targetFilename, File Creator:"NCBI", File Type:"APPL", SIZE Flags:22720, Preferred Heap Size:8000, Min Heap Size:5000, Stack Size:64} �
						
				-- the following only needed on pre-OS X systems when we turn on the Output Flags post-linker, 
				-- but it is harmless in other cases.
				Set Preferences of panel "Output Flags" to {Has Bundle:true}
			end if
		end if
		
		(* ===== Section "Language Settings" ===== *)
		
		-- Panel "C/C++ Language"
		Set Preferences of panel "C/C++ Compiler" to �
			{Activate CPlusPlus:false �
				, ARM Conformance:false �
				, Exception Handling:true �
				, RTTI:true �
				, Pool Strings:true �
				, Dont Reuse Strings:false �
				, Require Function Prototypes:true �
				, Enable bool Support:true �
				, Enable wchar_t:true �
				, C99:false �
				, ANSI Strict:false �
				, ANSI Keywords Only:false �
				, Expand Trigraph Sequences:false �
				, MPW Newlines:false �
				, MPW Pointer Type Rules:false �
				, Enums Always Ints:false �
				, Prefix File:""}
		
		-- Panel "C/C++ Warnings"
		Set Preferences of panel "C/C++ Warnings" to �
			{Treat Warnings As Errors:false �
				, Illegal Pragmas:true �
				, Empty Declarations:true �
				, Possible Errors:true �
				, Unused Variables:true �
				, Unused Arguments:false �
				, Extra Commas:true �
				, Extended Error Checking:true �
				, Hidden Virtual Functions:true �
				, Implicit Arithmetic Conversions:false �
				, NonInlined Functions:false �
				, Inconsistent Class Struct:true}
		
		(* ===== Section "Code Generation" ===== *)
		
		-- Panel "PPC CodeGen Mach-O"
		Set Preferences of panel codeGenPanelName to �
			{Struct Alignment:Align_PPC �
				, Make Strings ReadOnly:true �
				, Use FMADD Instructions:false �
				, Schedule:false �
				, Peephole Optimizer:true}
		
		if not weAreMach then
			-- preferences that are only on non-Mach targets.
			Set Preferences of panel codeGenPanelName to �
				{Store Data in TOC:true �
					, Traceback Tables:TB_Inline}
		end if
		
		(* ===== Section "Debugger" ===== *)
		
		if shouldDebug then
			(* ==== Debug settings ==== *)
			(* ===== Panel PPC Global Optimizer =====  *)
			Set Preferences of panel "PPC Global Optimizer" to �
				{Optimize For:code_Speed, Level:0}
			
			(* ===== Panel PPC Linker ===== *)
			Set Preferences of panel linkerPanelName to �
				{Generate SYM File:true �
					, Full Path In SYM:true �
					, Generate Link Map:false �
					, Link Mode:fast}
			
			(* ===== Panel C/C++ Language =====  *)
			Set Preferences of panel "C/C++ Compiler" to �
				{Inlining:inline_none, AutoInlining:false}
		else
			(* ==== optimized/release settings ==== *)
			(* ===== Panel PPC Global Optimizer =====  *)
			Set Preferences of panel "PPC Global Optimizer" to �
				{Optimize For:code_Speed, Level:4}
			(* ===== Panel PPC Linker ===== *)
			
			Set Preferences of panel linkerPanelName to �
				{Generate SYM File:false �
					, Generate Link Map:false �
					, Link Mode:fast}
			
			(* ===== Panel C/C++ Language =====  *)
			Set Preferences of panel "C/C++ Compiler" to �
				{Inlining:inline_smart, AutoInlining:true}
		end if
		
		-- Panel "Debugger Settings"
		Set Preferences of panel "Debugger Target" to �
			{Log System Messages:false}
		
		(* ===== Panel Access Paths ===== *)
		-- when building projects add the other paths at the end of User Paths.
		-- since 'Always Full Search' is true they will get searched before the default System Paths.
		-- But MachO needs to move the /usr/.. directories to User Paths.
		
		Set Preferences of panel "Access Paths" to {Always Full Search:true, Convert Paths:true, Require Framework Includes:false}
		my SetPaths(weAreMach)
		
		-- add libraries to this target
		
		if not pCreateLibrary then
			if not weAreMach then
				if shouldDebug then
					set libsToAdd to {gMWCWfolder & "MacOS Support:Libraries:Runtime:Libs:MSL_All_Carbon_D.lib"}
				else
					set libsToAdd to {gMWCWfolder & "MacOS Support:Libraries:Runtime:Libs:MSL_All_Carbon.lib"}
				end if
				copy (gMWCWfolder & "MacOS Support:Universal:Libraries:StubLibraries:CarbonLib") to end of libsToAdd
			else
				if shouldDebug then
					set libsToAdd to {gMWCWfolder & "MacOS X Support:Libraries:Runtime:Libs:MSL_All_Mach-O_D.lib"}
				else
					set libsToAdd to {gMWCWfolder & "MacOS X Support:Libraries:Runtime:Libs:MSL_All_Mach-O.lib"}
				end if
				copy (gMWCWfolder & "MSL:MSL_C:MSL_MacOS:Src:console_OS_X.c") to end of libsToAdd
				copy ("/usr/lib/crt1.o") to end of libsToAdd
				copy "abc:System:Library:Frameworks:Carbon.framework" to end of libsToAdd
				copy "abc:System:Library:Frameworks:System.framework" to end of libsToAdd
			end if
			
			Add Files libsToAdd
		end if
		
	end tell
end SetPreferences

on SetPaths(weAreMach)
	tell application "CodeWarrior IDE"
		
		(* ===== Panel Access Paths ===== *)
		
		-- This removes the compiler default folders because otherwise setting the paths only adds on to the end. Never deletes anything.
		Set Preferences of panel "Access Paths" to {User Paths:{}, System Paths:{}}
		
		-- set up User Paths
		set userPaths to {{name:":", format:MacOS Path, origin:project relative, recursive:true}}
		if weAreMach then
			copy {name:":usr:include:", format:MacOS Path, origin:root relative, root:"OS X Volume", recursive:false} �
				to end of userPaths
			if not pCreateLibrary then
				copy {name:":usr:lib:", format:MacOS Path, origin:root relative, root:"OS X Volume", recursive:false} �
					to end of userPaths
			end if
		end if
		
		-- set up System Paths
		if weAreMach then
			set sysPaths to {�
				{name:":MSL:MSL_C:", format:MacOS Path, origin:shell relative, recursive:true}, �
				{name:":MacOS Support:", format:MacOS Path, origin:shell relative, recursive:true}, �
				{name:":MacOS X Support:", format:MacOS Path, origin:shell relative, recursive:true}}
		else
			set sysPaths to {�
				{name:":MSL:", format:MacOS Path, origin:shell relative, recursive:true}, �
				{name:":MacOS Support:", format:MacOS Path, origin:shell relative, recursive:true}}
		end if
		
		-- put everything back.
		Set Preferences of panel "Access Paths" to {User Paths:userPaths, System Paths:sysPaths}
		
	end tell
end SetPaths


on stripVolName(macPath)
	set saveTID to get text item delimiters of AppleScript
	set text item delimiters of AppleScript to ":"
	set strippedPath to (rest of text items of macPath) as string
	set text item delimiters of AppleScript to saveTID
	return strippedPath
end stripVolName


on IsOSX()
	tell application "Finder"
		set vers to the version as text
		if second character of vers is equal to "." then
			set vers to "0" & vers
		end if
		return vers > 10 or vers = 10
	end tell
end IsOSX


-- the following will build the stationery project in the lib directory.
-- CreateStationeryProject(gStationeryName, gDistribRoot & gBuildDir & ":" & gStationeryName & ":", gMWCWfolder)


-- the following are needed to run this script by itself,
-- they are not needed when it is called by another script.

--
-- Global variables
--

global gStartupDisk
global gHomeDir
global gMWroot
global gDistribRoot
global gBuildDir
global gRsrcsDir
global gStationeryName
global gDirsToCreate

on ResolveAlias(pathname)
	tell application "Finder"
		if exists folder pathname then return pathname & ":"
		if exists alias file pathname then return the original item of alias file pathname as string
		error "The folder (or alias) '" & pathname & "' doesn't exist."
	end tell
end ResolveAlias

on HomeDir()
	tell application "Finder"
		
		if my IsOSX() then
			return the home as string
		else
			return gStartupDisk
		end if
		
	end tell
end HomeDir

on ModuleRoot()
	set modRoot to ""
	try
		set modRoot to ResolveAlias(gMWroot & "ncbi")
	on error
		try
			set modRoot to ResolveAlias(gHomeDir & "ncbi")
		end try
	end try
	
	return modRoot
end ModuleRoot

on MWRootDir()
	
	set mwRoot to ""
	set mwLocations to {gStartupDisk, gStartupDisk & "Applications:", gStartupDisk & "Applications (Mac OS 9):", �
		gHomeDir, gHomeDir & "Applications:", gHomeDir & "Applications (Mac OS 9):"}
	repeat with mwVersion from 8 to 9
		set dirName to "Metrowerks CodeWarrior " & mwVersion & ".0"
		repeat with mwLoc in mwLocations
			try
				set mwRoot to ResolveAlias(mwLoc & dirName)
				return mwRoot
			end try
		end repeat
	end repeat
	
	error "Can't find the Metrowerks CodeWarrior folder."
	
end MWRootDir

on SetGlobals()
	tell application "Finder"
		
		set gStartupDisk to startup disk as string
		set gHomeDir to my HomeDir()
		set gMWroot to my MWRootDir()
		set gMWCWfolder to gMWroot & "Metrowerks CodeWarrior:"
		set gDistribRoot to my ModuleRoot()
		set gRsrcsDir to gDistribRoot & "link:macmet:"
		
		if pCreateLibrary then
			set gStationeryName to "LibraryStationery"
			set gBuildDir to "lib"
		else
			set gStationeryName to "ApplicationStationery"
			set gBuildDir to "build"
		end if
		
		set gDirsToCreate to {�
			{relPath:"", name:gBuildDir}, �
			{relPath:gBuildDir, name:gStationeryName}}
		
	end tell
end SetGlobals

on CreateFolders()
	tell application "Finder"
		
		repeat with i in gDirsToCreate
			set pth to relPath of i
			if pth is not "" then set pth to pth & ":"
			
			if not (exists folder (gDistribRoot & pth & i's name)) then
				make new folder at folder (gDistribRoot & pth) with properties {name:i's name}
			end if
		end repeat
		
	end tell
end CreateFolders