fpcmwr.pp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802
  1. {
  2. $Id$
  3. Copyright (c) 2001 by Peter Vreman
  4. FPCMake - Makefile writer
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$ifdef fpc}{$mode objfpc}{$endif}
  12. {$H+}
  13. unit fpcmwr;
  14. interface
  15. uses
  16. sysutils,classes,
  17. fpcmmain;
  18. type
  19. tsections=(sec_none,
  20. sec_units,sec_exes,sec_loaders,sec_examples,
  21. sec_compile,sec_install,
  22. sec_zipinstall,sec_clean,sec_libs,
  23. sec_command,sec_exts,sec_dirs,sec_tools,sec_info
  24. );
  25. trules=(
  26. r_all,r_debug,
  27. r_examples,
  28. r_smart,r_shared,
  29. r_install,r_sourceinstall,r_exampleinstall,r_distinstall,
  30. r_zipinstall,r_zipsourceinstall,r_zipexampleinstall,r_zipdistinstall,
  31. r_clean,r_distclean,r_cleanall,
  32. r_info
  33. );
  34. const
  35. rule2str : array[trules] of string=(
  36. 'all','debug',
  37. 'examples',
  38. 'smart','shared',
  39. 'install','sourceinstall','exampleinstall','distinstall',
  40. 'zipinstall','zipsourceinstall','zipexampleinstall','zipdistinstall',
  41. 'clean','distclean','cleanall',
  42. 'info'
  43. );
  44. rule2sec : array[trules] of tsections=(
  45. sec_compile,sec_compile,
  46. sec_examples,
  47. sec_libs,sec_libs,
  48. sec_install,sec_install,sec_install,sec_install,
  49. sec_zipinstall,sec_zipinstall,sec_zipinstall,sec_zipinstall,
  50. sec_clean,sec_clean,sec_clean,
  51. sec_info
  52. );
  53. type
  54. TMakefileWriter=class
  55. private
  56. FFileName : string;
  57. FIni : TFPCMake;
  58. FInput : TFPCMake;
  59. FOutput : TStringList;
  60. FPhony : string;
  61. FHasSection : array[tsections] of boolean;
  62. procedure LoadFPCMakeIni;
  63. procedure AddIniSection(const s:string);
  64. procedure AddCustomSection(const s:string);
  65. procedure AddTargetVariable(const inivar:string);
  66. procedure AddVariable(const inivar:string);
  67. function AddTargetDefines(const inivar,prefix:string):string;
  68. procedure AddRequiredPackages;
  69. procedure AddTools(const inivar:string);
  70. procedure AddRules;
  71. procedure AddPhony(const s:string);
  72. procedure WritePhony;
  73. procedure AddTargetDirs(const inivar:string);
  74. function CheckTargetVariable(const inivar:string):boolean;
  75. function CheckVariable(const inivar:string):boolean;
  76. public
  77. constructor Create(AFPCMake:TFPCMake;const AFileName:string);
  78. destructor Destroy;override;
  79. procedure WriteGenericMakefile;
  80. end;
  81. implementation
  82. {$i fpcmake.inc}
  83. type
  84. TMyMemoryStream=class(TMemoryStream)
  85. public
  86. constructor Create(p:pointer;mysize:integer);
  87. end;
  88. {*****************************************************************************
  89. Helpers
  90. *****************************************************************************}
  91. function FixVariable(s:string):string;
  92. var
  93. i : integer;
  94. begin
  95. Result:=UpperCase(s);
  96. i:=pos('.',Result);
  97. if i>0 then
  98. Result[i]:='_';
  99. end;
  100. function VarName(const s:string):string;
  101. var
  102. i,j : longint;
  103. begin
  104. i:=0;
  105. result:=s;
  106. while i<length(result) do
  107. begin
  108. inc(i);
  109. case result[i] of
  110. '{' :
  111. begin
  112. { this are pkgs which are hold the dirs between the accolades }
  113. j:=PosIdx('}',result,i);
  114. if j>0 then
  115. Delete(result,i,j-i+1)
  116. else
  117. Delete(result,i,1);
  118. dec(i);
  119. end;
  120. '$','(',')' :
  121. begin
  122. Delete(result,i,1);
  123. dec(i);
  124. end;
  125. 'a'..'z' :
  126. result[i]:=chr(ord(result[i])-32);
  127. end;
  128. end;
  129. end;
  130. procedure AddStrNoDup(var s:string;const s2:string);
  131. var
  132. i,idx : longint;
  133. again,add : boolean;
  134. begin
  135. add:=false;
  136. idx:=0;
  137. repeat
  138. again:=false;
  139. i:=posidx(s2,s,idx);
  140. if (i=0) then
  141. add:=true
  142. else
  143. if (i=1) then
  144. begin
  145. if (length(s)>length(s2)) and
  146. (s[length(s2)+1]<>' ') then
  147. add:=true;
  148. end
  149. else
  150. if (i>1) and
  151. ((s[i-1]<>' ') or
  152. ((length(s)>=i+length(s2)) and (s[i+length(s2)]<>' '))) then
  153. begin
  154. idx:=i+length(s2);
  155. again:=true;
  156. end;
  157. until not again;
  158. if add then
  159. begin
  160. if s='' then
  161. s:=s2
  162. else
  163. s:=s+' '+s2;
  164. end;
  165. end;
  166. procedure FixTab(sl:TStringList);
  167. var
  168. i,j,k : integer;
  169. s,s2 : string;
  170. begin
  171. i:=0;
  172. while (i<sl.Count) do
  173. begin
  174. if (sl[i]<>'') and (sl[i][1] in [' ',#9]) then
  175. begin
  176. s:=sl[i];
  177. k:=0;
  178. j:=0;
  179. repeat
  180. inc(j);
  181. case s[j] of
  182. ' ' :
  183. inc(k);
  184. #9 :
  185. k:=(k+7) and not(7);
  186. else
  187. break;
  188. end;
  189. until (j=length(s));
  190. if k>7 then
  191. begin
  192. s2:='';
  193. Delete(s,1,j-1);
  194. while (k>7) do
  195. begin
  196. s2:=s2+#9;
  197. dec(k,8);
  198. end;
  199. while (k>0) do
  200. begin
  201. s2:=s2+' ';
  202. dec(k);
  203. end;
  204. sl[i]:=s2+s;
  205. end;
  206. end;
  207. inc(i);
  208. end;
  209. end;
  210. {*****************************************************************************
  211. TMyMemoryStream
  212. *****************************************************************************}
  213. constructor TMyMemoryStream.Create(p:pointer;mysize:integer);
  214. begin
  215. inherited Create;
  216. SetPointer(p,mysize);
  217. end;
  218. {*****************************************************************************
  219. TMyMemoryStream
  220. *****************************************************************************}
  221. constructor TMakefileWriter.Create(AFPCMake:TFPCMake;const AFileName:string);
  222. begin
  223. FInput:=AFPCMake;
  224. FFileName:=AFileName;
  225. FOutput:=TStringList.Create;
  226. FPhony:='';
  227. FillChar(FHasSection,sizeof(FHasSection),1);
  228. LoadFPCMakeIni;
  229. end;
  230. destructor TMakefileWriter.Destroy;
  231. begin
  232. FOutput.Free;
  233. FIni.Free;
  234. end;
  235. procedure TMakefileWriter.LoadFPCMakeIni;
  236. var
  237. IniStream : TStream;
  238. begin
  239. try
  240. IniStream:=TMyMemoryStream.Create(@fpcmakeini,sizeof(fpcmakeini));
  241. FIni:=TFPCMake.CreateFromStream(IniStream,'fpcmake.ini');
  242. { Leave the '#' comments in the output }
  243. // FIni.CommentChars:=[';'];
  244. FIni.LoadSections;
  245. finally
  246. IniStream.Destroy;
  247. end;
  248. end;
  249. procedure TMakefileWriter.AddIniSection(const s:string);
  250. var
  251. Sec : TFPCMakeSection;
  252. begin
  253. Sec:=TFPCMakeSection(FIni[s]);
  254. if assigned(Sec) then
  255. FOutput.AddStrings(Sec.List)
  256. else
  257. Raise Exception.Create(Format('Section "%s" doesn''t exists in fpcmake.ini',[s]));
  258. end;
  259. procedure TMakefileWriter.AddCustomSection(const s:string);
  260. var
  261. Sec : TFPCMakeSection;
  262. begin
  263. Sec:=TFPCMakeSection(FInput[s]);
  264. if assigned(Sec) then
  265. begin
  266. Sec.BuildMakefile;
  267. FOutput.AddStrings(Sec.List);
  268. end;
  269. end;
  270. function TMakefileWriter.CheckTargetVariable(const inivar:string):boolean;
  271. var
  272. t : TTarget;
  273. begin
  274. result:=false;
  275. if FInput.GetVariable(IniVar,false)<>'' then
  276. begin
  277. result:=true;
  278. exit;
  279. end;
  280. for t:=low(TTarget) to high(TTarget) do
  281. if FInput.GetVariable(IniVar+TargetSuffix[t],false)<>'' then
  282. begin
  283. result:=true;
  284. exit;
  285. end;
  286. end;
  287. function TMakefileWriter.CheckVariable(const inivar:string):boolean;
  288. begin
  289. Result:=(FInput.GetVariable(IniVar,false)<>'');
  290. end;
  291. procedure TMakefileWriter.AddTargetVariable(const inivar:string);
  292. var
  293. s : string;
  294. T : TTarget;
  295. begin
  296. s:=FInput.GetVariable(IniVar,false);
  297. if s<>'' then
  298. FOutput.Add('override '+FixVariable(IniVar)+'+='+s);
  299. for t:=low(TTarget) to high(TTarget) do
  300. begin
  301. s:=FInput.GetVariable(IniVar+TargetSuffix[t],false);
  302. if s<>'' then
  303. begin
  304. FOutput.Add('ifeq ($(OS_TARGET),'+TargetStr[t]+')');
  305. FOutput.Add('override '+FixVariable(IniVar)+'+='+s);
  306. FOutput.Add('endif');
  307. end;
  308. end;
  309. end;
  310. procedure TMakefileWriter.AddVariable(const inivar:string);
  311. var
  312. s : string;
  313. begin
  314. s:=FInput.GetVariable(IniVar,false);
  315. if s<>'' then
  316. FOutput.Add('override '+FixVariable(IniVar)+'='+s)
  317. end;
  318. function TMakefileWriter.AddTargetDefines(const inivar,prefix:string):string;
  319. var
  320. s : string;
  321. T : TTarget;
  322. name : string;
  323. k1,k2 : integer;
  324. begin
  325. result:='';
  326. s:=FInput.GetVariable(IniVar,false);
  327. repeat
  328. name:=GetToken(s);
  329. if Name='' then
  330. break;
  331. { Remove (..) }
  332. k1:=pos('(',name);
  333. if k1>0 then
  334. begin
  335. k2:=PosIdx(')',name,k1);
  336. if k2=0 then
  337. k2:=length(name)+1;
  338. Delete(Name,k1,k2);
  339. end;
  340. FOutput.Add(prefix+VarName(name)+'=1');
  341. { add to the list of dirs without duplicates }
  342. AddStrNoDup(result,name);
  343. until false;
  344. for t:=low(TTarget) to high(TTarget) do
  345. begin
  346. s:=FInput.GetVariable(IniVar+TargetSuffix[t],false);
  347. if s<>'' then
  348. begin
  349. FOutput.Add('ifeq ($(OS_TARGET),'+TargetStr[t]+')');
  350. repeat
  351. Name:=GetToken(s);
  352. if Name='' then
  353. break;
  354. { Remove (..) }
  355. k1:=pos('(',name);
  356. if k1>0 then
  357. begin
  358. k2:=PosIdx(')',name,k1);
  359. if k2=0 then
  360. k2:=length(name)+1;
  361. Delete(Name,k1,k2);
  362. end;
  363. FOutput.Add(prefix+VarName(name)+'=1');
  364. { add to the list of dirs without duplicates }
  365. AddStrNoDup(result,name);
  366. until false;
  367. FOutput.Add('endif');
  368. end;
  369. end;
  370. end;
  371. procedure TMakefileWriter.AddTools(const inivar:string);
  372. procedure AddTool(const exename:string);
  373. var
  374. varname : string;
  375. begin
  376. with FOutput do
  377. begin
  378. varname:=FixVariable(exename);
  379. Add('ifndef '+varname);
  380. Add(varname+':=$(strip $(wildcard $(addsuffix /'+exename+'$(SRCEXEEXT),$(SEARCHPATH))))');
  381. Add('ifeq ($('+varname+'),)');
  382. Add(varname+'=');
  383. Add('else');
  384. Add(varname+':=$(firstword $('+varname+'))');
  385. Add('endif');
  386. Add('endif');
  387. Add('export '+varname);
  388. end;
  389. end;
  390. var
  391. hs,tool : string;
  392. begin
  393. hs:=FInput.GetVariable(inivar,false);
  394. repeat
  395. Tool:=GetToken(hs);
  396. if Tool='' then
  397. break;
  398. AddTool(Tool);
  399. until false;
  400. end;
  401. procedure TMakefileWriter.AddRules;
  402. procedure AddRule(rule:trules);
  403. var
  404. i : integer;
  405. hs : string;
  406. Sec : TFPCMakeSection;
  407. Rules : TStringList;
  408. begin
  409. Sec:=TFPCMakeSection(FInput['rules']);
  410. if assigned(Sec) then
  411. begin
  412. Rules:=Sec.List;
  413. for i:=0 to Rules.Count-1 do
  414. begin
  415. if (length(rules[i])>length(rule2str[rule])) and
  416. (rules[i][1]=rule2str[rule][1]) and
  417. ((rules[i][length(rule2str[rule])+1]=':') or
  418. ((length(rules[i])>length(rule2str[rule])+1) and
  419. (rules[i][length(rule2str[rule])+2]=':'))) and
  420. (Copy(rules[i],1,length(rule2str[rule]))=rule2str[rule]) then
  421. exit;
  422. end;
  423. end;
  424. hs:='';
  425. if FHasSection[Rule2Sec[rule]] then
  426. hs:=hs+' fpc_'+rule2str[rule];
  427. { include target dirs }
  428. if CheckTargetVariable('target_dirs') then
  429. begin
  430. if CheckVariable('default_dir') then
  431. hs:=hs+' $(addsuffix _'+rule2str[rule]+',$(DEFAULT_DIR))'
  432. else
  433. if not(rule in [r_sourceinstall,r_zipinstall,r_zipsourceinstall]) or
  434. not(CheckVariable('package_name')) then
  435. hs:=hs+' $(addsuffix _'+rule2str[rule]+',$(TARGET_DIRS))';
  436. end;
  437. { include cleaning of example dirs }
  438. if (rule=r_clean) and
  439. CheckTargetVariable('target_exampledirs') then
  440. hs:=hs+' $(addsuffix _'+rule2str[rule]+',$(TARGET_EXAMPLEDIRS))';
  441. { Add the rule }
  442. AddPhony(Rule2Str[Rule]);
  443. FOutput.Add(rule2str[rule]+':'+hs);
  444. end;
  445. var
  446. rule : trules;
  447. begin
  448. for rule:=low(trules) to high(trules) do
  449. AddRule(rule);
  450. WritePhony;
  451. end;
  452. procedure TMakefileWriter.AddPhony(const s:string);
  453. begin
  454. FPhony:=FPhony+' '+s;
  455. end;
  456. procedure TMakefileWriter.WritePhony;
  457. begin
  458. if FPhony<>'' then
  459. begin
  460. FOutput.Add('.PHONY:'+FPhony);
  461. FPhony:='';
  462. end;
  463. end;
  464. procedure TMakefileWriter.AddTargetDirs(const inivar:string);
  465. procedure AddTargetDir(const s,defpref:string);
  466. var
  467. j : trules;
  468. begin
  469. FOutput.Add('ifdef '+defpref+VarName(s));
  470. for j:=low(trules) to high(trules) do
  471. begin
  472. FOutput.Add(s+'_'+rule2str[j]+':');
  473. FOutput.Add(#9+'$(MAKE) -C '+s+' '+rule2str[j]);
  474. AddPhony(s+'_'+rule2str[j]);
  475. end;
  476. FOutput.Add(s+':');
  477. FOutput.Add(#9+'$(MAKE) -C '+s+' all');
  478. AddPhony(s);
  479. WritePhony;
  480. FOutput.Add('endif');
  481. end;
  482. var
  483. hs,dir : string;
  484. prefix : string;
  485. begin
  486. prefix:=FixVariable(inivar)+'_';
  487. hs:=AddTargetDefines(inivar,prefix);
  488. repeat
  489. Dir:=GetToken(hs);
  490. if Dir='' then
  491. break;
  492. AddTargetDir(Dir,prefix);
  493. until false;
  494. end;
  495. procedure TMakefileWriter.AddRequiredPackages;
  496. procedure AddPackage(const pack,prefix:string);
  497. var
  498. packdirvar,unitdirvar : string;
  499. begin
  500. FOutput.Add('ifdef '+Prefix+VarName(pack));
  501. { create needed variables }
  502. packdirvar:='PACKAGEDIR_'+VarName(pack);
  503. unitdirvar:='UNITDIR_'+VarName(pack);
  504. { Search packagedir by looking for Makefile.fpc }
  505. FOutput.Add(packdirvar+':=$(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /'+pack+'/Makefile.fpc,$(PACKAGESDIR)))))');
  506. FOutput.Add('ifneq ($('+packdirvar+'),)');
  507. FOutput.Add(packdirvar+':=$(firstword $('+packdirvar+'))');
  508. { If Packagedir found look for FPCMade }
  509. FOutput.Add('ifeq ($(wildcard $('+packdirvar+')/$(FPCMADE)),)');
  510. FOutput.Add('override COMPILEPACKAGES+=package_'+pack);
  511. AddPhony('package_'+pack);
  512. FOutput.Add('package_'+pack+':');
  513. FOutput.Add(#9'$(MAKE) -C $('+packdirvar+') all');
  514. FOutput.Add('endif');
  515. { Create unit dir, check if os dependent dir exists }
  516. FOutput.Add('ifneq ($(wildcard $('+packdirvar+')/$(OS_TARGET)),)');
  517. FOutput.Add(unitdirvar+'=$('+packdirvar+')/$(OS_TARGET)');
  518. FOutput.Add('else');
  519. FOutput.Add(unitdirvar+'=$('+packdirvar+')');
  520. FOutput.Add('endif');
  521. { Package dir doesn't exists, check unit dir }
  522. FOutput.Add('else');
  523. FOutput.Add(packdirvar+'=');
  524. FOutput.Add(unitdirvar+':=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /'+pack+'/Package.fpc,$(UNITSDIR)))))');
  525. FOutput.Add('ifneq ($('+unitdirvar+'),)');
  526. FOutput.Add(unitdirvar+':=$(firstword $('+unitdirvar+'))');
  527. FOutput.Add('else');
  528. FOutput.Add(unitdirvar+'=');
  529. FOutput.Add('endif');
  530. FOutput.Add('endif');
  531. { Add Unit dir to the command line -Fu }
  532. FOutput.Add('ifdef '+unitdirvar);
  533. FOutput.Add('override COMPILER_UNITDIR+=$('+unitdirvar+')');
  534. FOutput.Add('endif');
  535. { endif for package }
  536. FOutput.Add('endif');
  537. end;
  538. var
  539. i : integer;
  540. reqs,req,prefix : string;
  541. t : Ttarget;
  542. sl : TStringList;
  543. begin
  544. prefix:='REQUIRE_PACKAGES_';
  545. reqs:='';
  546. { Add target defines }
  547. for t:=low(ttarget) to high(ttarget) do
  548. begin
  549. sl:=FInput.GetTargetRequires(t);
  550. if sl.count>0 then
  551. begin
  552. FOutput.Add('ifeq ($(OS_TARGET),'+TargetStr[t]+')');
  553. for i:=0 to sl.count-1 do
  554. begin
  555. FOutput.Add(prefix+VarName(sl[i])+'=1');
  556. AddStrNoDup(reqs,sl[i]);
  557. end;
  558. FOutput.Add('endif');
  559. end;
  560. sl.Free;
  561. end;
  562. { Add all require packages }
  563. repeat
  564. req:=GetToken(reqs);
  565. if Req='' then
  566. break;
  567. AddPackage(req,prefix);
  568. until false;
  569. WritePhony;
  570. end;
  571. procedure TMakefileWriter.WriteGenericMakefile;
  572. begin
  573. with FOutput do
  574. begin
  575. { Turn some sections off }
  576. if not FInput.IsPackage then
  577. FHasSection[sec_zipinstall]:=false;
  578. { Header }
  579. Add('#');
  580. Add('# Don''t edit, this file is generated by '+TitleDate);
  581. Add('#');
  582. if CheckVariable('default_rule') then
  583. Add('default: '+FInput.GetVariable('default_rule',false))
  584. else
  585. Add('default: all');
  586. { Add automatic detect sections }
  587. AddIniSection('osdetect');
  588. { Forced target }
  589. if CheckVariable('default_target') then
  590. Add('override OS_TARGET='+FInput.GetVariable('default_target',false));
  591. if CheckVariable('default_cpu') then
  592. Add('override CPU_TARGET='+FInput.GetVariable('default_cpu',false));
  593. { FPC Detection }
  594. AddIniSection('fpcdetect');
  595. AddIniSection('fpcdircheckenv');
  596. if CheckVariable('default_fpcdir') then
  597. begin
  598. Add('ifeq ($(FPCDIR),wrong)');
  599. Add('override FPCDIR='+FInput.GetVariable('default_fpcdir',false));
  600. Add('ifeq ($(wildcard $(FPCDIR)/rtl),)');
  601. Add('ifeq ($(wildcard $(FPCDIR)/units),)');
  602. Add('override FPCDIR=wrong');
  603. Add('endif');
  604. Add('endif');
  605. Add('endif');
  606. end;
  607. AddIniSection('fpcdirdetect');
  608. { Package }
  609. AddVariable('package_name');
  610. AddVariable('package_version');
  611. { First add the required packages sections }
  612. // for i:=0 to FInput.RequireList.Count-1 do
  613. // AddCustomSection(FInput.Requirelist[i]);
  614. { prerules section }
  615. if assigned(FInput['prerules']) then
  616. AddStrings(TFPCMakeSection(FInput['prerules']).List);
  617. { Default }
  618. AddVariable('default_dir');
  619. { Targets }
  620. AddTargetVariable('target_dirs');
  621. AddTargetVariable('target_programs');
  622. AddTargetVariable('target_units');
  623. AddTargetVariable('target_loaders');
  624. AddTargetVariable('target_rsts');
  625. AddTargetVariable('target_examples');
  626. AddTargetVariable('target_exampledirs');
  627. { Clean }
  628. AddTargetVariable('clean_units');
  629. AddTargetVariable('clean_files');
  630. { Install }
  631. AddTargetVariable('install_units');
  632. AddTargetVariable('install_files');
  633. AddVariable('install_prefixdir');
  634. AddVariable('install_basedir');
  635. AddVariable('install_datadir');
  636. AddVariable('install_fpcpackage');
  637. { Dist }
  638. AddVariable('dist_zipname');
  639. AddVariable('dist_ziptarget');
  640. { Compiler }
  641. AddTargetVariable('compiler_options');
  642. AddTargetVariable('compiler_version');
  643. AddTargetVariable('compiler_includedir');
  644. AddTargetVariable('compiler_unitdir');
  645. AddTargetVariable('compiler_sourcedir');
  646. AddTargetVariable('compiler_objectdir');
  647. AddTargetVariable('compiler_librarydir');
  648. AddTargetVariable('compiler_targetdir');
  649. AddTargetVariable('compiler_unittargetdir');
  650. { default dirs/tools/extensions }
  651. AddIniSection('shelltools');
  652. AddIniSection('defaulttools');
  653. AddIniSection('extensions');
  654. AddIniSection('defaultdirs');
  655. if FInput.CheckLibcRequire then
  656. AddIniSection('dirlibc');
  657. { Required packages }
  658. AddRequiredPackages;
  659. { commandline }
  660. AddIniSection('command_begin');
  661. if FInput.CheckLibcRequire then
  662. AddIniSection('command_libc');
  663. AddIniSection('command_end');
  664. { compile }
  665. if CheckTargetVariable('target_loaders') then
  666. AddIniSection('loaderrules');
  667. if CheckTargetVariable('target_units') then
  668. AddIniSection('unitrules');
  669. if CheckTargetVariable('target_programs') then
  670. AddIniSection('exerules');
  671. if CheckTargetVariable('target_rsts') then
  672. AddIniSection('rstrules');
  673. if CheckTargetVariable('target_examples') or
  674. CheckTargetVariable('target_exampledirs') then
  675. AddIniSection('examplerules');
  676. AddIniSection('compilerules');
  677. if CheckVariable('lib_name') then
  678. AddIniSection('libraryrules');
  679. { install }
  680. AddIniSection('installrules');
  681. if FHasSection[sec_zipinstall] then
  682. AddIniSection('zipinstallrules');
  683. { clean }
  684. AddIniSection('cleanrules');
  685. { info }
  686. AddIniSection('inforules');
  687. { Subdirs }
  688. AddTargetDirs('target_dirs');
  689. AddTargetDirs('target_exampledirs');
  690. { Tools }
  691. AddTools('require_tools');
  692. { Rules }
  693. AddRules;
  694. { Users own rules }
  695. AddIniSection('localmakefile');
  696. AddIniSection('userrules');
  697. if assigned(FInput['rules']) then
  698. AddStrings(TFPCMakeSection(FInput['rules']).List);
  699. end;
  700. { write to disk }
  701. Fixtab(FOutput);
  702. FOutput.SaveToFile(FFileName);
  703. end;
  704. end.
  705. {
  706. $Log$
  707. Revision 1.7 2001-05-03 21:35:10 peter
  708. * Makefile fixes
  709. Revision 1.6 2001/02/24 10:44:33 peter
  710. * another fix for internal variable checking
  711. Revision 1.5 2001/02/22 21:11:24 peter
  712. * fpcdir detection added
  713. * fixed loading of variables in fpcmake itself
  714. Revision 1.4 2001/02/20 21:49:31 peter
  715. * fixed change variable accessing using _ instead of .
  716. Revision 1.3 2001/02/01 22:00:10 peter
  717. * default.fpcdir is back
  718. * subdir requirement checking works, but not very optimal yet as
  719. it can load the same Makefile.fpc multiple times
  720. Revision 1.2 2001/01/29 21:49:10 peter
  721. * lot of updates
  722. Revision 1.1 2001/01/24 21:59:36 peter
  723. * first commit of new fpcmake
  724. }