PmTypes.icl 10.8 KB
Newer Older
Diederik van Arkel's avatar
Diederik van Arkel committed
1 2
implementation module PmTypes

3
// The types for the Project Manager
Diederik van Arkel's avatar
Diederik van Arkel committed
4 5

import StdBool, StdInt
6
import UtilStrictLists
7
from UtilNewlinesFile import :: NewlineConvention(..)
Diederik van Arkel's avatar
Diederik van Arkel committed
8
import PmCompilerOptions
9
from StdPathname import :: Pathname
Diederik van Arkel's avatar
Diederik van Arkel committed
10
import StdFile
11
import Platform
Diederik van Arkel's avatar
Diederik van Arkel committed
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

::	Modulename			:== String

// Unexpected :: .a {#Char} -> .a
Unexpected message defaultValue
	:== UnexpectedEvalBefore defaultValue (UnexpectedReport message)

UnexpectedEvalBefore :: !.a !.b -> .a
UnexpectedEvalBefore defaultValue _
	=	defaultValue

Don`tCareValue :== 0

UnexpectedReport :: !{#Char} -> Int
UnexpectedReport message
	=	UnexpectedEvalBefore Don`tCareValue (fwrites message stderr)

UnexpectedConstructor :: !{#Char} !{#Char} !.a -> .a
UnexpectedConstructor typeName string defaultValue
	=	Unexpected ( "fromString (" +++ typeName +++ "): unknown value (" +++ string +++ ")\n") defaultValue

//--

35 36 37 38 39 40 41 42 43 44
::	Processor
	= CurrentProcessor
	| MC68000
	| MC68020
	| MC68020_and_68881
	| PowerPC_Classic
	| PowerPC_Carbon
	| PowerPC_MachO
	| I386

45 46 47 48 49 50 51
DefaultProcessor :: Processor
DefaultProcessor = PlatformDependant I386 PowerPC_Carbon

PlatformProcessors :: [Processor]
PlatformProcessors = PlatformDependant
	[I386]
	[PowerPC_Classic,PowerPC_Carbon,PowerPC_MachO]
52 53 54 55 56 57 58 59 60 61

ProcessorSuffix :: !Processor -> String
ProcessorSuffix CurrentProcessor	= ProcessorSuffix DefaultProcessor
ProcessorSuffix MC68000				= ".obj0"
ProcessorSuffix MC68020				= ".obj1"
ProcessorSuffix MC68020_and_68881	= ".obj2"
ProcessorSuffix PowerPC_Classic		= ".cxo"
ProcessorSuffix PowerPC_Carbon		= ".xo"
ProcessorSuffix PowerPC_MachO		= ".o"
ProcessorSuffix I386				= ".o"
Diederik van Arkel's avatar
Diederik van Arkel committed
62 63 64

instance == Processor
where
65
	(==) :: !Processor !Processor -> Bool
66 67 68 69 70 71 72 73 74
	(==) CurrentProcessor CurrentProcessor		=	True
	(==) MC68000 MC68000						=	True
	(==) MC68020 MC68020						=	True
	(==) MC68020_and_68881 MC68020_and_68881	=	True
	(==) PowerPC_Classic PowerPC_Classic		=	True
	(==) PowerPC_Carbon PowerPC_Carbon			=	True
	(==) PowerPC_MachO PowerPC_MachO			=	True
	(==) I386 I386								=	True
	(==) _ _									=	False
Diederik van Arkel's avatar
Diederik van Arkel committed
75 76 77

instance fromString Processor
where
78
	fromString :: !{#Char} -> Processor
79 80 81 82 83 84 85 86 87
	fromString "CurrentProcessor"		=	CurrentProcessor
	fromString "MC68000"				=	MC68000
	fromString "MC68020"				=	MC68020
	fromString "MC68020_and_68881"		=	MC68020_and_68881
	fromString "PowerPC_Classic"		=	PowerPC_Classic
	fromString "PowerPC_Carbon"			=	PowerPC_Carbon
	fromString "PowerPC_MachO"			=	PowerPC_MachO
	fromString "I386"					=	I386
	fromString string					=	UnexpectedConstructor "Processor" string CurrentProcessor
Diederik van Arkel's avatar
Diederik van Arkel committed
88 89 90

instance toString Processor
where
91
	toString :: !Processor -> {#Char}
92 93 94 95 96 97 98 99
	toString MC68000				=	"MC68000"
	toString MC68020				=	"MC68020"
	toString MC68020_and_68881		=	"MC68020_and_68881"
	toString PowerPC_Classic		=	"PowerPC_Classic"
	toString PowerPC_Carbon			=	"PowerPC_Carbon"
	toString PowerPC_MachO			=	"PowerPC_MachO"
	toString I386					=	"I386"
	toString CurrentProcessor		=	"CurrentProcessor"
Diederik van Arkel's avatar
Diederik van Arkel committed
100 101 102 103 104 105 106 107 108 109

:: ModInfoAndName =
	{
		info	:: ModInfo,
		name	:: {#Char}
	}

::	ModInfo	=
	{ dir				:: !String				// !Pathname			// directory
	, compilerOptions	:: !CompilerOptions		// compiler options
110
	, mod_edit_options	:: !ModEditOptions
Diederik van Arkel's avatar
Diederik van Arkel committed
111 112 113
	, abcLinkInfo		:: !ABCLinkInfo
	}

114 115 116 117 118 119 120
::	ModEditOptions = {
		defeo 		:: !EditWdOptions,		// definition module edit options
		impeo		:: !EditWdOptions,		// implementation module edit options
		defopen 	:: !Bool,				// definition module is open
		impopen 	:: !Bool				// implementation module is open
	}

Diederik van Arkel's avatar
Diederik van Arkel committed
121 122 123 124 125 126 127 128 129 130 131 132
:: ABCLinkInfo = {linkObjFileNames :: !List LinkObjFileName, linkLibraryNames :: !List LinkLibraryName}

:: LinkObjFileName	:== String
:: LinkLibraryName	:== String

//-- Link Options

::	LinkOptions =
	{ extraObjectModules	:: !List {#Char}
	, libraries				:: !List {#Char}
	, method				:: !LinkMethod
	, generate_relocations	:: !Bool			// Win only option
133
	, generate_symbol_table	:: !Bool
Diederik van Arkel's avatar
Diederik van Arkel committed
134 135 136 137 138 139
	, generate_link_map		:: !Bool
	, link_resources		:: !Bool
	, resource_source		:: !String

	, generate_dll						:: !Bool
	, dll_export_list_name				:: !String
140
	
141
//	, add_carb_resource		:: !Bool			// Mac-only!
142 143

	, strip_bytecode		:: !Bool			// strip ABC bytecode
144
	, keep_bytecode_symbols	:: !Bool			// only meaningful when strip_bytecode=True
145
	, prelink_bytecode		:: !Bool			// prelink bytecode for location-dependent interpretation
Diederik van Arkel's avatar
Diederik van Arkel committed
146
	}
147
/*
Diederik van Arkel's avatar
Diederik van Arkel committed
148 149 150 151 152 153 154 155 156 157 158
instance == LinkOptions		// do we need to check resource linking flags???
where
	(==) :: !LinkOptions !LinkOptions -> Bool
	(==) lo1 lo2 =

		lo1.method == lo2.method &&
		lo1.generate_relocations == lo2.generate_relocations &&
		lo1.generate_link_map == lo2.generate_link_map &&
		lo1.link_resources == lo2.link_resources &&
		(if lo1.link_resources (lo1.resource_source == lo2.resource_source) True) &&
		EQStrings (SortStrings lo1.extraObjectModules) (SortStrings lo2.extraObjectModules) &&
159 160 161
		EQStrings (SortStrings lo1.libraries) (SortStrings lo2.libraries) &&
		lo1.add_carb_resource == lo2.add_carb_resource
*/
Diederik van Arkel's avatar
Diederik van Arkel committed
162 163 164 165 166 167
DefaultLinkOptions :: LinkOptions;
DefaultLinkOptions =
	{ extraObjectModules		= Nil
	, libraries					= Nil
	, method					= LM_Static
	, generate_relocations		= False
168
	, generate_symbol_table		= False
Diederik van Arkel's avatar
Diederik van Arkel committed
169 170 171 172 173 174
	, generate_link_map			= False
	, link_resources			= False
	, resource_source			= ""

	, generate_dll						= False
	, dll_export_list_name				= ""
175
//	, add_carb_resource					= False	// Clean2 ide targets Carbon?!
176 177
	, strip_bytecode			= True
	, keep_bytecode_symbols		= True
178
	, prelink_bytecode			= False
Diederik van Arkel's avatar
Diederik van Arkel committed
179 180 181 182
	}

:: LinkMethod
	= LM_Static
Diederik van Arkel's avatar
Diederik van Arkel committed
183
//	| LM_Eager
Diederik van Arkel's avatar
Diederik van Arkel committed
184
	| LM_Dynamic
Diederik van Arkel's avatar
Diederik van Arkel committed
185 186
	| LM_StaticLibrary		// produce static library
	| LM_DynamicLibrary		// produce shared library
Diederik van Arkel's avatar
Diederik van Arkel committed
187 188 189 190

instance toString LinkMethod
where
	toString LM_Static	= "Static"
Diederik van Arkel's avatar
Diederik van Arkel committed
191
//	toString LM_Eager	= "Eager"
Diederik van Arkel's avatar
Diederik van Arkel committed
192
	toString LM_Dynamic	= "Dynamic"
Diederik van Arkel's avatar
Diederik van Arkel committed
193 194
	toString LM_StaticLibrary	= "StaticLibrary"
	toString LM_DynamicLibrary	= "DynamicLibrary"
Diederik van Arkel's avatar
Diederik van Arkel committed
195 196 197
	
instance fromString LinkMethod
where
Diederik van Arkel's avatar
Diederik van Arkel committed
198 199 200 201 202 203 204 205 206 207
	fromString "Static"			= LM_Static
	fromString "Eager"			= LM_Dynamic
	fromString "Dynamic"		= LM_Dynamic
	fromString "StaticLibrary"	= LM_StaticLibrary
	fromString "DynamicLibrary"	= LM_DynamicLibrary
/*
	fromString "Eager"			= LM_Eager
	fromString "Dynamic"		= LM_Dynamic
*/
	fromString _				= LM_Static
Diederik van Arkel's avatar
Diederik van Arkel committed
208 209 210 211

instance == LinkMethod
where
	(==) :: !LinkMethod !LinkMethod -> Bool
Diederik van Arkel's avatar
Diederik van Arkel committed
212 213 214 215 216 217
	(==) LM_Static			LM_Static			= True
//	(==) LM_Eager			LM_Eager			= True
	(==) LM_Dynamic			LM_Dynamic			= True
	(==) LM_StaticLibrary	LM_StaticLibrary	= True
	(==) LM_DynamicLibrary	LM_DynamicLibrary	= True
	(==) _					_					= False
Diederik van Arkel's avatar
Diederik van Arkel committed
218 219 220 221 222 223 224 225 226 227

//	Window position and size

::	WindowPos_and_Size	=
	{	posx	:: !Int
	,	posy	:: !Int
	,	sizex	:: !Int
	,	sizey	:: !Int
	}

228 229 230 231 232 233 234 235 236
instance == OptionalWindowPosAndSize
where
	(==) (WindowPosAndSize pos1) (WindowPosAndSize pos2)
		= pos1==pos2
	(==) NoWindowPosAndSize NoWindowPosAndSize
		= True
	(==) _ _
		= False

Diederik van Arkel's avatar
Diederik van Arkel committed
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
instance == WindowPos_and_Size
where
	(==) :: !WindowPos_and_Size !WindowPos_and_Size -> Bool
	(==) pos1 pos2
		=	pos1.posx == pos2.posx &&
			pos1.posy == pos2.posy &&
			pos1.sizex == pos2.sizex &&
			pos1.sizey == pos2.sizey

DefWindowPos_and_Size :: WindowPos_and_Size
DefWindowPos_and_Size =
	{ posx=0
	, posy=0
	, sizex=500
	, sizey=300
	}


//	The Editor Options: default settings for the EditWindows.

::	EditOptions	=
	{/*	tabs		:: !Int
	,	fontname	:: !String				// !FontName
	,	fontsize	:: !Int					// !FontSize
	,	autoi		:: !Bool
	,*/	newlines	:: !NewlineConvention
/*	,	showtabs	:: !Bool
	,	showlins	:: !Bool
	,	showsync	:: !Bool
*/	}
	// (tabs,font&size,auto indent)

instance == EditOptions
where
	(==) :: !EditOptions !EditOptions -> Bool
	(==) eo1 eo2
		= True
/*		=	eo1.tabs == eo2.tabs &&
			eo1.EditOptions.fontname == eo2.EditOptions.fontname &&
			eo1.EditOptions.fontsize == eo2.EditOptions.fontsize &&
			eo1.EditOptions.autoi == eo2.EditOptions.autoi
*/

//	The Window parameters: edit options and window position and size
::	EditWdOptions	=
	{	eo			:: !EditOptions
283
	,	pos_size	:: !OptionalWindowPosAndSize 
Diederik van Arkel's avatar
Diederik van Arkel committed
284 285 286 287
	}
	// edit options, window pos&size
	
//	The Code Generator Options: default settings for the code generator
288 289 290 291 292 293 294
::	CodeGenOptions	=
	{ cs				:: !Bool
	, ci				:: !Bool
//	, kaf				:: !Bool
//	, tp				:: !Processor
	, optimise_abc		:: !Bool
	, generate_bytecode	:: !Bool
Diederik van Arkel's avatar
Diederik van Arkel committed
295 296 297 298 299 300 301
	}

instance == CodeGenOptions
where
	(==) :: !CodeGenOptions !CodeGenOptions -> Bool
	(==) cg1 cg2
		=	cg1.cs == cg2.cs &&
302 303
			cg1.ci == cg2.ci &&
			cg1.generate_bytecode == cg2.generate_bytecode
Diederik van Arkel's avatar
Diederik van Arkel committed
304 305 306

DefCodeGenOptions :: CodeGenOptions;
DefCodeGenOptions =
307 308 309
	{	cs					= False
	,	ci					= True
	,	optimise_abc		= False
310
	,	generate_bytecode	= False
Diederik van Arkel's avatar
Diederik van Arkel committed
311 312 313 314 315 316 317 318 319 320 321 322 323
	}

//	The Application Options: default settings for the application.
::	ApplicationOptions	=
	{	hs								:: !Int
	,	ss								:: !Int
	,	em								:: !Int
	,	heap_size_multiple				:: !Int
	,	initial_heap_size				:: !Int
	,	set								:: !Bool
	,	sgc								:: !Bool
	,	pss								:: !Bool
	,	marking_collection				:: !Bool
324
	,	disable_rts_flags				:: !Bool
Diederik van Arkel's avatar
Diederik van Arkel committed
325 326 327 328 329 330 331 332
	,	o								:: !Output
	,	fn								:: !String		// !FontName
	,	fs								:: !Int			// !FontSize
	,	write_stderr_to_file			:: !Bool
	,	memoryProfiling 				:: !Bool
	,	memoryProfilingMinimumHeapSize	:: !Int
	,	profiling 						:: !Bool
	,	stack_traces					:: !Bool
333
	,	dynamics						:: !Bool
334 335
	,	generic_fusion					:: !Bool
	,	desc_exl						:: !Bool
Diederik van Arkel's avatar
Diederik van Arkel committed
336 337 338 339 340
	,	standard_rte					:: !Bool		// DvA: use standard RTE (only in IDE)
	}

DefApplicationOptions :: ApplicationOptions;
DefApplicationOptions =
341 342 343 344 345
	{	hs	= 2<<20
	,	ss	= 500<<10
	,	em	= 8<<10
	,	heap_size_multiple = 16<<8
	,	initial_heap_size = 200<<10
Diederik van Arkel's avatar
Diederik van Arkel committed
346 347 348 349
	,	set	= False
	,	sgc	= False
	,	pss	= False
	,	marking_collection = False
350
	,   disable_rts_flags = False
Diederik van Arkel's avatar
Diederik van Arkel committed
351
	,	o	= ShowConstructors
352
	,	fn	= "Monaco"				//=> platform dependant?
Diederik van Arkel's avatar
Diederik van Arkel committed
353 354 355 356 357 358 359
	,	fs	= 9						//=> platform dependant?
	,	write_stderr_to_file
						= False
	,	memoryProfiling = False
	,	memoryProfilingMinimumHeapSize = 0
	,	profiling = False
	,	stack_traces = False
360
	,	dynamics = False
361
	,	generic_fusion = False
362
	,	desc_exl = False
Diederik van Arkel's avatar
Diederik van Arkel committed
363 364 365
	,	standard_rte = True
	}
	
366
::	Output = BasicValuesOnly | ShowConstructors | NoReturnType | NoConsole
Diederik van Arkel's avatar
Diederik van Arkel committed
367 368 369

instance == Output
where
370
	(==) :: !Output !Output -> Bool
Diederik van Arkel's avatar
Diederik van Arkel committed
371 372 373 374
	(==) BasicValuesOnly BasicValuesOnly
		=	True
	(==) ShowConstructors ShowConstructors
		=	True
375 376
	(==) NoReturnType NoReturnType
		=	True
Diederik van Arkel's avatar
Diederik van Arkel committed
377 378 379 380 381 382 383
	(==) NoConsole NoConsole
		=	True
	(==) _ _
		=	False;

instance fromString Output
where
384
	fromString :: !{#Char} -> Output
Diederik van Arkel's avatar
Diederik van Arkel committed
385 386 387 388
	fromString "BasicValuesOnly"
		=	BasicValuesOnly
	fromString "ShowConstructors"
		=	ShowConstructors
389 390
	fromString "NoReturnType"
		=	NoReturnType
Diederik van Arkel's avatar
Diederik van Arkel committed
391 392 393 394 395 396 397
	fromString "NoConsole"
		=	NoConsole
	fromString string
		=	UnexpectedConstructor "Output" string BasicValuesOnly

instance toString Output
where
398
	toString :: !Output -> {#Char}
Diederik van Arkel's avatar
Diederik van Arkel committed
399 400 401 402
	toString BasicValuesOnly
		=	"BasicValuesOnly"
	toString ShowConstructors
		=	"ShowConstructors"
403 404
	toString NoReturnType
		=	"NoReturnType"
Diederik van Arkel's avatar
Diederik van Arkel committed
405 406 407 408 409 410 411 412 413 414 415 416 417
	toString NoConsole
		=	"NoConsole"

:: StaticLibInfo =
	{ sLibs :: !List Pathname
	, sDcls :: !List Modulename
	, sDeps :: !List Modulename
	}

isProjLibraryModule :: !.String !StaticLibInfo -> Bool
isProjLibraryModule mod info=:{sDcls}
	= StringOccurs mod sDcls