fpcmake.pp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. {
  2. $Id$
  3. Copyright (c) 1999 by Peter Vreman
  4. Convert Makefile.fpc to Makefile
  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. program fpcmake;
  14. uses
  15. {$ifdef go32v2}
  16. dpmiexcp,
  17. {$endif}
  18. dos,
  19. sysutils,classes,inifiles;
  20. const
  21. Version='v0.99.13';
  22. Title='fpcmake '+Version;
  23. { Include default fpcmake.ini }
  24. {$i fpcmake.inc}
  25. type
  26. tsections=(sec_none,
  27. sec_units,sec_exes,sec_loaders,sec_examples,
  28. sec_compile,sec_depend,sec_install,sec_zipinstall,
  29. sec_clean,sec_libs,sec_command,sec_exts,sec_dirs,sec_tools,sec_info
  30. );
  31. const
  32. EnvVar='FPCMAKEINI'; { should be FPCMAKE in the future }
  33. TimeFormat='yyyy/mm/dd hh:nn';
  34. sectionstr : array[tsections] of string=('none',
  35. 'units','exes','loaders','examples',
  36. 'compile','depend','install','zipinstall',
  37. 'clean','libs','command','exts','dirs','tools','info'
  38. );
  39. sectiondef : array[tsections] of boolean=(false,
  40. true,true,false,false,
  41. true,false,true,true,
  42. true,true,true,true,true,true,true
  43. );
  44. targets=4;
  45. targetstr : array[1..targets] of string=(
  46. 'linux','go32v2','win32','os2'
  47. );
  48. rules=14;
  49. rulestr : array[1..rules] of string=(
  50. 'all','debug',
  51. 'examples','test',
  52. 'smart','shared',
  53. 'showinstall','install','zipinstall','zipinstalladd',
  54. 'clean','cleanall',
  55. 'depend','info'
  56. );
  57. rule2sec : array[1..rules] of tsections=(
  58. sec_compile,sec_compile,
  59. sec_examples,sec_examples,
  60. sec_libs,sec_libs,
  61. sec_install,sec_install,sec_zipinstall,sec_zipinstall,
  62. sec_clean,sec_clean,
  63. sec_depend,sec_info
  64. );
  65. { Sections in Makefile.fpc }
  66. ini_sections='sections';
  67. ini_install='install';
  68. ini_clean='clean';
  69. ini_dirs='dirs';
  70. ini_packages='packages';
  71. ini_libs='libs';
  72. ini_targets='targets';
  73. ini_info='info';
  74. ini_defaults='defaults';
  75. ini_tools='tools';
  76. type
  77. TTargetsString=array[0..targets] of string;
  78. TFpcMake=record
  79. TargetDirs,
  80. TargetLoaders,
  81. TargetUnits,
  82. TargetPrograms,
  83. TargetExamples,
  84. InstallUnits,
  85. InstallFiles,
  86. CleanUnits,
  87. CleanFiles : TTargetsString;
  88. DefaultRule,
  89. DefaultTarget,
  90. DefaultCPU,
  91. DefaultOptions : string;
  92. DirFpc,
  93. DirPackage,
  94. DirUnit,
  95. DirLib,
  96. DirObj,
  97. DirTarget,
  98. DirUnitTarget,
  99. DirSources,
  100. DirInc : string;
  101. PackageFCL : boolean;
  102. Packages : string;
  103. LibName,
  104. LibUnits : string;
  105. LibGCC,
  106. LibOther : boolean;
  107. InfoCfg,
  108. InfoDirs,
  109. InfoTools,
  110. InfoInstall,
  111. InfoObjects : boolean;
  112. Section : array[tsections] of boolean;
  113. ToolsPPDep,
  114. ToolsPPUMove,
  115. ToolsPPUFiles,
  116. ToolsData2Inc,
  117. ToolsSed,
  118. ToolsDiff,
  119. ToolsCmp,
  120. ToolsUpx,
  121. ToolsDate,
  122. ToolsZip : boolean;
  123. PreSettings,
  124. PostSettings,
  125. Rules : TStringList;
  126. end;
  127. TMyMemoryStream=class(TMemoryStream)
  128. public
  129. constructor Create(p:pointer;mysize:integer);
  130. end;
  131. var
  132. userini : TFpcMake;
  133. fpcini : TIniFile;
  134. IniStream : TMyMemoryStream;
  135. {*****************************************************************************
  136. Helpers
  137. *****************************************************************************}
  138. procedure Verbose(s:string);
  139. begin
  140. writeln(s);
  141. end;
  142. procedure Error(s:string);
  143. begin
  144. Writeln(s);
  145. Halt(1);
  146. end;
  147. function TargetStringEmpty(const t:TTargetsString):boolean;
  148. var
  149. i : integer;
  150. begin
  151. for i:=0 to targets do
  152. if t[i]<>'' then
  153. begin
  154. TargetStringEmpty:=false;
  155. exit;
  156. end;
  157. TargetStringEmpty:=true;
  158. end;
  159. {*****************************************************************************
  160. TMyMemoryStream
  161. *****************************************************************************}
  162. constructor TMyMemoryStream.Create(p:pointer;mysize:integer);
  163. begin
  164. inherited Create;
  165. SetPointer(p,mysize);
  166. end;
  167. {*****************************************************************************
  168. Makefile.fpc reading
  169. *****************************************************************************}
  170. function ReadMakefilefpc:boolean;
  171. var
  172. fn : string;
  173. ini : TIniFile;
  174. procedure ReadTargetsString(var t:Ttargetsstring;const sec,name,def:string);
  175. var
  176. i : integer;
  177. begin
  178. t[0]:=ini.ReadString(sec,name,def);
  179. for i:=1 to targets do
  180. t[i]:=ini.ReadString(sec,name+'_'+targetstr[i],'');
  181. end;
  182. var
  183. sec : tsections;
  184. begin
  185. ReadMakefilefpc:=false;
  186. if FileExists('Makefile.fpc') then
  187. fn:='Makefile.fpc'
  188. else
  189. if FileExists('makefile.fpc') then
  190. fn:='makefile.fpc'
  191. else
  192. exit;
  193. Verbose('Reading '+fn);
  194. ini:=TIniFile.Create(fn);
  195. with userini,ini do
  196. begin
  197. { targets }
  198. ReadTargetsString(TargetDirs,ini_targets,'dirs','');
  199. ReadTargetsString(TargetLoaders,ini_targets,'loaders','');
  200. ReadTargetsString(TargetUnits,ini_targets,'units','');
  201. ReadTargetsString(TargetPrograms,ini_targets,'programs','');
  202. ReadTargetsString(TargetExamples,ini_targets,'examples','');
  203. { clean }
  204. ReadTargetsString(CleanUnits,ini_clean,'units','');
  205. ReadTargetsString(CleanFiles,ini_clean,'files','');
  206. { install }
  207. ReadTargetsString(InstallUnits,ini_install,'units','');
  208. ReadTargetsString(InstallFiles,ini_install,'files','');
  209. { defaults }
  210. DefaultRule:=ReadString(ini_defaults,'defaultrule','all');
  211. DefaultTarget:=ReadString(ini_defaults,'defaulttarget','');
  212. DefaultCPU:=ReadString(ini_defaults,'defaultcpu','');
  213. DefaultOptions:=ReadString(ini_defaults,'defaultoptions','');
  214. { packages }
  215. Packages:=Readstring(ini_packages,'packages','');
  216. PackageFCL:=ReadBool(ini_packages,'fcl',false);
  217. { dirs }
  218. DirFpc:=ReadString(ini_dirs,'fpcdir','');
  219. DirPackage:=ReadString(ini_dirs,'packagedir','$(FPCDIR)/packages');
  220. DirUnit:=ReadString(ini_dirs,'unitdir','');
  221. DirLib:=ReadString(ini_dirs,'libdir','');
  222. DirObj:=ReadString(ini_dirs,'objdir','');
  223. DirTarget:=ReadString(ini_dirs,'targetdir','');
  224. DirSources:=ReadString(ini_dirs,'sourcesdir','');
  225. DirUnitTarget:=ReadString(ini_dirs,'unittargetdir','');
  226. DirInc:=ReadString(ini_dirs,'incdir','');
  227. { libs }
  228. LibName:=ReadString(ini_libs,'libname','');
  229. LibUnits:=ReadString(ini_libs,'libunits','');
  230. LibGcc:=ReadBool(ini_libs,'libgcc',false);
  231. LibOther:=ReadBool(ini_libs,'libother',false);
  232. { tools }
  233. ToolsPPDep:=ReadBool(ini_tools,'toolppdep',true);
  234. ToolsPPUMove:=ReadBool(ini_tools,'toolppumove',true);
  235. ToolsPPUFiles:=ReadBool(ini_tools,'toolppufiles',true);
  236. ToolsSed:=ReadBool(ini_tools,'toolsed',false);
  237. ToolsData2Inc:=ReadBool(ini_tools,'tooldata2inc',false);
  238. ToolsDiff:=ReadBool(ini_tools,'tooldiff',false);
  239. ToolsCmp:=ReadBool(ini_tools,'toolcmp',false);
  240. ToolsUpx:=ReadBool(ini_tools,'toolupx',true);
  241. ToolsDate:=ReadBool(ini_tools,'tooldate',true);
  242. ToolsZip:=ReadBool(ini_tools,'toolzip',true);
  243. { sections, but allow overriding the 'none' option to include a few sects only }
  244. for sec:=low(tsections) to high(tsections) do
  245. Section[sec]:=sectiondef[sec];
  246. Section[sec_None]:=ReadBool(ini_sections,sectionstr[sec_none],sectiondef[sec_none]);
  247. if Section[sec_None] then
  248. FillChar(Section,sizeof(Section),0);
  249. for sec:=low(tsections) to high(tsections) do
  250. Section[sec]:=ReadBool(ini_sections,sectionstr[sec],section[sec]);
  251. { turn on needed sections }
  252. if not TargetStringEmpty(TargetLoaders) then
  253. userini.section[sec_loaders]:=true;
  254. if not TargetStringEmpty(TargetUnits) then
  255. userini.section[sec_units]:=true;
  256. if not TargetStringEmpty(TargetPrograms) then
  257. userini.section[sec_exes]:=true;
  258. if not TargetStringEmpty(TargetExamples) then
  259. userini.section[sec_examples]:=true;
  260. { info }
  261. InfoCfg:=ReadBool(ini_info,'infoconfig',true);
  262. InfoDirs:=ReadBool(ini_info,'infodirs',false);
  263. InfoTools:=ReadBool(ini_info,'infotools',false);
  264. InfoInstall:=ReadBool(ini_info,'infoinstall',true);
  265. InfoObjects:=ReadBool(ini_info,'infoobjects',true);
  266. { rules }
  267. PreSettings:=TStringList.Create;
  268. ReadSectionRaw('presettings',PreSettings);
  269. { rules }
  270. PostSettings:=TStringList.Create;
  271. ReadSectionRaw('postsettings',PostSettings);
  272. { rules }
  273. rules:=TStringList.Create;
  274. ReadSectionRaw('rules',rules);
  275. end;
  276. ini.Destroy;
  277. ReadMakefilefpc:=true;
  278. end;
  279. {*****************************************************************************
  280. userini.ini loading
  281. *****************************************************************************}
  282. function ReadFpcMakeIni:TIniFile;
  283. var
  284. fn : string;
  285. begin
  286. ReadFpcMakeIni:=nil;
  287. if FileExists('fpcmake.ini') then
  288. fn:='fpcmake.ini'
  289. else
  290. if (FileExists(GetEnv(envvar))) then
  291. fn:=GetEnv(envvar)
  292. else
  293. {$ifdef linux}
  294. if FileExists('/usr/lib/fpc/fpcmake.ini') then
  295. fn:='/usr/lib/fpc/fpcmake.ini'
  296. {$else}
  297. if FileExists(ChangeFileExt(paramstr(0),'.ini')) then
  298. fn:=ChangeFileExt(paramstr(0),'.ini')
  299. {$endif}
  300. else
  301. fn:='';
  302. if fn='' then
  303. begin
  304. Verbose('Opening internal ini');
  305. IniStream:=TMyMemoryStream.Create(@fpcmakeini,sizeof(fpcmakeini));
  306. result:=TIniFile.Create(IniStream);
  307. end
  308. else
  309. begin
  310. Verbose('Opening '+fn);
  311. result:=TIniFile.Create(fn);
  312. end;
  313. end;
  314. {*****************************************************************************
  315. Makefile writing
  316. *****************************************************************************}
  317. function WriteMakefile:boolean;
  318. var
  319. mf : TStringList;
  320. ss : TStringList;
  321. procedure FixTab(sl:TStringList);
  322. var
  323. i,j,k : integer;
  324. s,s2 : string;
  325. begin
  326. i:=0;
  327. while (i<sl.Count) do
  328. begin
  329. if (sl[i]<>'') and (sl[i][1] in [' ',#9]) then
  330. begin
  331. s:=sl[i];
  332. k:=0;
  333. j:=0;
  334. repeat
  335. inc(j);
  336. case s[j] of
  337. ' ' :
  338. inc(k);
  339. #9 :
  340. k:=(k+7) and not(7);
  341. else
  342. break;
  343. end;
  344. until (j=length(s));
  345. if k>7 then
  346. begin
  347. s2:='';
  348. Delete(s,1,j-1);
  349. while (k>7) do
  350. begin
  351. s2:=s2+#9;
  352. dec(k,8);
  353. end;
  354. while (k>0) do
  355. begin
  356. s2:=s2+' ';
  357. dec(k);
  358. end;
  359. sl[i]:=s2+s;
  360. end;
  361. end;
  362. inc(i);
  363. end;
  364. end;
  365. procedure AddHead(const s:string);
  366. begin
  367. mf.Add('');
  368. mf.Add('# '+s);
  369. mf.Add('');
  370. end;
  371. procedure AddSection(b:boolean;s:string);
  372. begin
  373. if b then
  374. begin
  375. ss.Clear;
  376. fpcini.ReadSectionRaw(s,ss);
  377. mf.AddStrings(ss);
  378. mf.Add('');
  379. end;
  380. end;
  381. procedure AddRule(rule:integer);
  382. var
  383. i : integer;
  384. hs : string;
  385. begin
  386. i:=0;
  387. while (i<userini.rules.Count) do
  388. begin
  389. if (length(userini.rules[i])>length(rulestr[rule])) and
  390. (userini.rules[i][1]=rulestr[rule][1]) and
  391. ((userini.rules[i][length(rulestr[rule])+1]=':') or
  392. ((length(userini.rules[i])>length(rulestr[rule])+1) and
  393. (userini.rules[i][length(rulestr[rule])+2]=':'))) and
  394. (Copy(userini.rules[i],1,length(rulestr[rule]))=rulestr[rule]) then
  395. exit;
  396. inc(i);
  397. end;
  398. hs:='';
  399. if userini.section[rule2sec[rule]] then
  400. hs:=hs+' fpc_'+rulestr[rule];
  401. if not TargetStringEmpty(userini.targetdirs) then
  402. hs:=hs+' $(addsuffix _'+rulestr[rule]+',$(DIROBJECTS))';
  403. if hs<>'' then
  404. begin
  405. mf.Add(rulestr[rule]+':'+hs);
  406. mf.Add('');
  407. end;
  408. end;
  409. procedure AddTargets(const pre:string;var t:TTargetsString;wildcard:boolean);
  410. var
  411. i : integer;
  412. begin
  413. for i:=0 to targets do
  414. if (t[i]<>'') then
  415. begin
  416. if i<>0 then
  417. mf.Add('ifeq ($(OS_TARGET),'+targetstr[i]+')');
  418. if t[i]<>'' then
  419. begin
  420. if wildcard then
  421. mf.Add(pre+'+=$(wildcard '+t[i]+')')
  422. else
  423. mf.Add(pre+'+='+t[i]);
  424. end;
  425. if i<>0 then
  426. mf.Add('endif');
  427. end;
  428. end;
  429. procedure AddTargetDir(const s:string);
  430. var
  431. j : integer;
  432. begin
  433. AddHead('Dir '+s);
  434. for j:=1to rules do
  435. begin
  436. mf.Add(s+'_'+rulestr[j]+':');
  437. mf.Add(#9+'$(MAKE) -C '+s+' '+rulestr[j]);
  438. mf.Add('');
  439. end;
  440. end;
  441. var
  442. hs : string;
  443. i,j : integer;
  444. begin
  445. { Open the Makefile }
  446. Verbose('Creating Makefile');
  447. mf:=TStringList.Create;
  448. { Buffer for reading and writing the sections }
  449. ss:=TStringList.Create;
  450. with mf do
  451. begin
  452. { write header & autodetection }
  453. Add('#');
  454. Add('# Makefile generated by '+title+' on '+FormatDateTime(TimeFormat,Now));
  455. Add('#');
  456. Add('');
  457. Add('defaultrule: '+userini.defaultrule);
  458. Add('');
  459. AddSection(true,'osdetect');
  460. { set the forced target os/cpu }
  461. if (userini.defaulttarget<>'') or (userini.defaultcpu<>'') then
  462. begin
  463. AddSection(true,'defaulttarget');
  464. if userini.defaulttarget<>'' then
  465. Add('override OS_TARGET:='+userini.defaulttarget);
  466. if userini.defaultcpu<>'' then
  467. Add('override CPU_TARGET:='+userini.defaultcpu);
  468. Add('');
  469. end;
  470. { fpc detection }
  471. AddSection(true,'fpcdetect');
  472. { write the default & user settings }
  473. AddSection(true,'defaultsettings');
  474. AddSection(true,'usersettings');
  475. { Pre Settings }
  476. if userini.PreSettings.count>0 then
  477. begin
  478. AddHead('Pre Settings');
  479. AddStrings(userini.PreSettings);
  480. end;
  481. { Targets }
  482. AddHead('Targets');
  483. AddTargets('DIROBJECTS',userini.targetdirs,true);
  484. AddTargets('LOADEROBJECTS',userini.targetloaders,false);
  485. AddTargets('UNITOBJECTS',userini.targetunits,false);
  486. AddTargets('EXEOBJECTS',userini.targetprograms,false);
  487. AddTargets('EXAMPLEOBJECTS',userini.targetexamples,false);
  488. { Clean }
  489. AddHead('Clean');
  490. AddTargets('EXTRACLEANUNITS',userini.cleanunits,false);
  491. AddTargets('EXTRACLEANFILES',userini.cleanfiles,false);
  492. { Install }
  493. AddHead('Install');
  494. AddTargets('EXTRAINSTALLUNITS',userini.installunits,false);
  495. AddTargets('EXTRAINSTALLFILES',userini.installfiles,false);
  496. { Defaults }
  497. AddHead('Defaults');
  498. if userini.defaultoptions<>'' then
  499. Add('override NEEDOPT='+userini.defaultoptions);
  500. { Dirs }
  501. AddHead('Directories');
  502. if userini.dirsources<>'' then
  503. Add('vpath %$(PASEXT) '+userini.dirsources);
  504. if userini.dirfpc<>'' then
  505. begin
  506. { this dir can be set in the environment, it's more a default }
  507. Add('ifndef FPCDIR');
  508. Add('FPCDIR='+userini.dirfpc);
  509. Add('endif');
  510. end;
  511. if userini.dirpackage<>'' then
  512. begin
  513. { this dir can be set in the environment, it's more a default }
  514. Add('ifndef PACKAGEDIR');
  515. Add('PACKAGEDIR='+userini.dirpackage);
  516. Add('endif');
  517. end;
  518. if userini.dirunit<>'' then
  519. Add('override NEEDUNITDIR='+userini.dirunit);
  520. if userini.dirlib<>'' then
  521. Add('override NEEDLIBDIR='+userini.dirlib);
  522. if userini.dirobj<>'' then
  523. Add('override NEEDOBJDIR='+userini.dirobj);
  524. if userini.dirinc<>'' then
  525. Add('override NEEDINCDIR='+userini.dirinc);
  526. if userini.dirtarget<>'' then
  527. begin
  528. Add('ifndef TARGETDIR');
  529. Add('TARGETDIR='+userini.dirtarget);
  530. Add('endif');
  531. end;
  532. if userini.dirunittarget<>'' then
  533. begin
  534. Add('ifndef UNITTARGETDIR');
  535. Add('UNITTARGETDIR='+userini.dirunittarget);
  536. Add('endif');
  537. end;
  538. { Packages }
  539. AddHead('Packages');
  540. if userini.Packages<>'' then
  541. Add('PACKAGES='+userini.Packages);
  542. if userini.PackageFCL then
  543. Add('override NEEDUNITDIR+=$(FPCDIR)/fcl/$(OS_TARGET)');
  544. if userini.Packages<>'' then
  545. Add('override NEEDUNITDIR+=$(addprefix $(PACKAGEDIR)/,$(PACKAGES))');
  546. { Libs }
  547. AddHead('Libraries');
  548. if userini.libname<>'' then
  549. Add('LIBNAME='+userini.libname);
  550. if userini.libunits<>'' then
  551. Add('SHAREDLIBOBJECTUNITS='+userini.libunits);
  552. if userini.libgcc then
  553. Add('override NEEDGCCLIB=1');
  554. if userini.libother then
  555. Add('override NEEDOTHERLIB=1');
  556. { Info }
  557. if userini.Section[sec_Info] then
  558. begin
  559. AddHead('Info');
  560. hs:='';
  561. if userini.infocfg then
  562. hs:=hs+'fpc_infocfg ';
  563. if userini.infodirs then
  564. hs:=hs+'fpc_infodirs ';
  565. if userini.infotools then
  566. hs:=hs+'fpc_infotools ';
  567. if userini.infoobjects then
  568. hs:=hs+'fpc_infoobjects ';
  569. if userini.infoinstall then
  570. hs:=hs+'fpc_infoinstall ';
  571. Add('FPCINFO='+hs);
  572. end;
  573. { Post Settings }
  574. if userini.PostSettings.count>0 then
  575. begin
  576. AddHead('Post Settings');
  577. AddStrings(userini.PostSettings);
  578. end;
  579. Add('');
  580. { write dirs }
  581. if userini.section[sec_dirs] then
  582. begin
  583. AddSection(true,'dir_default');
  584. AddSection(userini.libgcc,'dir_gcclib');
  585. AddSection(userini.libother,'dir_otherlib');
  586. AddSection(true,'dir_install');
  587. end;
  588. { commandline }
  589. if userini.section[sec_command] then
  590. begin
  591. Add('');
  592. AddSection(true,'command_begin');
  593. AddSection((userini.defaultoptions<>''),'command_needopt');
  594. AddSection((userini.dirfpc<>''),'command_fpcdir');
  595. AddSection((userini.dirunit<>'') or (userini.packages<>'') or (userini.packagefcl),'command_needunit');
  596. AddSection((userini.dirlib<>''),'command_needlib');
  597. AddSection((userini.dirobj<>''),'command_needobj');
  598. AddSection((userini.dirinc<>''),'command_needinc');
  599. AddSection(userini.libgcc,'command_gcclib');
  600. AddSection(userini.libother,'command_otherlib');
  601. AddSection((userini.dirinc<>''),'command_inc');
  602. AddSection((userini.dirtarget<>''),'command_target');
  603. AddSection((userini.dirunittarget<>''),'command_unittarget');
  604. AddSection(true,'command_end');
  605. end;
  606. { write tools }
  607. if userini.section[sec_tools] then
  608. begin
  609. AddSection(true,'shelltools');
  610. AddSection(true,'tool_default');
  611. AddSection(userini.toolsppdep,'tool_ppdep');
  612. AddSection(userini.toolsppumove,'tool_ppumove');
  613. AddSection(userini.toolsppufiles,'tool_ppufiles');
  614. AddSection(userini.toolsdata2inc,'tool_data2inc');
  615. AddSection(userini.toolsupx,'tool_upx');
  616. AddSection(userini.toolssed,'tool_sed');
  617. AddSection(userini.toolsdate,'tool_date');
  618. AddSection(userini.toolszip,'tool_zip');
  619. AddSection(userini.toolscmp,'tool_cmp');
  620. AddSection(userini.toolsdiff,'tool_diff');
  621. end;
  622. { extensions }
  623. if userini.section[sec_exts] then
  624. AddSection(true,'extensions');
  625. { add default rules }
  626. AddSection(true,'defaultrules');
  627. for i:=1 to rules do
  628. AddRule(i);
  629. { compile rules for making units/loaders/exes/examples }
  630. AddSection(not TargetStringEmpty(userini.targetunits),'unitrules');
  631. AddSection(not TargetStringEmpty(userini.targetprograms),'exerules');
  632. AddSection(not TargetStringEmpty(userini.targetloaders),'loaderrules');
  633. AddSection(not TargetStringEmpty(userini.targetexamples),'examplerules');
  634. { default fpc_ rules }
  635. AddSection(userini.Section[sec_Compile],'compilerules');
  636. AddSection(userini.Section[sec_Libs],'libraryrules');
  637. AddSection(userini.Section[sec_Install],'installrules');
  638. AddSection(userini.Section[sec_ZipInstall],'zipinstallrules');
  639. AddSection(userini.Section[sec_Clean],'cleanrules');
  640. AddSection(userini.Section[sec_Depend],'dependrules');
  641. if userini.Section[sec_Info] then
  642. begin
  643. AddSection(true,'inforules');
  644. AddSection(userini.infocfg,'info_cfg');
  645. AddSection(userini.infodirs,'info_dirs');
  646. AddSection(userini.infotools,'info_tools');
  647. AddSection(userini.infoobjects,'info_objects');
  648. AddSection(userini.infoinstall,'info_install');
  649. end;
  650. { Target dirs }
  651. if not TargetStringEmpty(userini.targetdirs) then
  652. begin
  653. for j:=0 to targets do
  654. if (userini.targetdirs[j]<>'') then
  655. begin
  656. if j<>0 then
  657. mf.Add('ifeq ($(OS_TARGET),'+targetstr[j]+')');
  658. hs:=userini.targetdirs[j];
  659. repeat
  660. i:=pos(' ',hs);
  661. if i=0 then
  662. i:=length(hs)+1;
  663. AddTargetDir(Copy(hs,1,i-1));
  664. system.delete(hs,1,i);
  665. until hs='';
  666. if j<>0 then
  667. mf.Add('endif');
  668. end;
  669. end;
  670. { insert users rules }
  671. if userini.rules.count>0 then
  672. begin
  673. AddSection(true,'userrules');
  674. AddStrings(userini.rules);
  675. end;
  676. end;
  677. { Write the Makefile and cleanup }
  678. Verbose('Writing Makefile');
  679. FixTab(mf);
  680. mf.SaveToFile('Makefile');
  681. mf.Destroy;
  682. ss.Destroy;
  683. WriteMakefile:=true;
  684. end;
  685. begin
  686. { Open userini.ini }
  687. fpcini:=ReadFpcMakeIni;
  688. if not assigned(fpcini) then
  689. Error('Can''t read fpcmake.ini');
  690. { Open Makefile.fpc }
  691. if not ReadMakefilefpc then
  692. Error('Can''t read Makefile.fpc');
  693. { Write Makefile }
  694. if not WriteMakefile then
  695. Error('Can''t write Makefile');
  696. fpcini.destroy;
  697. end.
  698. {
  699. $Log$
  700. Revision 1.8 1999-11-24 23:53:00 peter
  701. * packages
  702. * lot of other changes
  703. Revision 1.7 1999/11/23 09:43:35 peter
  704. + internal .ini file
  705. + packages support
  706. * ppufiles,data2inc support
  707. Revision 1.6 1999/11/10 22:10:49 peter
  708. * fpcmake updated
  709. Revision 1.5 1999/11/09 14:38:32 peter
  710. * sections section to leave out whole info/tools
  711. Revision 1.4 1999/11/08 15:01:39 peter
  712. * fpcmake support
  713. Revision 1.3 1999/11/04 12:07:13 michael
  714. + Now envvar is used
  715. Revision 1.2 1999/11/03 23:39:53 peter
  716. * lot of updates
  717. Revision 1.1 1999/11/02 23:57:40 peter
  718. * initial version
  719. }