fpswitch.pas 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Integrated Development Environment
  4. Copyright (c) 1998-2000 by Berczi Gabor
  5. Compiler switches routines for the IDE
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. unit FPSwitch;
  13. interface
  14. uses
  15. Objects,
  16. Systems,
  17. WUtils,
  18. FPConst;
  19. const
  20. MinMemSize = 1024; { min. local heap and stack size }
  21. MaxMemSize = 67107840; { max. local heap and stack size }
  22. type
  23. TParamID =
  24. (idNone,idAlign,idRangeChecks,idStackChecks,idIOChecks,
  25. idOverflowChecks,idAsmDirect,idAsmATT,idAsmIntel,idAsmMot,
  26. idSymInfNone,idSymInfGlobalOnly,idSymInfGlobalLocal,
  27. idStackSize,idHeapSize,idStrictVarStrings,idExtendedSyntax,
  28. idMMXOps,idTypedAddress,idPackRecords,idPackEnum,idStackFrames,
  29. idReferenceInfo,idDebugInfo,idBoolEval,
  30. idLongString,idTypeInfo);
  31. TSwitchMode = (om_Normal,om_Debug,om_Release);
  32. TSwitchItemTyp = (ot_Select,ot_Boolean,ot_String,ot_Longint);
  33. PSwitchItem = ^TSwitchItem;
  34. TSwitchItem = object(TObject)
  35. Typ : TSwitchItemTyp;
  36. Name : string[50];
  37. Param : string[10];
  38. ParamID : TParamID;
  39. constructor Init(const n,p:string; AID: TParamID);
  40. function NeedParam:boolean;virtual;
  41. function ParamValue:string;virtual;
  42. function ParamValueBool(SM: TSwitchMode):boolean;virtual;
  43. function GetSwitchStr(SM: TSwitchMode): string; virtual;
  44. function GetNumberStr(SM: TSwitchMode): string; virtual;
  45. function GetOptionStr(SM: TSwitchMode): string; virtual;
  46. procedure Reset;virtual;
  47. end;
  48. PSelectItem = ^TSelectItem;
  49. TSelectItem = object(TSwitchItem)
  50. IsDefault : boolean;
  51. constructor Init(const n,p:string; AID: TParamID);
  52. { Select to avoid anything in config file }
  53. constructor InitDefault(const n:string);
  54. end;
  55. PBooleanItem = ^TBooleanItem;
  56. TBooleanItem = object(TSwitchItem)
  57. IsSet : array[TSwitchMode] of boolean;
  58. constructor Init(const n,p:string; AID: TParamID);
  59. function NeedParam:boolean;virtual;
  60. procedure Reset;virtual;
  61. function GetSwitchStr(SM: TSwitchMode): string; virtual;
  62. function ParamValueBool(SM: TSwitchMode):boolean;virtual;
  63. end;
  64. PStringItem = ^TStringItem;
  65. TStringItem = object(TSwitchItem)
  66. Str : array[TSwitchMode] of string;
  67. multiple : boolean;
  68. SeparateSpaces : boolean;
  69. constructor Init(const n,p:string;AID: TParamID; mult,allowspaces:boolean);
  70. function NeedParam:boolean;virtual;
  71. function ParamValue:string;virtual;
  72. procedure Reset;virtual;
  73. end;
  74. PLongintItem = ^TLongintItem;
  75. TLongintItem = object(TSwitchItem)
  76. Val : array[TSwitchMode] of longint;
  77. constructor Init(const n,p:string; AID: TParamID);
  78. function NeedParam:boolean;virtual;
  79. function ParamValue:string;virtual;
  80. function GetNumberStr(SM: TSwitchMode): string; virtual;
  81. procedure Reset;virtual;
  82. end;
  83. PSwitches = ^TSwitches;
  84. TSwitches = object
  85. constructor Init(ch:char);
  86. constructor InitSelect(ch:char);
  87. destructor Done;
  88. { general items }
  89. function ItemCount:integer;
  90. function ItemName(index:integer):string;
  91. function ItemParam(index:integer):string;
  92. { type specific }
  93. procedure AddSelectItem(const name,param:string; AID: TParamID);
  94. procedure AddDefaultSelect(const name:string);
  95. procedure AddBooleanItem(const name,param:string; AID: TParamID);
  96. procedure AddLongintItem(const name,param:string; AID: TParamID);
  97. procedure AddStringItem(const name,param:string;AID: TParamID;mult,allowspaces:boolean);
  98. function GetCurrSel:integer;
  99. function GetCurrSelParam : String;
  100. function GetBooleanItem(index:integer):boolean;
  101. function GetLongintItem(index:integer):longint;
  102. function GetStringItem(index:integer):string;
  103. procedure SetCurrSel(index:integer);
  104. function SetCurrSelParam(const s : String) : boolean;
  105. procedure SetBooleanItem(index:integer;b:boolean);
  106. procedure SetLongintItem(index:integer;l:longint);
  107. procedure SetStringItem(index:integer;const s:string);
  108. { read / write to cfgfile which must be open }
  109. procedure WriteItemsCfg;
  110. function ReadItemsCfg(const s:string):boolean;
  111. private
  112. IsSel : boolean;
  113. Prefix : char;
  114. SelNr : array[TSwitchMode] of integer;
  115. Items : PCollection;
  116. end;
  117. const
  118. SwitchesMode : TSwitchMode = om_Normal;
  119. SwitchesModeName : array[TSwitchMode] of string[10]=
  120. ('~N~ormal','~D~ebug','~R~elease');
  121. SwitchesModeStr : array[TSwitchMode] of string[8]=
  122. ('NORMAL','DEBUG','RELEASE');
  123. CustomArg : array[TSwitchMode] of string{$ifndef FPC}[128]{$endif}=
  124. ('','','');
  125. var
  126. LibLinkerSwitches,
  127. OtherLinkerSwitches,
  128. DebugInfoSwitches,
  129. LinkAfterSwitches,
  130. ProfileInfoSwitches,
  131. {MemorySizeSwitches, doubled !! }
  132. SyntaxSwitches,
  133. VerboseSwitches,
  134. CodegenSwitches,
  135. OptimizationSwitches,
  136. OptimizingGoalSwitches,
  137. ProcessorSwitches,
  138. AsmReaderSwitches,
  139. AsmInfoSwitches,
  140. AsmOutputSwitches,
  141. TargetSwitches,
  142. ConditionalSwitches,
  143. MemorySwitches,
  144. BrowserSwitches,
  145. DirectorySwitches : PSwitches;
  146. { write/read the Switches to fpc.cfg file }
  147. procedure WriteSwitches(const fn:string);
  148. procedure ReadSwitches(const fn:string);
  149. { initialize }
  150. procedure InitSwitches;
  151. procedure SetDefaultSwitches;
  152. procedure DoneSwitches;
  153. function GetSourceDirectories : string;
  154. procedure GetCompilerOptionLines(C: PUnsortedStringCollection);
  155. implementation
  156. uses
  157. Dos,
  158. GlobType,
  159. FPString,FPVars,FPUtils;
  160. var
  161. CfgFile : text;
  162. {*****************************************************************************
  163. TSwitchItem
  164. *****************************************************************************}
  165. constructor TSwitchItem.Init(const n,p:string; AID: TParamID);
  166. begin
  167. Inherited Init;
  168. Name:=n;
  169. Param:=p;
  170. ParamID:=AID;
  171. end;
  172. function TSwitchItem.NeedParam:boolean;
  173. begin
  174. NeedParam:=false;
  175. end;
  176. function TSwitchItem.ParamValue:string;
  177. begin
  178. ParamValue:='';
  179. end;
  180. function TSwitchItem.ParamValueBool(SM: TSwitchMode):boolean;
  181. begin
  182. Abstract;
  183. ParamValueBool:=false;
  184. end;
  185. function TSwitchItem.GetSwitchStr(SM: TSwitchMode): string;
  186. begin
  187. Abstract;
  188. GetSwitchStr:='';
  189. end;
  190. function TSwitchItem.GetNumberStr(SM: TSwitchMode): string;
  191. begin
  192. Abstract;
  193. GetNumberStr:='';
  194. end;
  195. function TSwitchItem.GetOptionStr(SM: TSwitchMode): string;
  196. begin
  197. Abstract;
  198. GetOptionStr:='';
  199. end;
  200. procedure TSwitchItem.Reset;
  201. begin
  202. end;
  203. {*****************************************************************************
  204. TSelectItem
  205. *****************************************************************************}
  206. constructor TSelectItem.Init(const n,p:string; AID: TParamID);
  207. begin
  208. Inherited Init(n,p,AID);
  209. Typ:=ot_Select;
  210. IsDefault:=false;
  211. end;
  212. constructor TSelectItem.InitDefault(const n:string);
  213. begin
  214. Inherited Init(n,'',idNone);
  215. Typ:=ot_Select;
  216. IsDefault:=true;
  217. end;
  218. {*****************************************************************************
  219. TBooleanItem
  220. *****************************************************************************}
  221. constructor TBooleanItem.Init(const n,p:string; AID: TParamID);
  222. begin
  223. Inherited Init(n,p,AID);
  224. Typ:=ot_Boolean;
  225. Reset;
  226. end;
  227. function TBooleanItem.NeedParam:boolean;
  228. begin
  229. NeedParam:=IsSet[SwitchesMode];
  230. end;
  231. procedure TBooleanItem.Reset;
  232. begin
  233. FillChar(IsSet,sizeof(IsSet),0);
  234. end;
  235. function TBooleanItem.ParamValueBool(SM: TSwitchMode):boolean;
  236. begin
  237. ParamValueBool:=IsSet[SM];
  238. end;
  239. function TBooleanItem.GetSwitchStr(SM: TSwitchMode): string;
  240. begin
  241. GetSwitchStr:=BoolToStr(IsSet[SM],'+','-');
  242. end;
  243. {*****************************************************************************
  244. TStringItem
  245. *****************************************************************************}
  246. constructor TStringItem.Init(const n,p:string; AID: TParamID; mult,allowspaces:boolean);
  247. begin
  248. Inherited Init(n,p,AID);
  249. Typ:=ot_String;
  250. Multiple:=mult;
  251. SeparateSpaces:=not allowspaces;
  252. Reset;
  253. end;
  254. function TStringItem.NeedParam:boolean;
  255. begin
  256. NeedParam:=(Str[SwitchesMode]<>'');
  257. end;
  258. function TStringItem.ParamValue:string;
  259. begin
  260. ParamValue:=Str[SwitchesMode];
  261. end;
  262. procedure TStringItem.Reset;
  263. begin
  264. FillChar(Str,sizeof(Str),0);
  265. end;
  266. {*****************************************************************************
  267. TLongintItem
  268. *****************************************************************************}
  269. constructor TLongintItem.Init(const n,p:string; AID: TParamID);
  270. begin
  271. Inherited Init(n,p,AID);
  272. Typ:=ot_Longint;
  273. Reset;
  274. end;
  275. function TLongintItem.NeedParam:boolean;
  276. begin
  277. NeedParam:=(Val[SwitchesMode]<>0);
  278. end;
  279. function TLongintItem.ParamValue:string;
  280. var
  281. s : string;
  282. begin
  283. Str(Val[SwitchesMode],s);
  284. ParamValue:=s;
  285. end;
  286. procedure TLongintItem.Reset;
  287. begin
  288. FillChar(Val,sizeof(Val),0);
  289. end;
  290. function TLongintItem.GetNumberStr(SM: TSwitchMode): string;
  291. begin
  292. GetNumberStr:=IntToStr(Val[SM]);
  293. end;
  294. {*****************************************************************************
  295. TSwitch
  296. *****************************************************************************}
  297. constructor TSwitches.Init(ch:char);
  298. begin
  299. new(Items,Init(10,5));
  300. Prefix:=ch;
  301. FillChar(SelNr,SizeOf(SelNr),#0);
  302. IsSel:=false;
  303. end;
  304. constructor TSwitches.InitSelect(ch:char);
  305. begin
  306. new(Items,Init(10,5));
  307. Prefix:=ch;
  308. FillChar(SelNr,SizeOf(SelNr),#0);
  309. IsSel:=true;
  310. end;
  311. destructor TSwitches.Done;
  312. begin
  313. dispose(Items,Done);
  314. end;
  315. procedure TSwitches.AddSelectItem(const name,param:string; AID: TParamID);
  316. begin
  317. Items^.Insert(New(PSelectItem,Init(name,Param,AID)));
  318. end;
  319. procedure TSwitches.AddDefaultSelect(const name:string);
  320. begin
  321. Items^.Insert(New(PSelectItem,InitDefault(name)));
  322. end;
  323. procedure TSwitches.AddBooleanItem(const name,param:string; AID: TParamID);
  324. begin
  325. Items^.Insert(New(PBooleanItem,Init(name,Param,AID)));
  326. end;
  327. procedure TSwitches.AddLongintItem(const name,param:string; AID: TParamID);
  328. begin
  329. Items^.Insert(New(PLongintItem,Init(name,Param,AID)));
  330. end;
  331. procedure TSwitches.AddStringItem(const name,param:string;AID: TParamID;mult,allowspaces:boolean);
  332. begin
  333. Items^.Insert(New(PStringItem,Init(name,Param,AID,mult,allowspaces)));
  334. end;
  335. function TSwitches.ItemCount:integer;
  336. begin
  337. ItemCount:=Items^.Count;
  338. end;
  339. function TSwitches.ItemName(index:integer):string;
  340. var
  341. P : PSwitchItem;
  342. begin
  343. if index<ItemCount then
  344. P:=Items^.At(Index)
  345. else
  346. P:=nil;
  347. if assigned(P) then
  348. ItemName:=P^.Name
  349. else
  350. ItemName:='';
  351. end;
  352. function TSwitches.ItemParam(index:integer):string;
  353. var
  354. P : PSwitchItem;
  355. begin
  356. if index<ItemCount then
  357. P:=Items^.At(Index)
  358. else
  359. P:=nil;
  360. if assigned(P) then
  361. ItemParam:='-'+Prefix+P^.Param
  362. else
  363. ItemParam:='';
  364. end;
  365. function TSwitches.GetBooleanItem(index:integer):boolean;
  366. var
  367. P : PBooleanItem;
  368. begin
  369. if index<ItemCount then
  370. P:=Items^.At(Index)
  371. else
  372. P:=nil;
  373. if assigned(P) and (P^.Typ=ot_boolean) then
  374. GetBooleanItem:=P^.IsSet[SwitchesMode]
  375. else
  376. GetBooleanItem:=false;
  377. end;
  378. function TSwitches.GetLongintItem(index:integer):longint;
  379. var
  380. P : PLongintItem;
  381. begin
  382. if index<ItemCount then
  383. P:=Items^.At(Index)
  384. else
  385. P:=nil;
  386. if assigned(P) and (P^.Typ=ot_longint) then
  387. GetLongintItem:=P^.Val[SwitchesMode]
  388. else
  389. GetLongintItem:=0;
  390. end;
  391. function TSwitches.GetStringItem(index:integer):string;
  392. var
  393. P : PStringItem;
  394. begin
  395. if index<ItemCount then
  396. P:=Items^.At(Index)
  397. else
  398. P:=nil;
  399. if assigned(P) and (P^.Typ=ot_string) then
  400. GetStringItem:=P^.Str[SwitchesMode]
  401. else
  402. GetStringItem:='';
  403. end;
  404. procedure TSwitches.SetBooleanItem(index:integer;b:boolean);
  405. var
  406. P : PBooleanItem;
  407. begin
  408. if index<ItemCount then
  409. P:=Items^.At(Index)
  410. else
  411. P:=nil;
  412. if assigned(P) and (P^.Typ=ot_boolean) then
  413. P^.IsSet[SwitchesMode]:=b;
  414. end;
  415. procedure TSwitches.SetLongintItem(index:integer;l:longint);
  416. var
  417. P : PLongintItem;
  418. begin
  419. if index<ItemCount then
  420. P:=Items^.At(Index)
  421. else
  422. P:=nil;
  423. if assigned(P) and (P^.Typ=ot_longint) then
  424. P^.Val[SwitchesMode]:=l;
  425. end;
  426. procedure TSwitches.SetStringItem(index:integer;const s:string);
  427. var
  428. P : PStringItem;
  429. begin
  430. if index<ItemCount then
  431. P:=Items^.At(Index)
  432. else
  433. P:=nil;
  434. if assigned(P) and (P^.Typ=ot_string) then
  435. P^.Str[SwitchesMode]:=s;
  436. end;
  437. function TSwitches.GetCurrSel:integer;
  438. begin
  439. if IsSel then
  440. GetCurrSel:=SelNr[SwitchesMode]
  441. else
  442. GetCurrSel:=-1;
  443. end;
  444. function TSwitches.GetCurrSelParam : String;
  445. begin
  446. if IsSel then
  447. GetCurrSelParam:=PSwitchItem(Items^.At(SelNr[SwitchesMode]))^.Param
  448. else
  449. GetCurrSelParam:='';
  450. end;
  451. procedure TSwitches.SetCurrSel(index:integer);
  452. begin
  453. if IsSel then
  454. SelNr[SwitchesMode]:=index;
  455. end;
  456. function TSwitches.SetCurrSelParam(const s : String) : boolean;
  457. function checkitem(P:PSwitchItem):boolean;{$ifndef FPC}far;{$endif}
  458. begin
  459. { empty items are not equivalent to others !! }
  460. CheckItem:=((S='') and (P^.Param='')) or
  461. ((Length(S)>0) and (P^.Param=s));
  462. end;
  463. var
  464. FoundP : PSwitchItem;
  465. begin
  466. FoundP:=Items^.FirstThat(@CheckItem);
  467. if Assigned(FoundP) then
  468. begin
  469. SetCurrSelParam:=true;
  470. SelNr[SwitchesMode]:=Items^.IndexOf(FoundP);
  471. end
  472. else
  473. SetCurrSelParam:=false;
  474. end;
  475. procedure TSwitches.WriteItemsCfg;
  476. var
  477. Pref : char;
  478. procedure writeitem(P:PSwitchItem);{$ifndef FPC}far;{$endif}
  479. var
  480. s,s1 : string;
  481. i,j : integer;
  482. begin
  483. if P^.NeedParam then
  484. begin
  485. if (P^.Typ=ot_string) and (PStringItem(P)^.Multiple) then
  486. begin
  487. s:=PStringItem(P)^.Str[SwitchesMode];
  488. repeat
  489. i:=pos(';',s);
  490. if PStringItem(P)^.SeparateSpaces then
  491. j:=pos(' ',s)
  492. else
  493. j:=0;
  494. if i=0 then
  495. i:=256;
  496. if (j>0) and (j<i) then
  497. i:=j;
  498. s1:=Copy(s,1,i-1);
  499. if s1<>'' then
  500. writeln(CfgFile,' -'+Pref+P^.Param+s1);
  501. Delete(s,1,i);
  502. until s='';
  503. end
  504. else
  505. if P^.Param<>'/' then
  506. Writeln(CfgFile,' -'+Pref+P^.Param+P^.ParamValue);
  507. end;
  508. end;
  509. var
  510. P : PSelectItem;
  511. begin
  512. Pref:=Prefix;
  513. if IsSel then
  514. begin
  515. { can be empty for some targets }
  516. If Items^.count>0 then
  517. begin
  518. P:=Items^.At(SelNr[SwitchesMode]);
  519. if not P^.IsDefault then
  520. writeln(CfgFile,' '+ItemParam(SelNr[SwitchesMode]));
  521. end;
  522. end
  523. else
  524. Items^.ForEach(@writeitem);
  525. end;
  526. procedure WriteCustom;
  527. var
  528. s : string;
  529. i : longint;
  530. begin
  531. s:=CustomArg[SwitchesMode];
  532. While s<>'' do
  533. begin
  534. i:=pos(' ',s);
  535. if i=0 then i:=256;
  536. writeln(CfgFile,' '+Copy(s,1,i-1));
  537. if i=256 then
  538. s:=''
  539. else
  540. s:=copy(s,i+1,255);
  541. end;
  542. end;
  543. function TSwitches.ReadItemsCfg(const s:string):boolean;
  544. function checkitem(P:PSwitchItem):boolean;{$ifndef FPC}far;{$endif}
  545. begin
  546. { empty items are not equivalent to others !! }
  547. { but -dGDB didn't work because of this PM }
  548. CheckItem:=((P^.Param='') and ((S='') or (P^.typ=ot_String))) or
  549. ((Length(P^.Param)>0) and (P^.Param=Copy(s,1,length(P^.Param))));
  550. end;
  551. var
  552. FoundP : PSwitchItem;
  553. code : integer;
  554. begin
  555. FoundP:=Items^.FirstThat(@checkitem);
  556. if assigned(FoundP) then
  557. begin
  558. case FoundP^.Typ of
  559. ot_Select : SelNr[SwitchesMode]:=Items^.IndexOf(FoundP);
  560. ot_Boolean : PBooleanItem(FoundP)^.IsSet[SwitchesMode]:=true;
  561. ot_String : begin
  562. if (PStringItem(FoundP)^.Multiple) and (PStringItem(FoundP)^.Str[SwitchesMode]<>'') then
  563. PStringItem(FoundP)^.Str[SwitchesMode]:=PStringItem(FoundP)^.Str[SwitchesMode]+';'+
  564. Copy(s,length(FoundP^.Param)+1,255)
  565. else
  566. PStringItem(FoundP)^.Str[SwitchesMode]:=Copy(s,length(FoundP^.Param)+1,255);
  567. end;
  568. ot_Longint : Val(Copy(s,length(FoundP^.Param)+1,255),PLongintItem(FoundP)^.Val[SwitchesMode],code);
  569. end;
  570. ReadItemsCfg:=true;
  571. end
  572. else
  573. ReadItemsCfg:=false;
  574. end;
  575. {*****************************************************************************
  576. Read / Write
  577. *****************************************************************************}
  578. procedure WriteSwitches(const fn:string);
  579. var
  580. OldSwitchesMode, SWM: TSwitchMode;
  581. begin
  582. { create the switches }
  583. assign(CfgFile,fn);
  584. {$I-}
  585. rewrite(CfgFile);
  586. {$I+}
  587. if ioresult<>0 then
  588. exit;
  589. writeln(CfgFile,'# '+msg_automaticallycreateddontedit);
  590. OldSwitchesMode:=SwitchesMode;
  591. for SWM:=low(TSwitchMode) to high(TSwitchMode) do
  592. begin
  593. SwitchesMode := SWM;
  594. Writeln(CfgFile,'#IFDEF '+SwitchesModeStr[SwitchesMode]);
  595. TargetSwitches^.WriteItemsCfg;
  596. VerboseSwitches^.WriteItemsCfg;
  597. SyntaxSwitches^.WriteItemsCfg;
  598. CodegenSwitches^.WriteItemsCfg;
  599. OptimizationSwitches^.WriteItemsCfg;
  600. OptimizingGoalSwitches^.WriteItemsCfg;
  601. ProcessorSwitches^.WriteItemsCfg;
  602. AsmReaderSwitches^.WriteItemsCfg;
  603. AsmInfoSwitches^.WriteItemsCfg;
  604. AsmOutputSwitches^.WriteItemsCfg;
  605. DirectorySwitches^.WriteItemsCfg;
  606. MemorySwitches^.WriteItemsCfg;
  607. ConditionalSwitches^.WriteItemsCfg;
  608. LibLinkerSwitches^.WriteItemsCfg;
  609. OtherLinkerSwitches^.WriteItemsCfg;
  610. DebugInfoSwitches^.WriteItemsCfg;
  611. ProfileInfoSwitches^.WriteItemsCfg;
  612. LinkAfterSwitches^.WriteItemsCfg;
  613. BrowserSwitches^.WriteItemsCfg;
  614. {MemorySizeSwitches^.WriteItemsCfg;}
  615. WriteCustom;
  616. Writeln(CfgFile,'#ENDIF');
  617. Writeln(CfgFile,'');
  618. end;
  619. close(CfgFile);
  620. SwitchesMode:=OldSwitchesMode;
  621. end;
  622. procedure ReadSwitches(const fn:string);
  623. var
  624. c : char;
  625. s : string;
  626. res : boolean;
  627. OldSwitchesMode,i : TSwitchMode;
  628. begin
  629. assign(CfgFile,fn);
  630. {$I-}
  631. reset(CfgFile);
  632. {$I+}
  633. if ioresult<>0 then
  634. begin
  635. SetDefaultSwitches;
  636. exit;
  637. end;
  638. OldSwitchesMode:=SwitchesMode;
  639. SwitchesMode:=om_Normal;
  640. while not eof(CfgFile) do
  641. begin
  642. readln(CfgFile,s);
  643. s:=LTrim(s);
  644. if (length(s)>=2) and (s[1]='-') then
  645. begin
  646. c:=s[2];
  647. res:=false;
  648. Delete(s,1,2);
  649. case c of
  650. 'a' : res:=AsmInfoSwitches^.ReadItemsCfg(s);
  651. 'A' : res:=AsmOutputSwitches^.ReadItemsCfg(s);
  652. 'b' : res:=BrowserSwitches^.ReadItemsCfg(s);
  653. 'C' : begin
  654. res:=CodegenSwitches^.ReadItemsCfg(s);
  655. if not res then
  656. res:=MemorySwitches^.ReadItemsCfg(s);
  657. end;
  658. 'd' : res:=ConditionalSwitches^.ReadItemsCfg(s);
  659. 'F' : res:=DirectorySwitches^.ReadItemsCfg(s);
  660. 'g' : res:=DebugInfoSwitches^.ReadItemsCfg(s);
  661. 'O' : begin
  662. res:=true;
  663. if not OptimizationSwitches^.ReadItemsCfg(s) then
  664. if not ProcessorSwitches^.ReadItemsCfg(s) then
  665. res:=OptimizingGoalSwitches^.ReadItemsCfg(s);
  666. end;
  667. 'p' : res:=ProfileInfoSwitches^.ReadItemsCfg(s);
  668. 's' : res:=LinkAfterSwitches^.ReadItemsCfg(s);
  669. 'R' : res:=AsmReaderSwitches^.ReadItemsCfg(s);
  670. 'S' : res:=SyntaxSwitches^.ReadItemsCfg(s);
  671. 'T' : res:=TargetSwitches^.ReadItemsCfg(s);
  672. 'v' : res:=VerboseSwitches^.ReadItemsCfg(s);
  673. 'X' : begin
  674. res:=LibLinkerSwitches^.ReadItemsCfg(s);
  675. if not res then
  676. res:=OtherLinkerSwitches^.ReadItemsCfg(s);
  677. end;
  678. end;
  679. { keep all others as a string }
  680. if not res then
  681. CustomArg[SwitchesMode]:=CustomArg[SwitchesMode]+' -'+c+s;
  682. end
  683. else
  684. if (Copy(s,1,7)='#IFDEF ') then
  685. begin
  686. Delete(s,1,7);
  687. for i:=low(TSwitchMode) to high(TSwitchMode) do
  688. if s=SwitchesModeStr[i] then
  689. begin
  690. SwitchesMode:=i;
  691. break;
  692. end;
  693. end
  694. else;
  695. end;
  696. close(CfgFile);
  697. SwitchesMode:=OldSwitchesMode;
  698. end;
  699. function GetSourceDirectories : string;
  700. var
  701. P : PStringItem;
  702. S : String;
  703. c : char;
  704. function checkitem(P:PSwitchItem):boolean;{$ifndef FPC}far;{$endif}
  705. begin
  706. CheckItem:=(P^.Typ=ot_string) and (P^.Param=c);
  707. end;
  708. begin
  709. GetSourceDirectories:='';
  710. c:='u';
  711. P:=DirectorySwitches^.Items^.FirstThat(@CheckItem);
  712. S:='';
  713. if assigned(P) then
  714. S:=P^.Str[SwitchesMode];
  715. c:='i';
  716. P:=DirectorySwitches^.Items^.FirstThat(@CheckItem);
  717. if assigned(P) then
  718. S:=P^.Str[SwitchesMode]+';'+S;
  719. if S='' then
  720. GetSourceDirectories:=SourceDirs+';'
  721. else
  722. GetSourceDirectories:=SourceDirs+';'+S+';';
  723. end;
  724. {*****************************************************************************
  725. Initialize
  726. *****************************************************************************}
  727. procedure InitSwitches;
  728. var
  729. t : tsystem;
  730. begin
  731. New(SyntaxSwitches,Init('S'));
  732. with SyntaxSwitches^ do
  733. begin
  734. AddBooleanItem(opt_delphi2extensions,'2',idNone);
  735. AddBooleanItem(opt_clikeoperators,'c',idNone);
  736. AddBooleanItem(opt_stopafterfirsterror,'e',idNone);
  737. AddBooleanItem(opt_allowlabelandgoto,'g',idNone);
  738. AddBooleanItem(opt_cplusplusstyledinline,'i',idNone);
  739. AddBooleanItem(opt_globalcmacros,'m',idNone);
  740. AddBooleanItem(opt_tp7compatibility,'o',idNone);
  741. AddBooleanItem(opt_delphicompatibility,'d',idNone);
  742. AddBooleanItem(opt_allowstaticinobjects,'s',idNone);
  743. { Useless as they are not passed to the compiler PM
  744. AddBooleanItem(opt_strictvarstrings,'/',idStrictVarStrings);
  745. AddBooleanItem(opt_extendedsyntax,'/',idExtendedSyntax);
  746. AddBooleanItem(opt_allowmmxoperations,'/',idMMXOps); }
  747. end;
  748. New(VerboseSwitches,Init('v'));
  749. with VerboseSwitches^ do
  750. begin
  751. AddBooleanItem(opt_warnings,'w',idNone);
  752. AddBooleanItem(opt_notes,'n',idNone);
  753. AddBooleanItem(opt_hints,'h',idNone);
  754. AddBooleanItem(opt_generalinfo,'i',idNone);
  755. AddBooleanItem(opt_usedtriedinfo,'ut',idNone);
  756. AddBooleanItem(opt_all,'a',idNone);
  757. AddBooleanItem(opt_showallprocsonerror,'b',idNone);
  758. end;
  759. New(CodegenSwitches,Init('C'));
  760. with CodegenSwitches^ do
  761. begin
  762. AddBooleanItem(opt_rangechecking,'r',idRangeChecks);
  763. AddBooleanItem(opt_stackchecking,'t',idStackChecks);
  764. AddBooleanItem(opt_iochecking,'i',idIOChecks);
  765. AddBooleanItem(opt_overflowchecking,'o',idOverflowChecks);
  766. end;
  767. New(OptimizingGoalSwitches,InitSelect('O'));
  768. with OptimizingGoalSwitches^ do
  769. begin
  770. AddSelectItem(opt_generatefastercode,'G',idNone);
  771. AddSelectItem(opt_generatesmallercode,'g',idNone);
  772. end;
  773. New(OptimizationSwitches,Init('O'));
  774. with OptimizationSwitches^ do
  775. begin
  776. {$ifdef I386}
  777. AddBooleanItem(opt_useregistervariables,'r',idNone);
  778. AddBooleanItem(opt_uncertainoptimizations,'u',idNone);
  779. AddBooleanItem(opt_level1optimizations,'1',idNone);
  780. AddBooleanItem(opt_level2optimizations,'2',idNone);
  781. {$else not I386}
  782. {$ifdef m68k}
  783. AddBooleanItem(opt_level1optimizations,'a',idNone);
  784. AddBooleanItem(opt_useregistervariables,'x',idNone);
  785. {$endif m68k}
  786. {$endif I386}
  787. end;
  788. New(ProcessorSwitches,InitSelect('O'));
  789. with ProcessorSwitches^ do
  790. begin
  791. {$ifdef I386}
  792. AddSelectItem(opt_i386486,'p1',idNone);
  793. AddSelectItem(opt_pentiumandmmx,'p2',idNone);
  794. AddSelectItem(opt_pentiumpro,'p3',idNone);
  795. {$else not I386}
  796. {$ifdef m68k}
  797. AddSelectItem(opt_m68000,'',idNone);
  798. AddSelectItem(opt_m68020,'2',idNone);
  799. {$endif m68k}
  800. {$endif not I386}
  801. end;
  802. New(TargetSwitches,InitSelect('T'));
  803. with TargetSwitches^ do
  804. begin
  805. { better, we've a correct target list without "tilded" names instead a wrong one }
  806. for t:=low(tsystem) to high(tsystem) do
  807. if assigned(targetinfos[t]) then
  808. AddSelectItem(targetinfos[t]^.name,targetinfos[t]^.shortname,idNone);
  809. {$ifdef dummy}
  810. {$ifdef I386}
  811. {AddSelectItem('DOS (GO32V~1~)','go32v1',idNone);}
  812. AddSelectItem('~D~OS (GO32V2)','go32v2',idNone);
  813. AddSelectItem('~F~reeBSD','freebsd',idNone);
  814. AddSelectItem('~L~inux','linux',idNone);
  815. AddSelectItem('~N~etBSD','netbsd',idNone);
  816. AddSelectItem('~O~S/2','os2',idNone);
  817. AddSelectItem('~W~IN32','win32',idNone);
  818. AddSelectItem('N~e~tWare Clib','netware',idNone);
  819. AddSelectItem('O~p~enBSD','openbsd',idNone);
  820. AddSelectItem('Netware Lib~c~','netwlibc',idNone);
  821. {$endif I386}
  822. {$ifdef M68K}
  823. AddSelectItem('~A~miga','amiga',idNone);
  824. AddSelectItem('A~t~ari','atari',idNone);
  825. AddSelectItem('~L~inux','linux',idNone);
  826. AddSelectItem('~N~etBSD','netbsd',idNone);
  827. AddSelectItem('~P~alm OS','palmos',idNone);
  828. {AddSelectItem('~M~ac OS','macos',idNone); }
  829. {$endif M68K}
  830. {$ifdef powerpc}
  831. AddSelectItem('~L~inux','linux',idNone);
  832. AddSelectItem('~N~etBSD','netbsd',idNone);
  833. AddSelectItem('~M~ac OS','macos',idNone);
  834. AddSelectItem('Macos ~X~(Darwin)','darwin',idNone);
  835. {$endif powerpc}
  836. {$endif dummy}
  837. end;
  838. New(AsmReaderSwitches,InitSelect('R'));
  839. with AsmReaderSwitches^ do
  840. begin
  841. {$ifdef I386}
  842. AddSelectItem(opt_directassembler,'direct',idAsmDirect);
  843. AddSelectItem(opt_attassembler,'att',idAsmATT);
  844. AddSelectItem(opt_intelassembler,'intel',idAsmIntel);
  845. {$endif I386}
  846. {$ifdef M68K}
  847. AddSelectItem(opt_motassembler,'mot',idAsmDirect);
  848. {$endif M68K}
  849. end;
  850. New(AsmInfoSwitches,Init('a'));
  851. with AsmInfoSwitches^ do
  852. begin
  853. AddBooleanItem(opt_listsource,'l',idNone);
  854. AddBooleanItem(opt_listregisterallocation,'r',idNone);
  855. AddBooleanItem(opt_listtempallocation,'t',idNone);
  856. end;
  857. New(AsmOutputSwitches,InitSelect('A'));
  858. with AsmOutputSwitches^ do
  859. begin
  860. AddDefaultSelect(opt_usedefaultas);
  861. {$ifdef I386}
  862. AddSelectItem(opt_usegnuas,'as',idNone);
  863. AddSelectItem(opt_usenasmcoff,'nasmcoff',idNone);
  864. AddSelectItem(opt_usenasmelf,'nasmelf',idNone);
  865. AddSelectItem(opt_usenasmobj,'nasmobj',idNone);
  866. AddSelectItem(opt_usemasm,'masm',idNone);
  867. AddSelectItem(opt_usetasm,'tasm',idNone);
  868. AddSelectItem(opt_usecoff,'coff',idNone);
  869. AddSelectItem(opt_usepecoff,'pecoff',idNone);
  870. {$endif I386}
  871. end;
  872. New(BrowserSwitches,InitSelect('b'));
  873. with BrowserSwitches^ do
  874. begin
  875. AddSelectItem(opt_nobrowser,'-',idSymInfNone);
  876. AddSelectItem(opt_globalonlybrowser,'+',idSymInfGlobalOnly);
  877. AddSelectItem(opt_localglobalbrowser,'l',idSymInfGlobalLocal);
  878. end;
  879. New(ConditionalSwitches,Init('d'));
  880. with ConditionalSwitches^ do
  881. begin
  882. AddStringItem(opt_conditionaldefines,'',idNone,true,false);
  883. end;
  884. New(MemorySwitches,Init('C'));
  885. with MemorySwitches^ do
  886. begin
  887. AddLongintItem(opt_stacksize,'s',idStackSize);
  888. AddLongintItem(opt_heapsize,'h',idHeapSize);
  889. end;
  890. New(DirectorySwitches,Init('F'));
  891. with DirectorySwitches^ do
  892. begin
  893. AddStringItem(opt_unitdirectories,'u',idNone,true,true);
  894. AddStringItem(opt_includedirectories,'i',idNone,true,true);
  895. AddStringItem(opt_librarydirectories,'l',idNone,true,true);
  896. AddStringItem(opt_objectdirectories,'o',idNone,true,true);
  897. AddStringItem(opt_exeppudirectories,'E',idNone,true,true);
  898. AddStringItem(opt_ppuoutputdirectory,'U',idNone,true,true);
  899. AddStringItem(opt_cross_tools_directory,'D',idNone,true,true);
  900. end;
  901. New(LibLinkerSwitches,InitSelect('X'));
  902. with LibLinkerSwitches^ do
  903. begin
  904. AddDefaultSelect(opt_librariesdefault);
  905. AddSelectItem(opt_dynamiclibraries,'D',idNone);
  906. AddSelectItem(opt_staticlibraries,'S',idNone);
  907. AddSelectItem(opt_smartlibraries,'X',idNone);
  908. end;
  909. New(OtherLinkerSwitches,Init('X'));
  910. with OtherLinkerSwitches^ do
  911. begin
  912. AddBooleanItem(opt_stripalldebugsymbols,'s',idNone);
  913. AddBooleanItem(opt_forcestaticlibs,'t',idNone);
  914. end;
  915. New(DebugInfoSwitches,InitSelect('g'));
  916. with DebugInfoSwitches^ do
  917. begin
  918. AddSelectItem(opt_nogendebugsymbolinfo,'-',idNone);
  919. AddSelectItem(opt_gendebugsymbolinfo,'',idNone);
  920. AddSelectItem(opt_gensymbolandbacktraceinfo,'l',idNone);
  921. { AddSelectItem('Generate ~d~bx symbol information','d');
  922. does not work anyhow (PM) }
  923. end;
  924. New(LinkAfterSwitches,Init('s'));
  925. LinkAfterSwitches^.AddBooleanItem(opt_linkafter,'',idNone);
  926. New(ProfileInfoSwitches,InitSelect('p'));
  927. with ProfileInfoSwitches^ do
  928. begin
  929. AddSelectItem(opt_noprofileinfo,'-',idNone);
  930. AddSelectItem(opt_gprofinfo,'g',idNone);
  931. end;
  932. {New(MemorySizeSwitches,Init('C'));
  933. with MemorySizeSwitches^ do
  934. begin
  935. AddLongIntItem('~S~tack size','s');
  936. AddLongIntItem('Local ~h~eap size','h');
  937. end;}
  938. SwitchesPath:=LocateFile(SwitchesName);
  939. if SwitchesPath='' then
  940. SwitchesPath:=SwitchesName;
  941. SwitchesPath:=FExpand(SwitchesPath);
  942. end;
  943. procedure SetDefaultSwitches;
  944. var
  945. i,OldSwitchesMode : TSwitchMode;
  946. begin
  947. { setup some useful defaults }
  948. OldSwitchesMode:=SwitchesMode;
  949. for i:=low(TSwitchMode) to high(TSwitchMode) do
  950. begin
  951. SwitchesMode:=i;
  952. {$ifdef i386}
  953. { default is Pentium }
  954. ProcessorSwitches^.SetCurrSel(1);
  955. { AT&T reader }
  956. AsmReaderSwitches^.SetCurrSel(1);
  957. {$endif i386}
  958. { 128k stack }
  959. MemorySwitches^.SetLongintItem(0,65536*2);
  960. { 2 MB heap }
  961. MemorySwitches^.SetLongintItem(1,1024*1024*2);
  962. { goto/lable allowed }
  963. SyntaxSwitches^.SetBooleanItem(3,true);
  964. case i of
  965. om_debug:
  966. begin
  967. { debugging info on }
  968. DebugInfoSwitches^.SetCurrSel(1);
  969. { range checking }
  970. CodegenSwitches^.SetBooleanItem(0,true);
  971. { io checking }
  972. CodegenSwitches^.SetBooleanItem(2,true);
  973. { overflow checking }
  974. CodegenSwitches^.SetBooleanItem(3,true);
  975. end;
  976. om_normal:
  977. begin
  978. OptimizationSwitches^.SetBooleanItem(2,true);
  979. end;
  980. om_release:
  981. begin
  982. OptimizationSwitches^.SetBooleanItem(2,true);
  983. OptimizationSwitches^.SetBooleanItem(3,true);
  984. end;
  985. end;
  986. { set appriopriate default target }
  987. {$ifdef i386}
  988. {$ifdef go32v2}
  989. TargetSwitches^.SetCurrSelParam('go32v2');
  990. {$endif}
  991. {$ifdef linux}
  992. TargetSwitches^.SetCurrSelParam('linux');
  993. {$endif}
  994. {$ifdef freebsd}
  995. TargetSwitches^.SetCurrSelParam('freebsd');
  996. {$endif}
  997. {$ifdef os2}
  998. TargetSwitches^.SetCurrSelParam('os2');
  999. {$endif}
  1000. {$ifdef win32}
  1001. TargetSwitches^.SetCurrSelParam('win32');
  1002. {$endif}
  1003. {$ifdef netwlibc}
  1004. TargetSwitches^.SetCurrSelParam('netwlibc');
  1005. {$else}
  1006. {$ifdef netware}
  1007. TargetSwitches^.SetCurrSelParam('netware');
  1008. {$endif}
  1009. {$endif}
  1010. {$ifdef netbsd}
  1011. TargetSwitches^.SetCurrSelParam('netbsd');
  1012. {$endif}
  1013. {$ifdef openbsd}
  1014. TargetSwitches^.SetCurrSelParam('openbsd');
  1015. {$endif}
  1016. {$endif i386}
  1017. {$ifdef m68k}
  1018. {$ifdef linux}
  1019. TargetSwitches^.SetCurrSelParam('linux');
  1020. {$endif linux}
  1021. {$endif m68k}
  1022. {$ifdef powerpc}
  1023. {$ifdef linux}
  1024. TargetSwitches^.SetCurrSelParam('linux');
  1025. {$endif linux}
  1026. {$ifdef Darwin}
  1027. TargetSwitches^.SetCurrSelParam('darwin');
  1028. {$endif}
  1029. {$endif powerpc}
  1030. end;
  1031. SwitchesMode:=OldSwitchesMode;
  1032. end;
  1033. procedure DoneSwitches;
  1034. begin
  1035. dispose(SyntaxSwitches,Done);
  1036. dispose(VerboseSwitches,Done);
  1037. dispose(CodegenSwitches,Done);
  1038. dispose(OptimizationSwitches,Done);
  1039. dispose(OptimizingGoalSwitches,Done);
  1040. dispose(ProcessorSwitches,Done);
  1041. dispose(BrowserSwitches,Done);
  1042. dispose(TargetSwitches,Done);
  1043. dispose(AsmReaderSwitches,Done);
  1044. dispose(AsmOutputSwitches,Done);
  1045. dispose(AsmInfoSwitches,Done);
  1046. dispose(ConditionalSwitches,Done);
  1047. dispose(MemorySwitches,Done);
  1048. {dispose(MemorySizeSwitches,Done);}
  1049. dispose(DirectorySwitches,Done);
  1050. dispose(DebugInfoSwitches,Done);
  1051. dispose(LibLinkerSwitches,Done);
  1052. dispose(LinkAfterSwitches,Done);
  1053. dispose(OtherLinkerSwitches,Done);
  1054. dispose(ProfileInfoSwitches,Done);
  1055. end;
  1056. procedure GetCompilerOptionLines(C: PUnsortedStringCollection);
  1057. procedure AddLine(const S: string);
  1058. begin
  1059. C^.Insert(NewStr(S));
  1060. end;
  1061. procedure ConstructSwitchModeDirectives(SM: TSwitchMode; const IfDefSym: string);
  1062. var SwitchParams: PStringCollection;
  1063. MiscParams : PStringCollection;
  1064. procedure AddSwitch(const S: string);
  1065. begin
  1066. SwitchParams^.Insert(NewStr(S));
  1067. end;
  1068. procedure AddParam(const S: string);
  1069. begin
  1070. MiscParams^.Insert(NewStr(S));
  1071. end;
  1072. procedure EnumSwitches(P: PSwitches);
  1073. procedure HandleSwitch(P: PSwitchItem); {$ifndef FPC}far;{$endif}
  1074. begin
  1075. case P^.ParamID of
  1076. { idAlign :}
  1077. idRangeChecks : AddSwitch('R'+P^.GetSwitchStr(SM));
  1078. idStackChecks : AddSwitch('S'+P^.GetSwitchStr(SM));
  1079. idIOChecks : AddSwitch('I'+P^.GetSwitchStr(SM));
  1080. idOverflowChecks : AddSwitch('Q'+P^.GetSwitchStr(SM));
  1081. { idAsmDirect : if P^.GetParamValueBool[SM] then AddParam('ASMMODE DIRECT');
  1082. idAsmATT : if P^.GetParamValueBool[SM] then AddParam('ASMMODE ATT');
  1083. idAsmIntel : if P^.GetParamValueBool[SM] then AddParam('ASMMODE INTEL');
  1084. idAsmMot : if P^.GetParamValueBool[SM] then AddParam('ASMMODE MOT');}
  1085. { idSymInfNone : ;
  1086. idSymInfGlobalOnly:;
  1087. idSymInfGlobalLocal:if P^.ParamValueBool(SM) then AddSwitch('L+');}
  1088. { idStackSize
  1089. idHeapSize}
  1090. idStrictVarStrings: AddSwitch('V'+P^.GetSwitchStr(SM));
  1091. idExtendedSyntax : AddSwitch('X'+P^.GetSwitchStr(SM));
  1092. idMMXOps : if P^.ParamValueBool(SM) then AddParam('MMX');
  1093. idTypedAddress : AddSwitch('T'+P^.GetSwitchStr(SM));
  1094. { idPackRecords
  1095. idPackEnum}
  1096. idStackFrames : AddSwitch('W'+P^.GetSwitchStr(SM));
  1097. idReferenceInfo : AddSwitch('Y'+P^.GetSwitchStr(SM));
  1098. idDebugInfo : AddSwitch('D'+P^.GetSwitchStr(SM));
  1099. idBoolEval : AddSwitch('B'+P^.GetSwitchStr(SM));
  1100. idLongString : AddSwitch('H'+P^.GetSwitchStr(SM));
  1101. idTypeInfo : AddSwitch('M'+P^.GetSwitchStr(SM));
  1102. end;
  1103. end;
  1104. begin
  1105. P^.Items^.ForEach(@HandleSwitch);
  1106. end;
  1107. var I: integer;
  1108. S: string;
  1109. begin
  1110. AddLine('{$IFDEF '+IfDefSym+'}');
  1111. New(SwitchParams, Init(10,10));
  1112. New(MiscParams, Init(10,10));
  1113. EnumSwitches(LibLinkerSwitches);
  1114. EnumSwitches(OtherLinkerSwitches);
  1115. EnumSwitches(DebugInfoSwitches);
  1116. EnumSwitches(ProfileInfoSwitches);
  1117. EnumSwitches(SyntaxSwitches);
  1118. EnumSwitches(VerboseSwitches);
  1119. EnumSwitches(CodegenSwitches);
  1120. EnumSwitches(OptimizationSwitches);
  1121. EnumSwitches(OptimizingGoalSwitches);
  1122. EnumSwitches(ProcessorSwitches);
  1123. EnumSwitches(AsmReaderSwitches);
  1124. EnumSwitches(AsmInfoSwitches);
  1125. EnumSwitches(AsmOutputSwitches);
  1126. EnumSwitches(TargetSwitches);
  1127. EnumSwitches(ConditionalSwitches);
  1128. EnumSwitches(MemorySwitches);
  1129. EnumSwitches(BrowserSwitches);
  1130. EnumSwitches(DirectorySwitches);
  1131. S:='';
  1132. for I:=0 to SwitchParams^.Count-1 do
  1133. begin
  1134. if I=0 then S:='{$' else S:=S+',';
  1135. S:=S+PString(SwitchParams^.At(I))^;
  1136. end;
  1137. if S<>'' then S:=S+'}';
  1138. if S<>'' then AddLine(' '+S);
  1139. for I:=0 to MiscParams^.Count-1 do
  1140. AddLine(' {$'+PString(MiscParams^.At(I))^+'}');
  1141. Dispose(SwitchParams, Done); Dispose(MiscParams, Done);
  1142. AddLine('{$ENDIF '+IfDefSym+'}');
  1143. end;
  1144. var SM: TSwitchMode;
  1145. begin
  1146. for SM:=Low(TSwitchMode) to High(TSwitchMode) do
  1147. ConstructSwitchModeDirectives(SM,SwitchesModeStr[SM]);
  1148. end;
  1149. end.
  1150. {
  1151. $Log$
  1152. Revision 1.19 2004-11-14 21:45:29 florian
  1153. * fixed non working mouse after tools call
  1154. * better handling of source/target info
  1155. * more info in about dialog
  1156. * better info in compiler status dialiog
  1157. Revision 1.18 2004/11/03 12:05:54 florian
  1158. + supported targets are now read dynamically from the included compiler
  1159. Revision 1.17 2004/09/14 20:46:13 hajny
  1160. * compilation fix - for loop counter issues
  1161. Revision 1.16 2004/09/04 23:33:39 armin
  1162. * makefiles regenerated
  1163. * ide: added target netwlibc
  1164. Revision 1.15 2004/03/08 00:07:26 marco
  1165. * Darwin target added
  1166. Revision 1.14 2003/02/09 23:50:10 pierre
  1167. + i386 openbsd target added
  1168. Revision 1.13 2002/12/15 14:08:29 peter
  1169. * more stable default target setting
  1170. Revision 1.12 2002/11/30 01:56:52 pierre
  1171. + powerpc cpu support started
  1172. Revision 1.11 2002/11/21 00:37:56 pierre
  1173. + some cross gdb enhancements
  1174. Revision 1.10 2002/09/07 15:40:45 peter
  1175. * old logs removed and tabs fixed
  1176. Revision 1.9 2002/06/01 20:08:42 marco
  1177. * Renamefest
  1178. Revision 1.8 2002/04/11 06:42:54 pierre
  1179. * Add allow spaces for directories entries
  1180. Revision 1.7 2002/04/10 22:41:05 pierre
  1181. * remove switches that have no command line option
  1182. Revision 1.6 2002/03/16 14:53:23 armin
  1183. + add netware target
  1184. Revision 1.5 2002/02/20 15:06:52 pierre
  1185. avoid to insert options in .cfg file if the option has no command line
  1186. }