options.pas 78 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465
  1. {
  2. Copyright (c) 1998-2002 by Florian Klaempfl and Peter Vreman
  3. Reads command line options and config files
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  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. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. ****************************************************************************
  16. }
  17. unit options;
  18. {$i fpcdefs.inc}
  19. interface
  20. uses
  21. CClasses,cfileutl,
  22. globtype,globals,verbose,systems,cpuinfo, comprsrc;
  23. Type
  24. TOption=class
  25. FirstPass,
  26. ParaLogo,
  27. NoPressEnter,
  28. LogoWritten : boolean;
  29. FileLevel : longint;
  30. QuickInfo : string;
  31. ParaIncludePath,
  32. ParaUnitPath,
  33. ParaObjectPath,
  34. ParaLibraryPath,
  35. ParaFrameworkPath : TSearchPathList;
  36. ParaAlignment : TAlignmentInfo;
  37. Constructor Create;
  38. Destructor Destroy;override;
  39. procedure WriteLogo;
  40. procedure WriteInfo;
  41. procedure WriteHelpPages;
  42. procedure WriteQuickInfo;
  43. procedure IllegalPara(const opt:string);
  44. function Unsetbool(var Opts:TCmdStr; Pos: Longint):boolean;
  45. procedure interpret_option(const opt :string;ispara:boolean);
  46. procedure Interpret_envvar(const envname : string);
  47. procedure Interpret_file(const filename : string);
  48. procedure Read_Parameters;
  49. procedure parsecmd(cmd:string);
  50. procedure TargetDefines(def:boolean);
  51. end;
  52. TOptionClass=class of toption;
  53. var
  54. coption : TOptionClass;
  55. procedure read_arguments(cmd:string);
  56. implementation
  57. uses
  58. widestr,
  59. charset,
  60. SysUtils,
  61. version,
  62. cutils,cmsgs,
  63. comphook,
  64. symtable,scanner,rabase
  65. ;
  66. const
  67. page_size = 24;
  68. var
  69. option : toption;
  70. read_configfile, { read config file, set when a cfgfile is found }
  71. disable_configfile : boolean;
  72. fpcdir,
  73. ppccfg,
  74. ppcaltcfg,
  75. param_file : string; { file to compile specified on the commandline }
  76. {****************************************************************************
  77. Defines
  78. ****************************************************************************}
  79. procedure set_default_link_type;
  80. begin
  81. undef_system_macro('FPC_LINK_SMART');
  82. def_system_macro('FPC_LINK_STATIC');
  83. undef_system_macro('FPC_LINK_DYNAMIC');
  84. init_settings.globalswitches:=init_settings.globalswitches+[cs_link_static];
  85. init_settings.globalswitches:=init_settings.globalswitches-[cs_link_shared,cs_link_smart];
  86. end;
  87. {****************************************************************************
  88. Toption
  89. ****************************************************************************}
  90. procedure StopOptions(err:longint);
  91. begin
  92. if assigned(Option) then
  93. begin
  94. Option.free;
  95. Option:=nil;
  96. end;
  97. raise ECompilerAbortSilent.Create;
  98. end;
  99. procedure Toption.WriteLogo;
  100. var
  101. p : pchar;
  102. begin
  103. if not LogoWritten then
  104. begin
  105. p:=MessagePchar(option_logo);
  106. while assigned(p) do
  107. Comment(V_Normal,GetMsgLine(p));
  108. LogoWritten:= true;
  109. end;
  110. end;
  111. procedure Toption.WriteInfo;
  112. var
  113. p : pchar;
  114. hs,hs1,s : TCmdStr;
  115. target : tsystem;
  116. cpu : tcputype;
  117. fpu : tfputype;
  118. opt : toptimizerswitch;
  119. begin
  120. p:=MessagePchar(option_info);
  121. while assigned(p) do
  122. begin
  123. s:=GetMsgLine(p);
  124. { list OS Targets }
  125. if pos('$OSTARGETS',s)>0 then
  126. begin
  127. for target:=low(tsystem) to high(tsystem) do
  128. if assigned(targetinfos[target]) then
  129. begin
  130. hs:=s;
  131. hs1:=targetinfos[target]^.name;
  132. if tf_under_development in targetinfos[target]^.flags then
  133. hs1:=hs1+' (under development)';
  134. Replace(hs,'$OSTARGETS',hs1);
  135. Comment(V_Normal,hs);
  136. end;
  137. end
  138. else if pos('$INSTRUCTIONSETS',s)>0 then
  139. begin
  140. for cpu:=low(tcputype) to high(tcputype) do
  141. begin
  142. hs:=s;
  143. hs1:=cputypestr[cpu];
  144. if hs1<>'' then
  145. begin
  146. Replace(hs,'$INSTRUCTIONSETS',hs1);
  147. Comment(V_Normal,hs);
  148. end;
  149. end;
  150. end
  151. else if pos('$FPUINSTRUCTIONSETS',s)>0 then
  152. begin
  153. for fpu:=low(tfputype) to high(tfputype) do
  154. begin
  155. hs:=s;
  156. hs1:=fputypestr[fpu];
  157. if hs1<>'' then
  158. begin
  159. Replace(hs,'$FPUINSTRUCTIONSETS',hs1);
  160. Comment(V_Normal,hs);
  161. end;
  162. end;
  163. end
  164. else if pos('$OPTIMIZATIONS',s)>0 then
  165. begin
  166. for opt:=low(toptimizerswitch) to high(toptimizerswitch) do
  167. begin
  168. if opt in supported_optimizerswitches then
  169. begin
  170. hs:=s;
  171. hs1:=OptimizerSwitchStr[opt];
  172. if hs1<>'' then
  173. begin
  174. Replace(hs,'$OPTIMIZATIONS',hs1);
  175. Comment(V_Normal,hs);
  176. end;
  177. end;
  178. end;
  179. end
  180. else
  181. Comment(V_Normal,s);
  182. end;
  183. StopOptions(0);
  184. end;
  185. procedure Toption.WriteHelpPages;
  186. function PadEnd(s:string;i:longint):string;
  187. begin
  188. while (length(s)<i) do
  189. s:=s+' ';
  190. PadEnd:=s;
  191. end;
  192. var
  193. lastident,
  194. j,outline,
  195. ident,
  196. lines : longint;
  197. show : boolean;
  198. opt : string[32];
  199. input,
  200. s : string;
  201. p : pchar;
  202. begin
  203. WriteLogo;
  204. Lines:=4;
  205. Message1(option_usage,FixFileName(system.paramstr(0)));
  206. lastident:=0;
  207. p:=MessagePChar(option_help_pages);
  208. while assigned(p) do
  209. begin
  210. { get a line and reset }
  211. s:=GetMsgLine(p);
  212. ident:=0;
  213. show:=false;
  214. { parse options }
  215. case s[1] of
  216. {$ifdef UNITALIASES}
  217. 'a',
  218. {$endif}
  219. {$ifdef EXTDEBUG}
  220. 'e',
  221. {$endif EXTDEBUG}
  222. {$ifdef i386}
  223. '3',
  224. {$endif}
  225. {$ifdef x86_64}
  226. '4',
  227. {$endif}
  228. {$ifdef m68k}
  229. '6',
  230. {$endif}
  231. {$ifdef arm}
  232. 'A',
  233. {$endif}
  234. {$ifdef powerpc}
  235. 'P',
  236. {$endif}
  237. {$ifdef powerpc64}
  238. 'p',
  239. {$endif}
  240. {$ifdef sparc}
  241. 'S',
  242. {$endif}
  243. {$ifdef vis}
  244. 'V',
  245. {$endif}
  246. '*' : show:=true;
  247. end;
  248. if show then
  249. begin
  250. case s[2] of
  251. 'g',
  252. {$ifdef Unix}
  253. 'L',
  254. {$endif}
  255. {$ifdef os2}
  256. 'O',
  257. {$endif}
  258. '*' : show:=true;
  259. else
  260. show:=false;
  261. end;
  262. end;
  263. { now we may show the message or not }
  264. if show then
  265. begin
  266. case s[3] of
  267. '0' : begin
  268. ident:=0;
  269. outline:=0;
  270. end;
  271. '1' : begin
  272. ident:=2;
  273. outline:=7;
  274. end;
  275. '2' : begin
  276. ident:=6;
  277. outline:=11;
  278. end;
  279. '3' : begin
  280. ident:=9;
  281. outline:=11;
  282. end;
  283. end;
  284. j:=pos('_',s);
  285. opt:=Copy(s,4,j-4);
  286. if opt='*' then
  287. opt:=''
  288. else
  289. if opt=' ' then
  290. opt:=PadEnd(opt,outline)
  291. else
  292. opt:=PadEnd('-'+opt,outline);
  293. if (ident=0) and (lastident<>0) then
  294. begin
  295. Comment(V_Normal,'');
  296. inc(Lines);
  297. end;
  298. { page full ? }
  299. if (lines >= page_size - 1) then
  300. begin
  301. if not NoPressEnter then
  302. begin
  303. Message(option_help_press_enter);
  304. readln(input);
  305. if upper(input)='Q' then
  306. StopOptions(0);
  307. end;
  308. lines:=0;
  309. end;
  310. Comment(V_Normal,PadEnd('',ident)+opt+Copy(s,j+1,255));
  311. LastIdent:=Ident;
  312. inc(Lines);
  313. end;
  314. end;
  315. StopOptions(0);
  316. end;
  317. procedure Toption.IllegalPara(const opt:string);
  318. begin
  319. Message1(option_illegal_para,opt);
  320. Message(option_help_pages_para);
  321. StopOptions(1);
  322. end;
  323. function Toption.Unsetbool(var Opts:TCmdStr; Pos: Longint):boolean;
  324. { checks if the character after pos in Opts is a + or a - and returns resp.
  325. false or true. If it is another character (or none), it also returns false }
  326. begin
  327. UnsetBool := false;
  328. if Length(Opts)>Pos then
  329. begin
  330. inc(Pos);
  331. UnsetBool := Opts[Pos] = '-';
  332. if Opts[Pos] in ['-','+']then
  333. delete(Opts,Pos,1);
  334. end;
  335. end;
  336. procedure TOption.interpret_option(const opt:string;ispara:boolean);
  337. var
  338. code : integer;
  339. c : char;
  340. more : TCmdStr;
  341. major,minor : longint;
  342. error : integer;
  343. j,l : longint;
  344. d,s : TCmdStr;
  345. unicodemapping : punicodemap;
  346. begin
  347. if opt='' then
  348. exit;
  349. { only parse define,undef,target,verbosity,link etc options the firsttime }
  350. if firstpass and
  351. not(
  352. (opt[1]='-') and
  353. (
  354. ((length(opt)>1) and (opt[2] in ['i','d','v','T','u','n','X','l'])) or
  355. ((length(opt)>3) and (opt[2]='F') and (opt[3]='e'))
  356. )
  357. ) then
  358. exit;
  359. Message1(option_handling_option,opt);
  360. case opt[1] of
  361. '-' :
  362. begin
  363. more:=Copy(opt,3,255);
  364. if firstpass then
  365. Message1(option_interpreting_firstpass_option,opt)
  366. else
  367. Message1(option_interpreting_option,opt);
  368. case opt[2] of
  369. '?' :
  370. WriteHelpPages;
  371. 'a' :
  372. begin
  373. include(init_settings.globalswitches,cs_asm_leave);
  374. j:=1;
  375. while j<=length(more) do
  376. begin
  377. case more[j] of
  378. 'l' :
  379. include(init_settings.globalswitches,cs_asm_source);
  380. 'r' :
  381. include(init_settings.globalswitches,cs_asm_regalloc);
  382. 't' :
  383. include(init_settings.globalswitches,cs_asm_tempalloc);
  384. 'n' :
  385. include(init_settings.globalswitches,cs_asm_nodes);
  386. 'p' :
  387. begin
  388. exclude(init_settings.globalswitches,cs_asm_leave);
  389. if UnsetBool(More, 0) then
  390. exclude(init_settings.globalswitches,cs_asm_pipe)
  391. else
  392. include(init_settings.globalswitches,cs_asm_pipe);
  393. end;
  394. '-' :
  395. init_settings.globalswitches:=init_settings.globalswitches -
  396. [cs_asm_leave, cs_asm_source,cs_asm_regalloc, cs_asm_tempalloc,
  397. cs_asm_nodes, cs_asm_pipe];
  398. else
  399. IllegalPara(opt);
  400. end;
  401. inc(j);
  402. end;
  403. end;
  404. 'A' :
  405. begin
  406. paratargetasm:=find_asm_by_string(More);
  407. if paratargetasm=as_none then
  408. IllegalPara(opt);
  409. end;
  410. 'b' :
  411. begin
  412. // Message1(option_obsolete_switch,'-b');
  413. if UnsetBool(More,0) then
  414. begin
  415. init_settings.moduleswitches:=init_settings.moduleswitches-[cs_browser];
  416. init_settings.moduleswitches:=init_settings.moduleswitches-[cs_local_browser];
  417. end
  418. else
  419. begin
  420. init_settings.moduleswitches:=init_settings.moduleswitches+[cs_browser];
  421. end;
  422. if More<>'' then
  423. if (More='l') or (More='l+') then
  424. init_settings.moduleswitches:=init_settings.moduleswitches+[cs_local_browser]
  425. else if More='l-' then
  426. init_settings.moduleswitches:=init_settings.moduleswitches-[cs_local_browser]
  427. else
  428. IllegalPara(opt);
  429. end;
  430. 'B' :
  431. do_build:=not UnSetBool(more,0);
  432. 'C' :
  433. begin
  434. j:=1;
  435. while j<=length(more) do
  436. begin
  437. case more[j] of
  438. 'c' :
  439. begin
  440. if not SetAktProcCall(upper(copy(more,j+1,length(more)-j)),init_settings.defproccall) then
  441. IllegalPara(opt);
  442. break;
  443. end;
  444. {$ifdef cpufpemu}
  445. 'e' :
  446. begin
  447. If UnsetBool(More, j) then
  448. exclude(init_settings.moduleswitches,cs_fp_emulation)
  449. Else
  450. include(init_settings.moduleswitches,cs_fp_emulation);
  451. end;
  452. {$endif cpufpemu}
  453. 'f' :
  454. begin
  455. s:=upper(copy(more,j+1,length(more)-j));
  456. if not(SetFpuType(s,init_settings.fputype)) then
  457. IllegalPara(opt);
  458. break;
  459. end;
  460. 'F' :
  461. begin
  462. if not SetMinFPConstPrec(copy(more,j+1,length(more)-j),init_settings.minfpconstprec) then
  463. IllegalPara(opt);
  464. break;
  465. end;
  466. 'g' :
  467. if tf_no_pic_supported in target_info.flags then
  468. message(scan_w_pic_ignored)
  469. else
  470. include(init_settings.moduleswitches,cs_create_pic);
  471. 'h' :
  472. begin
  473. val(copy(more,j+1,length(more)-j),heapsize,code);
  474. if (code<>0) or (heapsize<1024) then
  475. IllegalPara(opt);
  476. break;
  477. end;
  478. 'i' :
  479. If UnsetBool(More, j) then
  480. exclude(init_settings.localswitches,cs_check_io)
  481. else
  482. include(init_settings.localswitches,cs_check_io);
  483. 'n' :
  484. If UnsetBool(More, j) then
  485. exclude(init_settings.globalswitches,cs_link_nolink)
  486. Else
  487. include(init_settings.globalswitches,cs_link_nolink);
  488. 'o' :
  489. If UnsetBool(More, j) then
  490. exclude(init_settings.localswitches,cs_check_overflow)
  491. Else
  492. include(init_settings.localswitches,cs_check_overflow);
  493. 'p' :
  494. begin
  495. s:=upper(copy(more,j+1,length(more)-j));
  496. if not(Setcputype(s,init_settings.cputype)) then
  497. IllegalPara(opt);
  498. break;
  499. end;
  500. 'P':
  501. begin
  502. delete(more,1,1);
  503. if upper(copy(more,1,pos('=',more)-1))='PACKSET' then
  504. begin
  505. delete(more,1,pos('=',more));
  506. if more='0' then
  507. init_settings.setalloc:=0
  508. else if (more='1') or (more='DEFAULT') or (more='NORMAL') then
  509. init_settings.setalloc:=1
  510. else if more='2' then
  511. init_settings.setalloc:=2
  512. else if more='4' then
  513. init_settings.setalloc:=4
  514. else if more='8' then
  515. init_settings.setalloc:=8
  516. else
  517. IllegalPara(opt);
  518. end
  519. else
  520. IllegalPara(opt);
  521. end;
  522. 'r' :
  523. If UnsetBool(More, j) then
  524. exclude(init_settings.localswitches,cs_check_range)
  525. Else
  526. include(init_settings.localswitches,cs_check_range);
  527. 'R' :
  528. If UnsetBool(More, j) then
  529. begin
  530. exclude(init_settings.localswitches,cs_check_range);
  531. exclude(init_settings.localswitches,cs_check_object);
  532. end
  533. Else
  534. begin
  535. include(init_settings.localswitches,cs_check_range);
  536. include(init_settings.localswitches,cs_check_object);
  537. end;
  538. 's' :
  539. begin
  540. val(copy(more,j+1,length(more)-j),stacksize,code);
  541. if (code<>0) or (stacksize>=67107840) or (stacksize<1024) then
  542. IllegalPara(opt);
  543. break;
  544. end;
  545. 't' :
  546. If UnsetBool(More, j) then
  547. exclude(init_settings.localswitches,cs_check_stack)
  548. Else
  549. include(init_settings.localswitches,cs_check_stack);
  550. 'D' :
  551. If UnsetBool(More, j) then
  552. exclude(init_settings.moduleswitches,cs_create_dynamic)
  553. Else
  554. include(init_settings.moduleswitches,cs_create_dynamic);
  555. 'X' :
  556. If UnsetBool(More, j) then
  557. exclude(init_settings.moduleswitches,cs_create_smart)
  558. Else
  559. include(init_settings.moduleswitches,cs_create_smart);
  560. else
  561. IllegalPara(opt);
  562. end;
  563. inc(j);
  564. end;
  565. end;
  566. 'd' :
  567. if more <> '' then
  568. begin
  569. l:=Pos(':=',more);
  570. if l>0 then
  571. set_system_compvar(Copy(more,1,l-1),Copy(more,l+2,255))
  572. else
  573. def_system_macro(more);
  574. end;
  575. 'D' :
  576. begin
  577. include(init_settings.globalswitches,cs_link_deffile);
  578. j:=1;
  579. while j<=length(more) do
  580. begin
  581. case more[j] of
  582. 'd' :
  583. begin
  584. description:=Copy(more,j+1,255);
  585. break;
  586. end;
  587. 'v' :
  588. begin
  589. dllversion:=Copy(more,j+1,255);
  590. l:=pos('.',dllversion);
  591. dllminor:=0;
  592. error:=0;
  593. if l>0 then
  594. begin
  595. val(copy(dllversion,l+1,255),minor,error);
  596. if (error=0) and
  597. (minor>=0) and (minor<=$ffff) then
  598. dllminor:=minor
  599. else
  600. if error=0 then
  601. error:=1;
  602. end;
  603. if l=0 then
  604. l:=256;
  605. dllmajor:=1;
  606. if error=0 then
  607. val(copy(dllversion,1,l-1),major,error);
  608. if (error=0) and (major>=0) and (major<=$ffff) then
  609. dllmajor:=major
  610. else
  611. if error=0 then
  612. error:=1;
  613. if error<>0 then
  614. Message1(scan_w_wrong_version_ignored,dllversion);
  615. break;
  616. end;
  617. 'w' :
  618. usewindowapi:=true;
  619. '-' :
  620. begin
  621. exclude(init_settings.globalswitches,cs_link_deffile);
  622. usewindowapi:=false;
  623. end;
  624. else
  625. IllegalPara(opt);
  626. end;
  627. inc(j);
  628. end;
  629. end;
  630. 'e' :
  631. exepath:=FixPath(More,true);
  632. 'E' :
  633. begin
  634. if UnsetBool(More, 0) then
  635. exclude(init_settings.globalswitches,cs_link_nolink)
  636. else
  637. include(init_settings.globalswitches,cs_link_nolink);
  638. end;
  639. 'f' :
  640. begin
  641. if more='PIC' then
  642. begin
  643. if tf_no_pic_supported in target_info.flags then
  644. message(scan_w_pic_ignored)
  645. else
  646. include(init_settings.moduleswitches,cs_create_pic)
  647. end
  648. else
  649. IllegalPara(opt);
  650. end;
  651. 'F' :
  652. begin
  653. if more='' then
  654. IllegalPara(opt);
  655. c:=more[1];
  656. Delete(more,1,1);
  657. DefaultReplacements(More);
  658. case c of
  659. 'a' :
  660. autoloadunits:=more;
  661. 'c' :
  662. begin
  663. if (upper(more)='UTF8') or (upper(more)='UTF-8') then
  664. init_settings.sourcecodepage:='utf8'
  665. else if not(cpavailable(more)) then
  666. Message1(option_code_page_not_available,more)
  667. else
  668. init_settings.sourcecodepage:=more;
  669. end;
  670. 'C' :
  671. RCCompiler := More;
  672. 'D' :
  673. utilsdirectory:=FixPath(More,true);
  674. 'e' :
  675. SetRedirectFile(More);
  676. 'E' :
  677. OutputExeDir:=FixPath(More,true);
  678. 'f' :
  679. if (target_info.system in systems_darwin) then
  680. if ispara then
  681. ParaFrameworkPath.AddPath(More,false)
  682. else
  683. frameworksearchpath.AddPath(More,true)
  684. else
  685. IllegalPara(opt);
  686. 'i' :
  687. begin
  688. if ispara then
  689. ParaIncludePath.AddPath(More,false)
  690. else
  691. includesearchpath.AddPath(More,true);
  692. end;
  693. 'm' :
  694. begin
  695. unicodemapping:=loadunicodemapping(More,More+'.txt');
  696. if assigned(unicodemapping) then
  697. registermapping(unicodemapping)
  698. else
  699. IllegalPara(opt);
  700. end;
  701. 'g' :
  702. Message2(option_obsolete_switch_use_new,'-Fg','-Fl');
  703. 'l' :
  704. begin
  705. if ispara then
  706. ParaLibraryPath.AddPath(More,false)
  707. else
  708. LibrarySearchPath.AddPath(More,true);
  709. end;
  710. 'L' :
  711. begin
  712. if More<>'' then
  713. ParaDynamicLinker:=More
  714. else
  715. IllegalPara(opt);
  716. end;
  717. 'o' :
  718. begin
  719. if ispara then
  720. ParaObjectPath.AddPath(More,false)
  721. else
  722. ObjectSearchPath.AddPath(More,true);
  723. end;
  724. 'r' :
  725. Msgfilename:=More;
  726. 'R' :
  727. ResCompiler := More;
  728. 'u' :
  729. begin
  730. if ispara then
  731. ParaUnitPath.AddPath(More,false)
  732. else
  733. unitsearchpath.AddPath(More,true);
  734. end;
  735. 'U' :
  736. OutputUnitDir:=FixPath(More,true);
  737. else
  738. IllegalPara(opt);
  739. end;
  740. end;
  741. 'g' :
  742. begin
  743. if UnsetBool(More, 0) then
  744. begin
  745. exclude(init_settings.moduleswitches,cs_debuginfo);
  746. exclude(init_settings.globalswitches,cs_use_heaptrc);
  747. exclude(init_settings.globalswitches,cs_use_lineinfo);
  748. exclude(init_settings.localswitches,cs_checkpointer);
  749. localvartrashing := -1;
  750. end
  751. else
  752. begin
  753. include(init_settings.moduleswitches,cs_debuginfo);
  754. if paratargetdbg=dbg_none then
  755. paratargetdbg:=target_info.dbg;
  756. end;
  757. if not RelocSectionSetExplicitly then
  758. RelocSection:=false;
  759. j:=1;
  760. while j<=length(more) do
  761. begin
  762. case more[j] of
  763. 'c' :
  764. begin
  765. if UnsetBool(More, j) then
  766. exclude(init_settings.localswitches,cs_checkpointer)
  767. else
  768. include(init_settings.localswitches,cs_checkpointer);
  769. end;
  770. 'd' :
  771. begin
  772. paratargetdbg:=dbg_dwarf2;
  773. end;
  774. 'h' :
  775. begin
  776. if UnsetBool(More, j) then
  777. exclude(init_settings.globalswitches,cs_use_heaptrc)
  778. else
  779. include(init_settings.globalswitches,cs_use_heaptrc);
  780. end;
  781. 'l' :
  782. begin
  783. if UnsetBool(More, j) then
  784. exclude(init_settings.globalswitches,cs_use_lineinfo)
  785. else
  786. include(init_settings.globalswitches,cs_use_lineinfo);
  787. end;
  788. 'p' :
  789. begin
  790. if UnsetBool(More, j) then
  791. exclude(init_settings.globalswitches,cs_stabs_preservecase)
  792. else
  793. include(init_settings.globalswitches,cs_stabs_preservecase);
  794. end;
  795. 's' :
  796. begin
  797. paratargetdbg:=dbg_stabs;
  798. end;
  799. 't' :
  800. begin
  801. if UnsetBool(More, j) then
  802. localvartrashing := -1
  803. else
  804. localvartrashing := (localvartrashing + 1) mod nroftrashvalues;
  805. end;
  806. 'v' :
  807. begin
  808. if UnsetBool(More, j) then
  809. exclude(init_settings.globalswitches,cs_gdb_valgrind)
  810. else
  811. include(init_settings.globalswitches,cs_gdb_valgrind);
  812. end;
  813. 'w' :
  814. begin
  815. if (j<length(more)) and (more[j+1] in ['2','3']) then
  816. begin
  817. case more[j+1] of
  818. '2': paratargetdbg:=dbg_dwarf2;
  819. '3': paratargetdbg:=dbg_dwarf3;
  820. end;
  821. inc(j);
  822. end
  823. else
  824. paratargetdbg:=dbg_dwarf2;
  825. end;
  826. else
  827. IllegalPara(opt);
  828. end;
  829. inc(j);
  830. end;
  831. end;
  832. 'h' :
  833. begin
  834. NoPressEnter:=true;
  835. WriteHelpPages;
  836. end;
  837. 'i' :
  838. begin
  839. if More='' then
  840. WriteInfo
  841. else
  842. QuickInfo:=QuickInfo+More;
  843. end;
  844. 'I' :
  845. begin
  846. if ispara then
  847. ParaIncludePath.AddPath(More,false)
  848. else
  849. includesearchpath.AddPath(More,false);
  850. end;
  851. 'k' :
  852. begin
  853. if more<>'' then
  854. ParaLinkOptions:=ParaLinkOptions+' '+More
  855. else
  856. IllegalPara(opt);
  857. end;
  858. 'l' :
  859. if not UnSetBool(more,0) then
  860. ParaLogo:=true;
  861. 'm' :
  862. parapreprocess:=not UnSetBool(more,0);
  863. 'M' :
  864. begin
  865. more:=Upper(more);
  866. if not SetCompileMode(more, true) then
  867. IllegalPara(opt);
  868. end;
  869. 'n' :
  870. begin
  871. if More='' then
  872. disable_configfile:=true
  873. else
  874. IllegalPara(opt);
  875. end;
  876. 'o' :
  877. begin
  878. if More<>'' then
  879. begin
  880. DefaultReplacements(More);
  881. D:=ExtractFilePath(More);
  882. if (D<>'') then
  883. OutputExeDir:=FixPath(D,True);
  884. OutputFileName:=ExtractFileName(More);
  885. end
  886. else
  887. IllegalPara(opt);
  888. end;
  889. 'O' :
  890. begin
  891. j:=1;
  892. while j<=length(more) do
  893. begin
  894. case more[j] of
  895. '1' :
  896. init_settings.optimizerswitches:=init_settings.optimizerswitches+level1optimizerswitches;
  897. '2' :
  898. init_settings.optimizerswitches:=init_settings.optimizerswitches+level2optimizerswitches;
  899. '3' :
  900. init_settings.optimizerswitches:=init_settings.optimizerswitches+level3optimizerswitches;
  901. 'a' :
  902. begin
  903. if not(UpdateAlignmentStr(Copy(Opt,j+3,255),ParaAlignment)) then
  904. IllegalPara(opt);
  905. break;
  906. end;
  907. 's' :
  908. include(init_settings.optimizerswitches,cs_opt_size);
  909. 'p' :
  910. begin
  911. if not Setcputype(copy(more,j+1,length(more)),init_settings.optimizecputype) then
  912. begin
  913. { Give warning for old i386 switches }
  914. if (Length(More)-j=1) and
  915. (More[j+1]>='1') and (More[j+1]<='5')then
  916. Message2(option_obsolete_switch_use_new,'-Op<nr>','-Op<name>')
  917. else
  918. IllegalPara(opt);
  919. end;
  920. break;
  921. end;
  922. 'o' :
  923. begin
  924. if not UpdateOptimizerStr(copy(more,j+1,length(more)),init_settings.optimizerswitches) then
  925. IllegalPara(opt);
  926. break;
  927. end;
  928. '-' :
  929. begin
  930. init_settings.optimizerswitches:=[];
  931. FillChar(ParaAlignment,sizeof(ParaAlignment),0);
  932. end;
  933. { Obsolete switches }
  934. 'g' :
  935. Message2(option_obsolete_switch_use_new,'-Og','-Os');
  936. 'G' :
  937. Message1(option_obsolete_switch,'-OG');
  938. 'r' :
  939. Message2(option_obsolete_switch_use_new,'-Or','-O2 or -Ooregvar');
  940. 'u' :
  941. Message2(option_obsolete_switch_use_new,'-Ou','-Oouncertain');
  942. else
  943. IllegalPara(opt);
  944. end;
  945. inc(j);
  946. end;
  947. end;
  948. 'p' :
  949. begin
  950. if UnsetBool(More, 0) then
  951. begin
  952. init_settings.moduleswitches:=init_settings.moduleswitches-[cs_profile];
  953. undef_system_macro('FPC_PROFILE');
  954. end
  955. else
  956. if Length(More)=0 then
  957. IllegalPara(opt)
  958. else
  959. case more[1] of
  960. 'g' : if UnsetBool(more, 1) then
  961. begin
  962. exclude(init_settings.moduleswitches,cs_profile);
  963. undef_system_macro('FPC_PROFILE');
  964. end
  965. else
  966. begin
  967. include(init_settings.moduleswitches,cs_profile);
  968. def_system_macro('FPC_PROFILE');
  969. end;
  970. else
  971. IllegalPara(opt);
  972. end;
  973. end;
  974. 'P' : ; { Ignore used by fpc.pp }
  975. 'R' :
  976. begin
  977. if not SetAsmReadMode(More,init_settings.asmmode) then
  978. IllegalPara(opt);
  979. end;
  980. 's' :
  981. begin
  982. if UnsetBool(More, 0) then
  983. begin
  984. init_settings.globalswitches:=init_settings.globalswitches-[cs_asm_extern,cs_link_extern,cs_link_nolink];
  985. if more<>'' then
  986. IllegalPara(opt);
  987. end
  988. else
  989. begin
  990. init_settings.globalswitches:=init_settings.globalswitches+[cs_asm_extern,cs_link_extern,cs_link_nolink];
  991. if more='h' then
  992. init_settings.globalswitches:=init_settings.globalswitches-[cs_link_on_target]
  993. else if more='t' then
  994. init_settings.globalswitches:=init_settings.globalswitches+[cs_link_on_target]
  995. else if more='r' then
  996. init_settings.globalswitches:=init_settings.globalswitches+[cs_asm_leave,cs_no_regalloc]
  997. else if more<>'' then
  998. IllegalPara(opt);
  999. end;
  1000. end;
  1001. 'S' :
  1002. begin
  1003. if more='' then
  1004. IllegalPara(opt);
  1005. if more[1]='I' then
  1006. begin
  1007. if upper(more)='ICOM' then
  1008. init_settings.interfacetype:=it_interfacecom
  1009. else if upper(more)='ICORBA' then
  1010. init_settings.interfacetype:=it_interfacecorba
  1011. else
  1012. IllegalPara(opt);
  1013. end
  1014. else
  1015. begin
  1016. j:=1;
  1017. while j<=length(more) do
  1018. begin
  1019. case more[j] of
  1020. '2' : //an alternative to -Mobjfpc
  1021. SetCompileMode('OBJFPC',true);
  1022. 'a' :
  1023. If UnsetBool(More, j) then
  1024. exclude(init_settings.localswitches,cs_do_assertion)
  1025. else
  1026. include(init_settings.localswitches,cs_do_assertion);
  1027. 'c' :
  1028. If UnsetBool(More, j) then
  1029. include(init_settings.moduleswitches,cs_support_c_operators)
  1030. else
  1031. include(init_settings.moduleswitches,cs_support_c_operators);
  1032. 'd' : //an alternative to -Mdelphi
  1033. SetCompileMode('DELPHI',true);
  1034. 'e' :
  1035. begin
  1036. SetErrorFlags(copy(more,j+1,length(more)));
  1037. break;
  1038. end;
  1039. 'f' :
  1040. begin
  1041. inc(j);
  1042. if more[j]='-' then
  1043. begin
  1044. features:=[];
  1045. if length(more)>j then
  1046. IllegalPara(opt);
  1047. end
  1048. else
  1049. begin
  1050. if not(IncludeFeature(upper(copy(more,j,length(more)-j+1)))) then
  1051. IllegalPara(opt);
  1052. end;
  1053. end;
  1054. 'g' :
  1055. If UnsetBool(More, j) then
  1056. exclude(init_settings.moduleswitches,cs_support_goto)
  1057. else
  1058. include(init_settings.moduleswitches,cs_support_goto);
  1059. 'h' :
  1060. If UnsetBool(More, j) then
  1061. exclude(init_settings.localswitches,cs_ansistrings)
  1062. else
  1063. include(init_settings.localswitches,cs_ansistrings);
  1064. 'i' :
  1065. If UnsetBool(More, j) then
  1066. exclude(init_settings.localswitches,cs_do_inline)
  1067. else
  1068. include(init_settings.localswitches,cs_do_inline);
  1069. 'k' :
  1070. If UnsetBool(More, j) then
  1071. exclude(init_settings.globalswitches,cs_load_fpcylix_unit)
  1072. else
  1073. include(init_settings.globalswitches,cs_load_fpcylix_unit);
  1074. 'm' :
  1075. If UnsetBool(More, j) then
  1076. exclude(init_settings.moduleswitches,cs_support_macro)
  1077. else
  1078. include(init_settings.moduleswitches,cs_support_macro);
  1079. 'o' : //an alternative to -Mtp
  1080. SetCompileMode('TP',true);
  1081. {$ifdef gpc_mode}
  1082. 'p' : //an alternative to -Mgpc
  1083. SetCompileMode('GPC',true);
  1084. {$endif}
  1085. 's' :
  1086. If UnsetBool(More, j) then
  1087. exclude(init_settings.globalswitches,cs_constructor_name)
  1088. else
  1089. include(init_settings.globalswitches,cs_constructor_name);
  1090. 't' :
  1091. If UnsetBool(More, j) then
  1092. exclude(init_settings.moduleswitches,cs_static_keyword)
  1093. else
  1094. include(init_settings.moduleswitches,cs_static_keyword);
  1095. 'v' :
  1096. If UnsetBool(More, j) then
  1097. exclude(init_settings.globalswitches,cs_support_vectors)
  1098. else
  1099. include(init_settings.globalswitches,cs_support_vectors);
  1100. 'x' :
  1101. If UnsetBool(More, j) then
  1102. exclude(init_settings.globalswitches,cs_support_exceptions)
  1103. else
  1104. include(init_settings.globalswitches,cs_support_exceptions);
  1105. '-' :
  1106. begin
  1107. init_settings.globalswitches:=init_settings.globalswitches - [cs_constructor_name,cs_support_exceptions];
  1108. init_settings.localswitches:=init_settings.localswitches - [cs_do_assertion, cs_do_inline, cs_ansistrings];
  1109. init_settings.moduleswitches:=init_settings.moduleswitches - [cs_support_c_operators, cs_support_goto,
  1110. cs_support_macro,
  1111. cs_static_keyword];
  1112. end;
  1113. else
  1114. IllegalPara(opt);
  1115. end;
  1116. inc(j);
  1117. end;
  1118. end;
  1119. end;
  1120. 'T' :
  1121. begin
  1122. more:=Upper(More);
  1123. if paratarget=system_none then
  1124. begin
  1125. { remove old target define }
  1126. TargetDefines(false);
  1127. { load new target }
  1128. paratarget:=find_system_by_string(More);
  1129. if paratarget<>system_none then
  1130. set_target(paratarget)
  1131. else
  1132. IllegalPara(opt);
  1133. { set new define }
  1134. TargetDefines(true);
  1135. end
  1136. else
  1137. if More<>upper(target_info.shortname) then
  1138. Message1(option_target_is_already_set,target_info.shortname);
  1139. end;
  1140. 'u' :
  1141. if more <> '' then
  1142. undef_system_macro(more);
  1143. 'U' :
  1144. begin
  1145. j:=1;
  1146. while j<=length(more) do
  1147. begin
  1148. case more[j] of
  1149. {$ifdef UNITALIASES}
  1150. 'a' :
  1151. begin
  1152. AddUnitAlias(Copy(More,j+1,255));
  1153. break;
  1154. end;
  1155. {$endif UNITALIASES}
  1156. 'n' :
  1157. exclude(init_settings.globalswitches,cs_check_unit_name);
  1158. 'p' :
  1159. begin
  1160. Message2(option_obsolete_switch_use_new,'-Up','-Fu');
  1161. break;
  1162. end;
  1163. 'r' :
  1164. do_release:=true;
  1165. 's' :
  1166. include(init_settings.moduleswitches,cs_compilesystem);
  1167. '-' :
  1168. begin
  1169. exclude(init_settings.moduleswitches,cs_compilesystem);
  1170. exclude(init_settings.globalswitches,cs_check_unit_name);
  1171. end;
  1172. else
  1173. IllegalPara(opt);
  1174. end;
  1175. inc(j);
  1176. end;
  1177. end;
  1178. 'v' :
  1179. begin
  1180. if not setverbosity(More) then
  1181. IllegalPara(opt);
  1182. end;
  1183. 'V' : ; { Ignore used by fpc }
  1184. 'W' :
  1185. begin
  1186. j:=1;
  1187. while j<=length(More) do
  1188. begin
  1189. case More[j] of
  1190. 'A':
  1191. begin
  1192. if UnsetBool(More, j) then
  1193. apptype:=app_native
  1194. else
  1195. apptype:=app_cui;
  1196. end;
  1197. 'b':
  1198. begin
  1199. if (target_info.system in systems_darwin) then
  1200. begin
  1201. if not UnsetBool(More, j) then
  1202. apptype:=app_bundle
  1203. else
  1204. apptype:=app_cui
  1205. end
  1206. else
  1207. IllegalPara(opt);
  1208. end;
  1209. 'B':
  1210. begin
  1211. { -WB200000 means set trefered base address
  1212. to $200000, but does not change relocsection boolean
  1213. this way we can create both relocatble and
  1214. non relocatable DLL at a specific base address PM }
  1215. if (length(More)>j) then
  1216. begin
  1217. if DLLImageBase=nil then
  1218. DLLImageBase:=StringDup(Copy(More,j+1,255));
  1219. end
  1220. else
  1221. begin
  1222. RelocSection:=true;
  1223. RelocSectionSetExplicitly:=true;
  1224. end;
  1225. break;
  1226. end;
  1227. 'C':
  1228. begin
  1229. if UnsetBool(More, j) then
  1230. apptype:=app_gui
  1231. else
  1232. apptype:=app_cui;
  1233. end;
  1234. 'D':
  1235. begin
  1236. UseDeffileForExports:=not UnsetBool(More, j);
  1237. UseDeffileForExportsSetExplicitly:=true;
  1238. end;
  1239. 'F':
  1240. begin
  1241. if UnsetBool(More, j) then
  1242. apptype:=app_cui
  1243. else
  1244. apptype:=app_fs;
  1245. end;
  1246. 'G':
  1247. begin
  1248. if UnsetBool(More, j) then
  1249. apptype:=app_cui
  1250. else
  1251. apptype:=app_gui;
  1252. end;
  1253. 'I':
  1254. begin
  1255. GenerateImportSection:=not UnsetBool(More,j);
  1256. GenerateImportSectionSetExplicitly:=true;
  1257. end;
  1258. 'N':
  1259. begin
  1260. RelocSection:=UnsetBool(More,j);
  1261. RelocSectionSetExplicitly:=true;
  1262. end;
  1263. 'R':
  1264. begin
  1265. { support -WR+ / -WR- as synonyms to -WR / -WN }
  1266. RelocSection:=not UnsetBool(More,j);
  1267. RelocSectionSetExplicitly:=true;
  1268. end;
  1269. 'T':
  1270. begin
  1271. if UnsetBool(More, j) then
  1272. apptype:=app_cui
  1273. else
  1274. apptype:=app_tool;
  1275. end;
  1276. else
  1277. IllegalPara(opt);
  1278. end;
  1279. inc(j);
  1280. end;
  1281. end;
  1282. 'X' :
  1283. begin
  1284. j:=1;
  1285. while j<=length(more) do
  1286. begin
  1287. case More[j] of
  1288. 'c' : Cshared:=TRUE;
  1289. 'd' : Dontlinkstdlibpath:=TRUE;
  1290. 'e' :
  1291. begin
  1292. If UnsetBool(More, j) then
  1293. exclude(init_settings.globalswitches,cs_link_extern)
  1294. else
  1295. include(init_settings.globalswitches,cs_link_extern);
  1296. end;
  1297. 'f' :
  1298. include(init_settings.globalswitches,cs_link_pthread);
  1299. 'g' :
  1300. begin
  1301. If UnsetBool(More, j) then
  1302. exclude(init_settings.globalswitches,cs_link_separate_dbg_file)
  1303. else
  1304. include(init_settings.globalswitches,cs_link_separate_dbg_file);
  1305. end;
  1306. 'i' :
  1307. begin
  1308. If UnsetBool(More, j) then
  1309. include(init_settings.globalswitches,cs_link_extern)
  1310. else
  1311. exclude(init_settings.globalswitches,cs_link_extern);
  1312. end;
  1313. 'm' :
  1314. begin
  1315. If UnsetBool(More, j) then
  1316. exclude(init_settings.globalswitches,cs_link_map)
  1317. else
  1318. include(init_settings.globalswitches,cs_link_map);
  1319. end;
  1320. 'p' : ; { Ignore used by fpc.pp }
  1321. 'r' :
  1322. begin
  1323. rlinkpath:=Copy(more,2,length(More)-1);
  1324. DefaultReplacements(rlinkpath);
  1325. More:='';
  1326. end;
  1327. 's' :
  1328. begin
  1329. If UnsetBool(More, j) then
  1330. exclude(init_settings.globalswitches,cs_link_strip)
  1331. else
  1332. include(init_settings.globalswitches,cs_link_strip);
  1333. end;
  1334. 't' :
  1335. include(init_settings.globalswitches,cs_link_staticflag);
  1336. 'v' :
  1337. begin
  1338. If UnsetBool(More, j) then
  1339. exclude(init_settings.globalswitches,cs_link_opt_vtable)
  1340. else
  1341. include(init_settings.globalswitches,cs_link_opt_vtable);
  1342. end;
  1343. 'D' :
  1344. begin
  1345. def_system_macro('FPC_LINK_DYNAMIC');
  1346. undef_system_macro('FPC_LINK_SMART');
  1347. undef_system_macro('FPC_LINK_STATIC');
  1348. exclude(init_settings.globalswitches,cs_link_static);
  1349. exclude(init_settings.globalswitches,cs_link_smart);
  1350. include(init_settings.globalswitches,cs_link_shared);
  1351. LinkTypeSetExplicitly:=true;
  1352. end;
  1353. 'M' :
  1354. begin
  1355. mainaliasname:=Copy(more,2,length(More)-1);
  1356. More:='';
  1357. end;
  1358. 'P' :
  1359. begin
  1360. utilsprefix:=Copy(more,2,length(More)-1);
  1361. DefaultReplacements(utilsprefix);
  1362. More:='';
  1363. end;
  1364. 'L' : begin // -XLO is link order -XLA is link alias. -XLD avoids load defaults.
  1365. // these are not aggregable.
  1366. if (j=length(more)) or not (more[j+1] in ['O','A','D']) then
  1367. IllegalPara(opt)
  1368. else
  1369. begin
  1370. case more[j+1] of
  1371. 'A' : begin
  1372. s:=Copy(more,3,length(More)-2);
  1373. if not LinkLibraryAliases.AddDep(s) Then
  1374. IllegalPara(opt);
  1375. end;
  1376. 'O' : begin
  1377. s:=Copy(more,3,length(More)-2);
  1378. if not LinkLibraryOrder.AddWeight(s) Then
  1379. IllegalPara(opt);
  1380. end;
  1381. 'D' : include(init_settings.globalswitches,cs_link_no_default_lib_order)
  1382. else
  1383. IllegalPara(opt);
  1384. end; {case}
  1385. j:=length(more);
  1386. end; {else begin}
  1387. end;
  1388. 'S' :
  1389. begin
  1390. def_system_macro('FPC_LINK_STATIC');
  1391. undef_system_macro('FPC_LINK_SMART');
  1392. undef_system_macro('FPC_LINK_DYNAMIC');
  1393. include(init_settings.globalswitches,cs_link_static);
  1394. exclude(init_settings.globalswitches,cs_link_smart);
  1395. exclude(init_settings.globalswitches,cs_link_shared);
  1396. LinkTypeSetExplicitly:=true;
  1397. end;
  1398. 'X' :
  1399. begin
  1400. def_system_macro('FPC_LINK_SMART');
  1401. undef_system_macro('FPC_LINK_STATIC');
  1402. undef_system_macro('FPC_LINK_DYNAMIC');
  1403. exclude(init_settings.globalswitches,cs_link_static);
  1404. include(init_settings.globalswitches,cs_link_smart);
  1405. exclude(init_settings.globalswitches,cs_link_shared);
  1406. LinkTypeSetExplicitly:=true;
  1407. end;
  1408. '-' :
  1409. begin
  1410. exclude(init_settings.globalswitches,cs_link_staticflag);
  1411. exclude(init_settings.globalswitches,cs_link_strip);
  1412. exclude(init_settings.globalswitches,cs_link_map);
  1413. set_default_link_type;
  1414. end;
  1415. else
  1416. IllegalPara(opt);
  1417. end;
  1418. inc(j);
  1419. end;
  1420. end;
  1421. end;
  1422. end;
  1423. '@' :
  1424. begin
  1425. Message(option_no_nested_response_file);
  1426. StopOptions(1);
  1427. end;
  1428. else
  1429. begin
  1430. if (length(param_file)<>0) then
  1431. Message(option_only_one_source_support);
  1432. param_file:=opt;
  1433. Message1(option_found_file,opt);
  1434. end;
  1435. end;
  1436. end;
  1437. procedure Toption.Interpret_file(const filename : string);
  1438. procedure RemoveSep(var fn:string);
  1439. var
  1440. i : longint;
  1441. begin
  1442. i:=0;
  1443. while (i<length(fn)) and (fn[i+1] in [',',' ',#9]) do
  1444. inc(i);
  1445. Delete(fn,1,i);
  1446. i:=length(fn);
  1447. while (i>0) and (fn[i] in [',',' ',#9]) do
  1448. dec(i);
  1449. fn:=copy(fn,1,i);
  1450. end;
  1451. function GetName(var fn:string):string;
  1452. var
  1453. i : longint;
  1454. begin
  1455. i:=0;
  1456. while (i<length(fn)) and (fn[i+1] in ['a'..'z','A'..'Z','0'..'9','_','-']) do
  1457. inc(i);
  1458. GetName:=Copy(fn,1,i);
  1459. Delete(fn,1,i);
  1460. end;
  1461. const
  1462. maxlevel=16;
  1463. var
  1464. f : text;
  1465. s, tmp,
  1466. opts : string;
  1467. skip : array[0..maxlevel-1] of boolean;
  1468. level : longint;
  1469. option_read : boolean;
  1470. begin
  1471. { avoid infinite loop }
  1472. Inc(FileLevel);
  1473. Option_read:=false;
  1474. If FileLevel>MaxLevel then
  1475. Message(option_too_many_cfg_files);
  1476. { Maybe It's Directory ?} //Jaro Change:
  1477. if PathExists(filename,false) then
  1478. begin
  1479. Message1(option_config_is_dir,filename);
  1480. exit;
  1481. end;
  1482. { open file }
  1483. Message1(option_using_file,filename);
  1484. assign(f,ExpandFileName(filename));
  1485. {$I-}
  1486. reset(f);
  1487. {$I+}
  1488. if ioresult<>0 then
  1489. begin
  1490. Message1(option_unable_open_file,filename);
  1491. exit;
  1492. end;
  1493. Message1(option_start_reading_configfile,filename);
  1494. fillchar(skip,sizeof(skip),0);
  1495. level:=0;
  1496. while not eof(f) do
  1497. begin
  1498. readln(f,opts);
  1499. RemoveSep(opts);
  1500. if (opts<>'') and (opts[1]<>';') then
  1501. begin
  1502. if opts[1]='#' then
  1503. begin
  1504. Message1(option_interpreting_file_option,opts);
  1505. Delete(opts,1,1);
  1506. s:=upper(GetName(opts));
  1507. if (s='SECTION') then
  1508. begin
  1509. RemoveSep(opts);
  1510. s:=upper(GetName(opts));
  1511. if level=0 then
  1512. skip[level]:=not (assigned(search_macro(s)) or (s='COMMON'));
  1513. end
  1514. else
  1515. if (s='IFDEF') then
  1516. begin
  1517. RemoveSep(opts);
  1518. if Level>=maxlevel then
  1519. begin
  1520. Message(option_too_many_ifdef);
  1521. stopOptions(1);
  1522. end;
  1523. inc(Level);
  1524. skip[level]:=(skip[level-1] or not assigned(search_macro(upper(GetName(opts)))));
  1525. end
  1526. else
  1527. if (s='IFNDEF') then
  1528. begin
  1529. RemoveSep(opts);
  1530. if Level>=maxlevel then
  1531. begin
  1532. Message(option_too_many_ifdef);
  1533. stopOptions(1);
  1534. end;
  1535. inc(Level);
  1536. skip[level]:=(skip[level-1] or assigned(search_macro(upper(GetName(opts)))));
  1537. end
  1538. else
  1539. if (s='ELSE') then
  1540. skip[level]:=skip[level-1] or (not skip[level])
  1541. else
  1542. if (s='ENDIF') then
  1543. begin
  1544. skip[level]:=false;
  1545. if Level=0 then
  1546. begin
  1547. Message(option_too_many_endif);
  1548. stopOptions(1);
  1549. end;
  1550. dec(level);
  1551. end
  1552. else
  1553. if (not skip[level]) then
  1554. begin
  1555. if (s='DEFINE') then
  1556. begin
  1557. RemoveSep(opts);
  1558. tmp:= GetName(opts);
  1559. if tmp <> '' then
  1560. def_system_macro(tmp);
  1561. end
  1562. else
  1563. if (s='UNDEF') then
  1564. begin
  1565. RemoveSep(opts);
  1566. tmp:= GetName(opts);
  1567. if tmp <> '' then
  1568. undef_system_macro(tmp);
  1569. end
  1570. else
  1571. if (s='WRITE') then
  1572. begin
  1573. Delete(opts,1,1);
  1574. WriteLn(opts);
  1575. end
  1576. else
  1577. if (s='INCLUDE') then
  1578. begin
  1579. Delete(opts,1,1);
  1580. Interpret_file(opts);
  1581. end;
  1582. end;
  1583. end
  1584. else
  1585. begin
  1586. if (opts[1]='-') or (opts[1]='@') then
  1587. begin
  1588. if (not skip[level]) then
  1589. interpret_option(opts,false);
  1590. Option_read:=true;
  1591. end
  1592. else
  1593. Message1(option_illegal_para,opts);
  1594. end;
  1595. end;
  1596. end;
  1597. if Level>0 then
  1598. Message(option_too_less_endif);
  1599. if Not Option_read then
  1600. Message1(option_no_option_found,filename)
  1601. else
  1602. Message1(option_end_reading_configfile,filename);
  1603. Close(f);
  1604. Dec(FileLevel);
  1605. end;
  1606. procedure Toption.Interpret_envvar(const envname : string);
  1607. var
  1608. argstart,
  1609. env,
  1610. pc : pchar;
  1611. arglen : longint;
  1612. quote : set of char;
  1613. hs : string;
  1614. begin
  1615. Message1(option_using_env,envname);
  1616. env:=GetEnvPChar(envname);
  1617. pc:=env;
  1618. if assigned(pc) then
  1619. begin
  1620. repeat
  1621. { skip leading spaces }
  1622. while pc^ in [' ',#9,#13] do
  1623. inc(pc);
  1624. case pc^ of
  1625. #0 :
  1626. break;
  1627. '"' :
  1628. begin
  1629. quote:=['"'];
  1630. inc(pc);
  1631. end;
  1632. '''' :
  1633. begin
  1634. quote:=[''''];
  1635. inc(pc);
  1636. end;
  1637. else
  1638. quote:=[' ',#9,#13];
  1639. end;
  1640. { scan until the end of the argument }
  1641. argstart:=pc;
  1642. while (pc^<>#0) and not(pc^ in quote) do
  1643. inc(pc);
  1644. { create argument }
  1645. arglen:=pc-argstart;
  1646. {$warning FIXME: silent truncation of environment parameters }
  1647. if (arglen > 255) then
  1648. arglen := 255;
  1649. setlength(hs,arglen);
  1650. move(argstart^,hs[1],arglen);
  1651. interpret_option(hs,true);
  1652. { skip quote }
  1653. if pc^ in quote then
  1654. inc(pc);
  1655. until false;
  1656. end
  1657. else
  1658. Message1(option_no_option_found,'(env) '+envname);
  1659. FreeEnvPChar(env);
  1660. end;
  1661. procedure toption.read_parameters;
  1662. var
  1663. opts : string;
  1664. paramindex : longint;
  1665. begin
  1666. paramindex:=0;
  1667. while paramindex<paramcount do
  1668. begin
  1669. inc(paramindex);
  1670. opts:=system.paramstr(paramindex);
  1671. case opts[1] of
  1672. '@' :
  1673. if not firstpass then
  1674. begin
  1675. Delete(opts,1,1);
  1676. Message1(option_reading_further_from,opts);
  1677. interpret_file(opts);
  1678. end;
  1679. '!' :
  1680. if not firstpass then
  1681. begin
  1682. Delete(opts,1,1);
  1683. Message1(option_reading_further_from,'(env) '+opts);
  1684. interpret_envvar(opts);
  1685. end;
  1686. else
  1687. interpret_option(opts,true);
  1688. end;
  1689. end;
  1690. end;
  1691. procedure toption.parsecmd(cmd:string);
  1692. var
  1693. i,ps : longint;
  1694. opts : string;
  1695. begin
  1696. while (cmd<>'') do
  1697. begin
  1698. while cmd[1]=' ' do
  1699. delete(cmd,1,1);
  1700. i:=pos(' ',cmd);
  1701. if i=0 then
  1702. i:=256;
  1703. opts:=Copy(cmd,1,i-1);
  1704. Delete(cmd,1,i);
  1705. case opts[1] of
  1706. '@' :
  1707. if not firstpass then
  1708. begin
  1709. Delete(opts,1,1);
  1710. Message1(option_reading_further_from,opts);
  1711. interpret_file(opts);
  1712. end;
  1713. '!' :
  1714. if not firstpass then
  1715. begin
  1716. Delete(opts,1,1);
  1717. Message1(option_reading_further_from,'(env) '+opts);
  1718. interpret_envvar(opts);
  1719. end;
  1720. '"' :
  1721. begin
  1722. Delete(opts,1,1);
  1723. ps:=pos('"',cmd);
  1724. if (i<>256) and (ps>0) then
  1725. begin
  1726. opts:=opts + ' '+ copy(cmd,1,ps-1);
  1727. cmd:=copy(cmd,ps+1,255);
  1728. end;
  1729. interpret_option(opts,true);
  1730. end;
  1731. else
  1732. interpret_option(opts,true);
  1733. end;
  1734. end;
  1735. end;
  1736. procedure toption.writequickinfo;
  1737. var
  1738. s : string;
  1739. i : longint;
  1740. procedure addinfo(const hs:string);
  1741. begin
  1742. if s<>'' then
  1743. s:=s+' '+hs
  1744. else
  1745. s:=hs;
  1746. end;
  1747. begin
  1748. s:='';
  1749. i:=0;
  1750. while (i<length(quickinfo)) do
  1751. begin
  1752. inc(i);
  1753. case quickinfo[i] of
  1754. 'S' :
  1755. begin
  1756. inc(i);
  1757. case quickinfo[i] of
  1758. 'O' :
  1759. addinfo(lower(source_info.shortname));
  1760. 'P' :
  1761. addinfo(source_cpu_string);
  1762. else
  1763. IllegalPara('-i'+QuickInfo);
  1764. end;
  1765. end;
  1766. 'T' :
  1767. begin
  1768. inc(i);
  1769. case quickinfo[i] of
  1770. 'O' :
  1771. addinfo(lower(target_info.shortname));
  1772. 'P' :
  1773. AddInfo(target_cpu_string);
  1774. else
  1775. IllegalPara('-i'+QuickInfo);
  1776. end;
  1777. end;
  1778. 'V' :
  1779. AddInfo(version_string);
  1780. 'W' :
  1781. AddInfo(full_version_string);
  1782. 'D' :
  1783. AddInfo(date_string);
  1784. '_' :
  1785. ;
  1786. else
  1787. IllegalPara('-i'+QuickInfo);
  1788. end;
  1789. end;
  1790. if s<>'' then
  1791. begin
  1792. writeln(s);
  1793. stopoptions(0);
  1794. end;
  1795. end;
  1796. procedure TOption.TargetDefines(def:boolean);
  1797. var
  1798. s : string;
  1799. i : integer;
  1800. begin
  1801. if def then
  1802. def_system_macro(target_info.shortname)
  1803. else
  1804. undef_system_macro(target_info.shortname);
  1805. s:=target_info.extradefines;
  1806. while (s<>'') do
  1807. begin
  1808. i:=pos(';',s);
  1809. if i=0 then
  1810. i:=length(s)+1;
  1811. if def then
  1812. def_system_macro(Copy(s,1,i-1))
  1813. else
  1814. undef_system_macro(Copy(s,1,i-1));
  1815. delete(s,1,i);
  1816. end;
  1817. end;
  1818. constructor TOption.create;
  1819. begin
  1820. LogoWritten:=false;
  1821. NoPressEnter:=false;
  1822. FirstPass:=false;
  1823. FileLevel:=0;
  1824. Quickinfo:='';
  1825. ParaIncludePath:=TSearchPathList.Create;
  1826. ParaObjectPath:=TSearchPathList.Create;
  1827. ParaUnitPath:=TSearchPathList.Create;
  1828. ParaLibraryPath:=TSearchPathList.Create;
  1829. ParaFrameworkPath:=TSearchPathList.Create;
  1830. FillChar(ParaAlignment,sizeof(ParaAlignment),0);
  1831. end;
  1832. destructor TOption.destroy;
  1833. begin
  1834. ParaIncludePath.Free;
  1835. ParaObjectPath.Free;
  1836. ParaUnitPath.Free;
  1837. ParaLibraryPath.Free;
  1838. ParaFrameworkPath.Free;
  1839. end;
  1840. {****************************************************************************
  1841. Callable Routines
  1842. ****************************************************************************}
  1843. function check_configfile(const fn:string;var foundfn:string):boolean;
  1844. function CfgFileExists(const fn:string):boolean;
  1845. begin
  1846. Comment(V_Tried,'Configfile search: '+fn);
  1847. CfgFileExists:=FileExists(fn);
  1848. end;
  1849. var
  1850. hs,
  1851. configpath : string;
  1852. begin
  1853. foundfn:=fn;
  1854. check_configfile:=true;
  1855. { retrieve configpath }
  1856. configpath:=FixPath(GetEnvironmentVariable('PPC_CONFIG_PATH'),false);
  1857. {$ifdef Unix}
  1858. if configpath='' then
  1859. configpath:=ExpandFileName(FixPath(exepath+'../etc/',false));
  1860. {$endif}
  1861. {
  1862. Order to read configuration file :
  1863. try reading fpc.cfg in :
  1864. 1 - current dir
  1865. 2 - configpath
  1866. 3 - compiler path
  1867. }
  1868. if not FileExists(fn) then
  1869. begin
  1870. {$ifdef Unix}
  1871. hs:=GetEnvironmentVariable('HOME');
  1872. if (hs<>'') and CfgFileExists(FixPath(hs,false)+'.'+fn) then
  1873. foundfn:=FixPath(hs,false)+'.'+fn
  1874. else
  1875. {$endif}
  1876. if CfgFileExists(configpath+fn) then
  1877. foundfn:=configpath+fn
  1878. else
  1879. {$ifndef Unix}
  1880. if CfgFileExists(exepath+fn) then
  1881. foundfn:=exepath+fn
  1882. else
  1883. {$else}
  1884. if CfgFileExists('/etc/'+fn) then
  1885. foundfn:='/etc/'+fn
  1886. else
  1887. {$endif}
  1888. check_configfile:=false;
  1889. end;
  1890. end;
  1891. procedure read_arguments(cmd:string);
  1892. var
  1893. i : tfeature;
  1894. begin
  1895. option:=coption.create;
  1896. disable_configfile:=false;
  1897. { get default messagefile }
  1898. msgfilename:=GetEnvironmentVariable('PPC_ERROR_FILE');
  1899. { default configfile can be specified on the commandline,
  1900. remove it first }
  1901. if (cmd<>'') and (cmd[1]='[') then
  1902. begin
  1903. ppccfg:=Copy(cmd,2,pos(']',cmd)-2);
  1904. Delete(cmd,1,pos(']',cmd));
  1905. end
  1906. else
  1907. begin
  1908. ppccfg:='fpc.cfg';
  1909. ppcaltcfg:='ppc386.cfg';
  1910. end;
  1911. { first pass reading of parameters, only -i -v -T etc.}
  1912. option.firstpass:=true;
  1913. if cmd<>'' then
  1914. option.parsecmd(cmd)
  1915. else
  1916. begin
  1917. option.read_parameters;
  1918. { Write only quickinfo }
  1919. if option.quickinfo<>'' then
  1920. option.writequickinfo;
  1921. end;
  1922. option.firstpass:=false;
  1923. { target is set here, for wince the default app type is gui }
  1924. if target_info.system in system_wince then
  1925. apptype:=app_gui;
  1926. { default defines }
  1927. def_system_macro(target_info.shortname);
  1928. def_system_macro('FPC');
  1929. def_system_macro('VER'+version_nr);
  1930. def_system_macro('VER'+version_nr+'_'+release_nr);
  1931. def_system_macro('VER'+version_nr+'_'+release_nr+'_'+patch_nr);
  1932. { Temporary defines, until things settle down }
  1933. { "main" symbol is generated in the main program, and left out of the system unit }
  1934. def_system_macro('FPC_DARWIN_PASCALMAIN');
  1935. def_system_macro('FPC_DARWIN_JMP_MAIN');
  1936. def_system_macro('COMPPROCINLINEFIXED');
  1937. def_system_macro('PARAOUTFILE');
  1938. def_system_macro('RESSTRSECTIONS');
  1939. def_system_macro('FPC_HASFIXED64BITVARIANT');
  1940. def_system_macro('FPC_HASINTERNALOLEVARIANT2VARIANTCAST');
  1941. def_system_macro('FPC_HAS_VARSETS');
  1942. def_system_macro('FPC_HAS_VALGRINDBOOL');
  1943. def_system_macro('FPC_HAS_STR_CURRENCY');
  1944. def_system_macro('FPC_REAL2REAL_FIXED');
  1945. def_system_macro('FPC_STRTOCHARARRAYPROC');
  1946. def_system_macro('FPC_NEW_BIGENDIAN_SETS');
  1947. {$ifdef SUPPORT_UNALIGNED}
  1948. def_system_macro('FPC_SUPPORTS_UNALIGNED');
  1949. {$endif SUPPORT_UNALIGNED}
  1950. {$ifdef powerpc64}
  1951. def_system_macro('FPC_HAS_LWSYNC');
  1952. {$endif}
  1953. def_system_macro('FPC_HAS_MEMBAR');
  1954. {$if defined(x86) or defined(arm)}
  1955. def_system_macro('INTERNAL_BACKTRACE');
  1956. {$endif}
  1957. def_system_macro('STR_CONCAT_PROCS');
  1958. if pocall_default = pocall_register then
  1959. def_system_macro('REGCALL');
  1960. { don't remove this, it's also for fpdoc necessary (FK) }
  1961. def_system_macro('FPC_HAS_FEATURE_SUPPORT');
  1962. { using a case is pretty useless here (FK) }
  1963. { some stuff for TP compatibility }
  1964. {$ifdef i386}
  1965. def_system_macro('CPU86');
  1966. def_system_macro('CPU87');
  1967. def_system_macro('CPU386');
  1968. {$endif}
  1969. {$ifdef m68k}
  1970. def_system_macro('CPU68');
  1971. {$endif}
  1972. { new processor stuff }
  1973. {$ifdef i386}
  1974. def_system_macro('CPUI386');
  1975. def_system_macro('CPU32');
  1976. def_system_macro('FPC_HAS_TYPE_EXTENDED');
  1977. def_system_macro('FPC_HAS_TYPE_DOUBLE');
  1978. def_system_macro('FPC_HAS_TYPE_SINGLE');
  1979. def_system_macro('FPC_HAS_RESOURCES');
  1980. {$endif}
  1981. {$ifdef m68k}
  1982. def_system_macro('CPU68K');
  1983. def_system_macro('CPUM68K');
  1984. def_system_macro('CPU32');
  1985. def_system_macro('FPC_HAS_TYPE_DOUBLE');
  1986. def_system_macro('FPC_HAS_TYPE_SINGLE');
  1987. def_system_macro('FPC_INCLUDE_SOFTWARE_INT64_TO_DOUBLE');
  1988. def_system_macro('FPC_CURRENCY_IS_INT64');
  1989. def_system_macro('FPC_COMP_IS_INT64');
  1990. {$endif}
  1991. {$ifdef ALPHA}
  1992. def_system_macro('CPUALPHA');
  1993. def_system_macro('CPU64');
  1994. {$endif}
  1995. {$ifdef powerpc}
  1996. def_system_macro('CPUPOWERPC');
  1997. def_system_macro('CPUPOWERPC32');
  1998. def_system_macro('CPU32');
  1999. def_system_macro('FPC_HAS_TYPE_DOUBLE');
  2000. def_system_macro('FPC_HAS_TYPE_SINGLE');
  2001. def_system_macro('FPC_INCLUDE_SOFTWARE_INT64_TO_DOUBLE');
  2002. def_system_macro('FPC_CURRENCY_IS_INT64');
  2003. def_system_macro('FPC_COMP_IS_INT64');
  2004. {$endif}
  2005. {$ifdef POWERPC64}
  2006. def_system_macro('CPUPOWERPC');
  2007. def_system_macro('CPUPOWERPC64');
  2008. def_system_macro('CPU64');
  2009. def_system_macro('FPC_HAS_TYPE_DOUBLE');
  2010. def_system_macro('FPC_HAS_TYPE_SINGLE');
  2011. def_system_macro('FPC_INCLUDE_SOFTWARE_INT64_TO_DOUBLE');
  2012. def_system_macro('FPC_CURRENCY_IS_INT64');
  2013. def_system_macro('FPC_COMP_IS_INT64');
  2014. {$endif}
  2015. {$ifdef iA64}
  2016. def_system_macro('CPUIA64');
  2017. def_system_macro('CPU64');
  2018. {$endif}
  2019. {$ifdef x86_64}
  2020. def_system_macro('CPUX86_64');
  2021. def_system_macro('CPUAMD64');
  2022. def_system_macro('CPU64');
  2023. { not supported for now, afaik (FK)
  2024. def_system_macro('FPC_HAS_TYPE_FLOAT128'); }
  2025. { win64 doesn't support the legacy fpu }
  2026. if target_info.system<>system_x86_64_win64 then
  2027. def_system_macro('FPC_HAS_TYPE_EXTENDED')
  2028. else
  2029. begin
  2030. def_system_macro('FPC_CURRENCY_IS_INT64');
  2031. def_system_macro('FPC_COMP_IS_INT64');
  2032. undef_system_macro('FPC_HAS_TYPE_EXTENDED');
  2033. end;
  2034. def_system_macro('FPC_HAS_TYPE_DOUBLE');
  2035. def_system_macro('FPC_HAS_TYPE_SINGLE');
  2036. {$endif}
  2037. {$ifdef sparc}
  2038. def_system_macro('CPUSPARC');
  2039. def_system_macro('CPUSPARC32');
  2040. def_system_macro('CPU32');
  2041. def_system_macro('FPC_HAS_TYPE_DOUBLE');
  2042. def_system_macro('FPC_HAS_TYPE_SINGLE');
  2043. def_system_macro('FPC_INCLUDE_SOFTWARE_INT64_TO_DOUBLE');
  2044. def_system_macro('FPC_CURRENCY_IS_INT64');
  2045. def_system_macro('FPC_COMP_IS_INT64');
  2046. {$endif}
  2047. {$ifdef vis}
  2048. def_system_macro('CPUVIS');
  2049. def_system_macro('CPU32');
  2050. {$endif}
  2051. {$ifdef arm}
  2052. def_system_macro('CPUARM');
  2053. def_system_macro('CPU32');
  2054. def_system_macro('FPC_HAS_TYPE_DOUBLE');
  2055. def_system_macro('FPC_HAS_TYPE_SINGLE');
  2056. def_system_macro('FPC_INCLUDE_SOFTWARE_INT64_TO_DOUBLE');
  2057. def_system_macro('FPC_CURRENCY_IS_INT64');
  2058. def_system_macro('FPC_COMP_IS_INT64');
  2059. {$endif arm}
  2060. if source_info.system<>target_info.system then
  2061. def_system_macro('FPC_CROSSCOMPILING');
  2062. if source_info.cpu<>target_info.cpu then
  2063. def_system_macro('FPC_CPUCROSSCOMPILING');
  2064. if tf_winlikewidestring in target_info.flags then
  2065. def_system_macro('FPC_WINLIKEWIDESTRING');
  2066. if (tf_requires_proper_alignment in target_info.flags) then
  2067. def_system_macro('FPC_REQUIRES_PROPER_ALIGNMENT');
  2068. { read configuration file }
  2069. if (not disable_configfile) and
  2070. (ppccfg<>'') then
  2071. begin
  2072. read_configfile:=check_configfile(ppccfg,ppccfg);
  2073. { Maybe alternative configfile ? }
  2074. if (not read_configfile) and
  2075. (ppcaltcfg<>'') then
  2076. read_configfile:=check_configfile(ppcaltcfg,ppccfg);
  2077. end
  2078. else
  2079. read_configfile := false;
  2080. { the config file may have changed the target }
  2081. if (tf_winlikewidestring in target_info.flags) then
  2082. def_system_macro('FPC_WINLIKEWIDESTRING')
  2083. else
  2084. undef_system_macro('FPC_WINLIKEWIDESTRING');
  2085. if (tf_requires_proper_alignment in target_info.flags) then
  2086. def_system_macro('FPC_REQUIRES_PROPER_ALIGNMENT')
  2087. else
  2088. undef_system_macro('FPC_REQUIRES_PROPER_ALIGNMENT');
  2089. { Read commandline and configfile }
  2090. param_file:='';
  2091. { read configfile }
  2092. if read_configfile then
  2093. option.interpret_file(ppccfg);
  2094. { read parameters again to override config file }
  2095. if cmd<>'' then
  2096. option.parsecmd(cmd)
  2097. else
  2098. begin
  2099. { Write help pages if no parameters are passed }
  2100. if (paramcount=0) then
  2101. Option.WriteHelpPages;
  2102. option.read_parameters;
  2103. { Write only quickinfo }
  2104. if option.quickinfo<>'' then
  2105. option.writequickinfo;
  2106. end;
  2107. { Stop if errors in options }
  2108. if ErrorCount>0 then
  2109. StopOptions(1);
  2110. { Write logo }
  2111. if option.ParaLogo then
  2112. option.writelogo;
  2113. { Non-core target defines }
  2114. Option.TargetDefines(true);
  2115. { endian define }
  2116. case target_info.endian of
  2117. endian_little :
  2118. begin
  2119. def_system_macro('ENDIAN_LITTLE');
  2120. def_system_macro('FPC_LITTLE_ENDIAN');
  2121. end;
  2122. endian_big :
  2123. begin
  2124. def_system_macro('ENDIAN_BIG');
  2125. def_system_macro('FPC_BIG_ENDIAN');
  2126. end;
  2127. end;
  2128. { abi define }
  2129. case target_info.abi of
  2130. abi_powerpc_sysv :
  2131. def_system_macro('FPC_ABI_SYSV');
  2132. abi_powerpc_aix :
  2133. def_system_macro('FPC_ABI_AIX');
  2134. end;
  2135. { Check file to compile }
  2136. if param_file='' then
  2137. begin
  2138. Message(option_no_source_found);
  2139. StopOptions(1);
  2140. end;
  2141. {$ifndef Unix}
  2142. param_file:=FixFileName(param_file);
  2143. {$endif not unix}
  2144. inputfilepath:=ExtractFilePath(param_file);
  2145. inputfilename:=ExtractFileName(param_file);
  2146. if ExtractFileExt(inputfilename)='' then
  2147. begin
  2148. if FileExists(inputfilepath+ChangeFileExt(inputfilename,sourceext)) then
  2149. inputfilename:=ChangeFileExt(inputfilename,sourceext)
  2150. else if FileExists(inputfilepath+ChangeFileExt(inputfilename,pasext)) then
  2151. inputfilename:=ChangeFileExt(inputfilename,pasext)
  2152. else if ((m_mac in current_settings.modeswitches) or
  2153. (tf_p_ext_support in target_info.flags))
  2154. and FileExists(inputfilepath+ChangeFileExt(inputfilename,pext)) then
  2155. inputfilename:=ChangeFileExt(inputfilename,pext);
  2156. end;
  2157. { Check output dir }
  2158. if (OutputExeDir<>'') and
  2159. not PathExists(OutputExeDir,false) then
  2160. begin
  2161. Message1(general_e_path_does_not_exist,OutputExeDir);
  2162. StopOptions(1);
  2163. end;
  2164. { Add paths specified with parameters to the searchpaths }
  2165. UnitSearchPath.AddList(option.ParaUnitPath,true);
  2166. ObjectSearchPath.AddList(option.ParaObjectPath,true);
  2167. IncludeSearchPath.AddList(option.ParaIncludePath,true);
  2168. LibrarySearchPath.AddList(option.ParaLibraryPath,true);
  2169. FrameworkSearchPath.AddList(option.ParaFrameworkPath,true);
  2170. { add unit environment and exepath to the unit search path }
  2171. if inputfilepath<>'' then
  2172. Unitsearchpath.AddPath(inputfilepath,true);
  2173. if not disable_configfile then
  2174. UnitSearchPath.AddPath(GetEnvironmentVariable(target_info.unit_env),false);
  2175. {$ifdef Unix}
  2176. fpcdir:=FixPath(GetEnvironmentVariable('FPCDIR'),false);
  2177. if fpcdir='' then
  2178. begin
  2179. if PathExists('/usr/local/lib/fpc/'+version_string,true) then
  2180. fpcdir:='/usr/local/lib/fpc/'+version_string+'/'
  2181. else
  2182. fpcdir:='/usr/lib/fpc/'+version_string+'/';
  2183. end;
  2184. {$else unix}
  2185. fpcdir:=FixPath(GetEnvironmentVariable('FPCDIR'),false);
  2186. if fpcdir='' then
  2187. begin
  2188. fpcdir:=ExePath+'../';
  2189. if not(PathExists(fpcdir+'/units',true)) and
  2190. not(PathExists(fpcdir+'/rtl',true)) then
  2191. fpcdir:=fpcdir+'../';
  2192. end;
  2193. {$endif unix}
  2194. { first try development RTL, else use the default installation path }
  2195. if not disable_configfile then
  2196. begin
  2197. if PathExists(FpcDir+'rtl',true) then
  2198. if tf_use_8_3 in Source_Info.Flags then
  2199. UnitSearchPath.AddPath(FpcDir+'rtl/'+target_os_string,false)
  2200. else
  2201. UnitSearchPath.AddPath(FpcDir+'rtl/'+target_full_string,false)
  2202. else
  2203. if tf_use_8_3 in Source_Info.Flags then
  2204. UnitSearchPath.AddPath(FpcDir+'units/'+target_os_string+'/rtl',false)
  2205. else
  2206. UnitSearchPath.AddPath(FpcDir+'units/'+target_full_string+'/rtl',false);
  2207. end;
  2208. { Add exepath if the exe is not in the current dir, because that is always searched already.
  2209. Do not add it when linking on the target because then we can maybe already find
  2210. .o files that are not for the target }
  2211. if (ExePath<>GetCurrentDir) and
  2212. not(cs_link_on_target in init_settings.globalswitches) then
  2213. UnitSearchPath.AddPath(ExePath,false);
  2214. { Add unit dir to the object and library path }
  2215. objectsearchpath.AddList(unitsearchpath,false);
  2216. librarysearchpath.AddList(unitsearchpath,false);
  2217. { maybe override assembler }
  2218. if (paratargetasm<>as_none) then
  2219. begin
  2220. if not set_target_asm(paratargetasm) then
  2221. begin
  2222. Message2(option_incompatible_asm,asminfos[paratargetasm]^.idtxt,target_info.name);
  2223. set_target_asm(target_info.assemextern);
  2224. Message1(option_asm_forced,target_asm.idtxt);
  2225. end;
  2226. if (af_no_debug in asminfos[paratargetasm]^.flags) and
  2227. (paratargetdbg<>dbg_none) then
  2228. begin
  2229. Message1(option_confict_asm_debug,
  2230. asminfos[paratargetasm]^.idtxt);
  2231. paratargetdbg:=dbg_none;
  2232. exclude(init_settings.moduleswitches,cs_debuginfo);
  2233. end;
  2234. end;
  2235. { maybe override debug info format }
  2236. if (paratargetdbg<>dbg_none) then
  2237. set_target_dbg(paratargetdbg);
  2238. { switch assembler if it's binary and we got -a on the cmdline }
  2239. if (cs_asm_leave in init_settings.globalswitches) and
  2240. (af_outputbinary in target_asm.flags) then
  2241. begin
  2242. Message(option_switch_bin_to_src_assembler);
  2243. set_target_asm(target_info.assemextern);
  2244. end;
  2245. { Force use of external linker if there is no
  2246. internal linker or the linking is skipped }
  2247. if not(cs_link_extern in init_settings.globalswitches) and
  2248. (not assigned(target_info.link) or
  2249. (cs_link_nolink in init_settings.globalswitches)) then
  2250. include(init_settings.globalswitches,cs_link_extern);
  2251. { turn off stripping if compiling with debuginfo or profile }
  2252. if (
  2253. (cs_debuginfo in init_settings.moduleswitches) or
  2254. (cs_profile in init_settings.moduleswitches)
  2255. ) and
  2256. not(cs_link_separate_dbg_file in init_settings.globalswitches) then
  2257. exclude(init_settings.globalswitches,cs_link_strip);
  2258. { force fpu emulation on arm/wince, arm/gba and arm/nds}
  2259. if (target_info.system in [system_arm_wince,system_arm_gba,system_m68k_amiga,
  2260. system_m68k_linux,system_arm_nds])
  2261. {$ifdef arm}
  2262. or (init_settings.fputype=fpu_soft)
  2263. {$endif arm}
  2264. then
  2265. begin
  2266. {$ifdef cpufpemu}
  2267. include(init_settings.moduleswitches,cs_fp_emulation);
  2268. { cs_fp_emulation and fpu_soft are equal on arm }
  2269. init_settings.fputype:=fpu_soft;
  2270. {$endif cpufpemu}
  2271. end;
  2272. { now we can defined cpu and cpu type }
  2273. def_system_macro('CPU'+Cputypestr[init_settings.cputype]);
  2274. def_system_macro('FPU'+fputypestr[init_settings.fputype]);
  2275. {$ifdef ARM}
  2276. { define FPC_DOUBLE_HILO_SWAPPED if needed to properly handle doubles in RTL }
  2277. if (init_settings.fputype in [fpu_fpa,fpu_fpa10,fpu_fpa11]) and
  2278. not(cs_fp_emulation in init_settings.moduleswitches) then
  2279. def_system_macro('FPC_DOUBLE_HILO_SWAPPED');
  2280. {$endif ARM}
  2281. { Section smartlinking conflicts with import sections on Windows }
  2282. if GenerateImportSection and
  2283. (target_info.system in [system_i386_win32,system_x86_64_win64]) then
  2284. exclude(target_info.flags,tf_smartlink_sections);
  2285. {$ifdef x86_64}
  2286. {$warning HACK: turn off smartlinking}
  2287. exclude(init_settings.moduleswitches,cs_create_smart);
  2288. {$endif}
  2289. if not LinkTypeSetExplicitly then
  2290. set_default_link_type;
  2291. { Default alignment settings,
  2292. 1. load the defaults for the target
  2293. 2. override with generic optimizer setting (little size)
  2294. 3. override with the user specified -Oa }
  2295. UpdateAlignment(init_settings.alignment,target_info.alignment);
  2296. if (cs_opt_size in current_settings.optimizerswitches) then
  2297. begin
  2298. init_settings.alignment.procalign:=1;
  2299. init_settings.alignment.jumpalign:=1;
  2300. init_settings.alignment.loopalign:=1;
  2301. end;
  2302. UpdateAlignment(init_settings.alignment,option.paraalignment);
  2303. set_system_macro('FPC_VERSION',version_nr);
  2304. set_system_macro('FPC_RELEASE',release_nr);
  2305. set_system_macro('FPC_PATCH',patch_nr);
  2306. for i:=low(tfeature) to high(tfeature) do
  2307. if i in features then
  2308. def_system_macro('FPC_HAS_FEATURE_'+featurestr[i]);
  2309. option.free;
  2310. Option:=nil;
  2311. end;
  2312. initialization
  2313. coption:=toption;
  2314. finalization
  2315. if assigned(option) then
  2316. option.free;
  2317. end.