{ $Id$ Copyright (c) 2001 by Peter Vreman FPCMake - Makefile writer See the file COPYING.FPC, included in this distribution, for details about the copyright. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} {$ifdef fpc}{$mode objfpc}{$endif} {$H+} unit fpcmwr; interface uses sysutils,classes, fpcmmain; type tsections=(sec_none, sec_units,sec_exes,sec_loaders,sec_examples,sec_rsts, sec_compile,sec_install, sec_distinstall,sec_zipinstall,sec_clean,sec_libs, sec_command,sec_exts,sec_dirs,sec_tools,sec_info,sec_makefile ); trules=( r_all,r_debug,r_smart,r_release, r_examples, r_shared, r_install,r_sourceinstall,r_exampleinstall,r_distinstall, r_zipinstall,r_zipsourceinstall,r_zipexampleinstall,r_zipdistinstall, r_clean,r_distclean,r_cleanall, r_info,r_makefiles ); const rule2str : array[trules] of string=( 'all','debug','smart','release', 'examples', 'shared', 'install','sourceinstall','exampleinstall','distinstall', 'zipinstall','zipsourceinstall','zipexampleinstall','zipdistinstall', 'clean','distclean','cleanall', 'info','makefiles' ); rule2sec : array[trules] of tsections=( sec_compile,sec_compile,sec_compile,sec_compile, sec_examples, sec_libs, sec_install,sec_install,sec_install,sec_distinstall, sec_zipinstall,sec_zipinstall,sec_zipinstall,sec_zipinstall, sec_clean,sec_clean,sec_clean, sec_info,sec_makefile ); type TMakefileWriter=class private FFileName : string; FIni : TFPCMake; FInput : TFPCMake; FOutput : TStringList; FPhony : string; FHasSection : array[tsections] of boolean; procedure LoadFPCMakeIni; procedure AddIniSection(const s:string); procedure AddCustomSection(const s:string); procedure AddTargetVariable(const inivar:string); procedure AddVariable(const inivar:string); function AddTargetDefines(const inivar,prefix:string):string; procedure AddRequiredPackages; procedure AddTool(const varname,exename,altexename:string); procedure AddTools(const inivar:string); procedure AddRules; procedure AddPhony(const s:string); procedure WritePhony; procedure AddTargetDirs(const inivar:string); function CheckTargetVariable(const inivar:string):boolean; function CheckVariable(const inivar:string):boolean; procedure AddDefaultTools; procedure AddMakefileTargets; procedure OptimizeSections; public constructor Create(AFPCMake:TFPCMake;const AFileName:string); destructor Destroy;override; procedure WriteGenericMakefile; end; implementation {$i fpcmake.inc} type TMyMemoryStream=class(TMemoryStream) public constructor Create(p:pointer;mysize:integer); end; {***************************************************************************** Helpers *****************************************************************************} function FixVariable(s:string):string; var i : integer; begin Result:=UpperCase(s); i:=pos('.',Result); if i>0 then Result[i]:='_'; end; function VarName(const s:string):string; var i,j : longint; begin i:=0; result:=s; while i0 then Delete(result,i,j-i+1) else Delete(result,i,1); dec(i); end; '$','(',')' : begin Delete(result,i,1); dec(i); end; 'a'..'z' : result[i]:=chr(ord(result[i])-32); end; end; end; procedure FixTab(sl:TStringList); var i,j,k : integer; s,s2 : string; begin i:=0; while (i'') and (sl[i][1] in [' ',#9]) then begin s:=sl[i]; k:=0; j:=0; repeat inc(j); case s[j] of ' ' : inc(k); #9 : k:=(k+7) and not(7); else break; end; until (j=length(s)); if k>7 then begin s2:=''; Delete(s,1,j-1); while (k>7) do begin s2:=s2+#9; dec(k,8); end; while (k>0) do begin s2:=s2+' '; dec(k); end; sl[i]:=s2+s; end; end; inc(i); end; end; {***************************************************************************** TMyMemoryStream *****************************************************************************} constructor TMyMemoryStream.Create(p:pointer;mysize:integer); begin inherited Create; SetPointer(p,mysize); end; {***************************************************************************** TMakefileWriter *****************************************************************************} constructor TMakefileWriter.Create(AFPCMake:TFPCMake;const AFileName:string); begin FInput:=AFPCMake; FFileName:=AFileName; FOutput:=TStringList.Create; FPhony:=''; FillChar(FHasSection,sizeof(FHasSection),1); LoadFPCMakeIni; end; destructor TMakefileWriter.Destroy; begin FOutput.Free; FIni.Free; end; procedure TMakefileWriter.LoadFPCMakeIni; var IniStream : TStream; begin try IniStream:=TMyMemoryStream.Create(@fpcmakeini,sizeof(fpcmakeini)); FIni:=TFPCMake.CreateFromStream(IniStream,'fpcmake.ini'); { Leave the '#' comments in the output } // FIni.CommentChars:=[';']; FIni.LoadSections; finally IniStream.Destroy; end; end; procedure TMakefileWriter.AddIniSection(const s:string); var Sec : TFPCMakeSection; begin Sec:=TFPCMakeSection(FIni[s]); if assigned(Sec) then FOutput.AddStrings(Sec.List) else Raise Exception.Create(Format('Section "%s" doesn''t exists in fpcmake.ini',[s])); end; procedure TMakefileWriter.AddCustomSection(const s:string); var Sec : TFPCMakeSection; begin Sec:=TFPCMakeSection(FInput[s]); if assigned(Sec) then begin Sec.BuildMakefile; FOutput.AddStrings(Sec.List); end; end; function TMakefileWriter.CheckTargetVariable(const inivar:string):boolean; var t : TTarget; begin result:=false; if FInput.GetVariable(IniVar,false)<>'' then begin result:=true; exit; end; for t:=low(TTarget) to high(TTarget) do if (t in FInput.IncludeTargets) and (FInput.GetVariable(IniVar+TargetSuffix[t],false)<>'') then begin result:=true; exit; end; end; function TMakefileWriter.CheckVariable(const inivar:string):boolean; begin Result:=(FInput.GetVariable(IniVar,false)<>''); end; procedure TMakefileWriter.AddTargetVariable(const inivar:string); var s : string; T : TTarget; C : TCpu; firsttarget, firstcpu : boolean; begin s:=FInput.GetVariable(IniVar,false); if s<>'' then FOutput.Add('override '+FixVariable(IniVar)+'+='+s); for t:=low(TTarget) to high(TTarget) do if t in FInput.IncludeTargets then begin firsttarget:=true; firstcpu:=true; s:=FInput.GetVariable(IniVar+TargetSuffix[t],false); if s<>'' then begin if firsttarget then begin firsttarget:=false; FOutput.Add('ifeq ($(OS_TARGET),'+TargetStr[t]+')'); end; FOutput.Add('override '+FixVariable(IniVar)+'+='+s); end; for c:=low(TCpu) to high(TCpu) do if (TargetCpuPossible[t,c]) and (c in FInput.IncludeCpus) then begin s:=FInput.GetVariable(IniVar+TargetSuffix[t]+CpuSuffix[c],false); if s<>'' then begin if firsttarget then begin firsttarget:=false; FOutput.Add('ifeq ($(OS_TARGET),'+TargetStr[t]+')'); end; if firstcpu then begin firstcpu:=false; FOutput.Add('ifeq ($(CPU_TARGET),'+CpuStr[c]+')'); end; FOutput.Add('override '+FixVariable(IniVar)+'+='+s); end; end; if not firstcpu then FOutput.Add('endif'); if not firsttarget then FOutput.Add('endif'); end; end; procedure TMakefileWriter.AddVariable(const inivar:string); var s : string; begin s:=FInput.GetVariable(IniVar,false); if s<>'' then FOutput.Add('override '+FixVariable(IniVar)+'='+s) end; function TMakefileWriter.AddTargetDefines(const inivar,prefix:string):string; procedure addtokens(s:string); var name : string; k1,k2 : integer; begin repeat Name:=GetToken(s,' '); if Name='' then break; { Remove (..) } k1:=pos('(',name); if k1>0 then begin k2:=PosIdx(')',name,k1); if k2=0 then k2:=length(name)+1; Delete(Name,k1,k2); end; FOutput.Add(prefix+VarName(name)+'=1'); { add to the list of dirs without duplicates } AddTokenNoDup(result,name,' '); until false; end; var s : string; T : TTarget; c : TCpu; firsttarget, firstcpu : boolean; begin result:=''; s:=FInput.GetVariable(IniVar,false); addtokens(s); for t:=low(TTarget) to high(TTarget) do if t in FInput.IncludeTargets then begin firsttarget:=true; firstcpu:=true; s:=FInput.GetVariable(IniVar+TargetSuffix[t],false); if s<>'' then begin if firsttarget then begin firsttarget:=false; FOutput.Add('ifeq ($(OS_TARGET),'+TargetStr[t]+')'); end; addtokens(s); end; for c:=low(TCpu) to high(TCpu) do if (TargetCpuPossible[t,c]) and (c in FInput.IncludeCpus) then begin s:=FInput.GetVariable(IniVar+TargetSuffix[t]+CpuSuffix[c],false); if s<>'' then begin if firsttarget then begin firsttarget:=false; FOutput.Add('ifeq ($(OS_TARGET),'+TargetStr[t]+')'); end; if firstcpu then begin firstcpu:=false; FOutput.Add('ifeq ($(CPU_TARGET),'+CpuStr[c]+')'); end; addtokens(s); end; end; if not firstcpu then FOutput.Add('endif'); if not firsttarget then FOutput.Add('endif'); end; end; procedure TMakefileWriter.AddTool(const varname,exename,altexename:string); begin with FOutput do begin Add('ifndef '+varname); Add(varname+':=$(strip $(wildcard $(addsuffix /'+exename+'$(SRCEXEEXT),$(SEARCHPATH))))'); if altexename<>'' then begin Add('ifeq ($('+varname+'),)'); Add(varname+':=$(strip $(wildcard $(addsuffix /'+altexename+'$(SRCEXEEXT),$(SEARCHPATH))))'); end; Add('ifeq ($('+varname+'),)'); Add(varname+'='); Add('else'); Add(varname+':=$(firstword $('+varname+'))'); Add('endif'); if altexename<>'' then begin Add('else'); Add(varname+':=$(firstword $('+varname+'))'); Add('endif'); end; Add('endif'); Add('export '+varname); end; end; procedure TMakefileWriter.AddTools(const inivar:string); var hs,tool : string; begin hs:=FInput.GetVariable(inivar,false); repeat Tool:=GetToken(hs,' '); if Tool='' then break; AddTool(FixVariable(Tool),Tool,''); until false; end; procedure TMakefileWriter.AddRules; procedure AddRule(rule:trules); var i : integer; hs : string; Sec : TFPCMakeSection; Rules : TStringList; begin Sec:=TFPCMakeSection(FInput['rules']); if assigned(Sec) then begin Rules:=Sec.List; for i:=0 to Rules.Count-1 do begin if (length(rules[i])>length(rule2str[rule])) and (rules[i][1]=rule2str[rule][1]) and ((rules[i][length(rule2str[rule])+1]=':') or ((length(rules[i])>length(rule2str[rule])+1) and (rules[i][length(rule2str[rule])+2]=':'))) and (Copy(rules[i],1,length(rule2str[rule]))=rule2str[rule]) then exit; end; end; hs:=''; if FHasSection[Rule2Sec[rule]] then hs:=hs+' fpc_'+rule2str[rule]; { include target dirs, but not for info and targets that call other targets with a only extra settings, if the section was not included, then still process the targets } if CheckTargetVariable('target_dirs') and (not(rule in [r_info,r_shared,r_smart,r_debug,r_release,r_zipdistinstall,r_distinstall]) or not FHasSection[Rule2Sec[rule]]) then begin if CheckVariable('default_dir') then hs:=hs+' $(addsuffix _'+rule2str[rule]+',$(DEFAULT_DIR))' else if not(rule in [r_sourceinstall,r_zipinstall,r_zipsourceinstall, r_makefiles]) or not(CheckVariable('package_name')) then hs:=hs+' $(addsuffix _'+rule2str[rule]+',$(TARGET_DIRS))'; end; { include cleaning of example dirs } if (rule=r_clean) and CheckTargetVariable('target_exampledirs') then hs:=hs+' $(addsuffix _'+rule2str[rule]+',$(TARGET_EXAMPLEDIRS))'; { Add the rule } AddPhony(Rule2Str[Rule]); FOutput.Add(rule2str[rule]+':'+hs); end; var rule : trules; begin for rule:=low(trules) to high(trules) do AddRule(rule); WritePhony; end; procedure TMakefileWriter.AddPhony(const s:string); begin FPhony:=FPhony+' '+s; end; procedure TMakefileWriter.WritePhony; begin if FPhony<>'' then begin FOutput.Add('.PHONY:'+FPhony); FPhony:=''; end; end; procedure TMakefileWriter.AddTargetDirs(const inivar:string); procedure AddTargetDir(const s,defpref:string); var j : trules; begin FOutput.Add('ifdef '+defpref+VarName(s)); for j:=low(trules) to high(trules) do begin FOutput.Add(s+'_'+rule2str[j]+':'); FOutput.Add(#9+'$(MAKE) -C '+s+' '+rule2str[j]); AddPhony(s+'_'+rule2str[j]); end; FOutput.Add(s+':'); FOutput.Add(#9+'$(MAKE) -C '+s+' all'); AddPhony(s); WritePhony; FOutput.Add('endif'); end; var hs,dir : string; prefix : string; begin prefix:=FixVariable(inivar)+'_'; hs:=AddTargetDefines(inivar,prefix); repeat Dir:=GetToken(hs,' '); if Dir='' then break; AddTargetDir(Dir,prefix); until false; end; procedure TMakefileWriter.AddRequiredPackages; procedure AddPackage(const pack,prefix:string); var packdirvar,unitdirvar : string; begin FOutput.Add('ifdef '+Prefix+VarName(pack)); { create needed variables } packdirvar:='PACKAGEDIR_'+VarName(pack); unitdirvar:='UNITDIR_'+VarName(pack); { Search packagedir by looking for Makefile.fpc, for the RTL look direct in the corresponding target directory } if pack='rtl' then FOutput.Add(packdirvar+':=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /'+pack+'/$(OS_TARGET)/Makefile.fpc,$(PACKAGESDIR))))))') else FOutput.Add(packdirvar+':=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /'+pack+'/Makefile.fpc,$(PACKAGESDIR))))))'); FOutput.Add('ifneq ($('+packdirvar+'),)'); { Create unit dir, check if os dependent dir exists } FOutput.Add('ifneq ($(wildcard $('+packdirvar+')/$(OS_TARGET)),)'); FOutput.Add(unitdirvar+'=$('+packdirvar+')/$(OS_TARGET)'); FOutput.Add('else'); FOutput.Add(unitdirvar+'=$('+packdirvar+')'); FOutput.Add('endif'); FOutput.Add('ifdef CHECKDEPEND'); FOutput.Add('$('+packdirvar+')/$(FPCMADE):'); FOutput.Add(#9'$(MAKE) -C $('+packdirvar+') $(FPCMADE)'); FOutput.Add('override ALLDEPENDENCIES+=$('+packdirvar+')/$(FPCMADE)'); FOutput.Add('endif'); { Package dir doesn't exists, check unit dir } FOutput.Add('else'); FOutput.Add(packdirvar+'='); FOutput.Add(unitdirvar+':=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /'+pack+'/Package.fpc,$(UNITSDIR)))))'); FOutput.Add('ifneq ($('+unitdirvar+'),)'); FOutput.Add(unitdirvar+':=$(firstword $('+unitdirvar+'))'); FOutput.Add('else'); FOutput.Add(unitdirvar+'='); FOutput.Add('endif'); FOutput.Add('endif'); { Add Unit dir to the command line -Fu } FOutput.Add('ifdef '+unitdirvar); FOutput.Add('override COMPILER_UNITDIR+=$('+unitdirvar+')'); FOutput.Add('endif'); { endif for package } FOutput.Add('endif'); end; var i : integer; reqs,req,prefix : string; t : Ttarget; c : TCpu; sl : TStringList; begin prefix:='REQUIRE_PACKAGES_'; reqs:=''; { Add target defines } for t:=low(ttarget) to high(ttarget) do if t in FInput.IncludeTargets then begin for c:=low(tcpu) to high(tcpu) do if (TargetCpuPossible[t,c]) and (c in FInput.IncludeCpus) then begin sl:=FInput.GetTargetRequires(t,c); { show info } FInput.Verbose(FPCMakeInfo,TargetStr[t]+'-'+CpuStr[c]+' requires: '+sl.CommaText); if sl.count>0 then begin FOutput.Add('ifeq ($(OS_TARGET),'+TargetStr[t]+')'); FOutput.Add('ifeq ($(CPU_TARGET),'+CpuStr[c]+')'); for i:=0 to sl.count-1 do begin FOutput.Add(prefix+VarName(sl[i])+'=1'); AddTokenNoDup(reqs,sl[i],' '); end; FOutput.Add('endif'); FOutput.Add('endif'); end; sl.Free; end; end; { Add all require packages } repeat req:=GetToken(reqs,' '); if Req='' then break; AddPackage(req,prefix); until false; WritePhony; end; procedure TMakefileWriter.AddDefaultTools; begin AddTool('ECHO','gecho','echo'); AddTool('DATE','gdate','date'); AddTool('GINSTALL','ginstall','install'); AddTool('CPPROG','cp',''); AddTool('RMPROG','rm',''); AddTool('MVPROG','mv',''); AddIniSection('shelltools'); AddTool('PPUMOVE','ppumove',''); AddTool('FPCMAKE','fpcmake',''); AddTool('ZIPPROG','zip',''); AddTool('TARPROG','tar',''); AddIniSection('defaulttools'); end; procedure TMakefileWriter.AddMakefileTargets; var s : string; t : Ttarget; begin s:=''; for t:=low(ttarget) to high(ttarget) do if t in FInput.IncludeTargets then begin AddToken(s,TargetStr[t],' '); end; FOutput.Add('MAKEFILETARGETS='+s); end; procedure TMakefileWriter.OptimizeSections; var SkippedSecs :integer; begin { Turn some sections off, depending if files are provided } if not FInput.IsPackage then begin FHasSection[sec_zipinstall]:=false; FHasSection[sec_distinstall]:=false; end; FHasSection[sec_libs]:=CheckVariable('lib_name'); { Remove unused sections for targets } SkippedSecs:=0; if (not CheckTargetVariable('target_units')) then begin inc(SkippedSecs); FHasSection[sec_units]:=false; end; if (not CheckTargetVariable('target_programs')) then begin inc(SkippedSecs); FHasSection[sec_exes]:=false; end; if (not CheckTargetVariable('target_examples')) then begin inc(SkippedSecs); { example dirs also requires the fpc_examples target, because it also depends on the all target } if (not CheckTargetVariable('target_exampledirs')) then FHasSection[sec_examples]:=false; end; if (not CheckTargetVariable('target_loaders')) then begin inc(SkippedSecs); FHasSection[sec_loaders]:=false; end; { if all 4 sections are not available we can skip also the generic compile rules } if SkippedSecs=4 then begin FHasSection[sec_compile]:=false; if (not CheckTargetVariable('package_name')) and (not CheckTargetVariable('install_units')) and (not CheckTargetVariable('install_files')) and (not CheckTargetVariable('install_createpackagefpc')) then FHasSection[sec_install]:=false; { Package.fpc also needs to be cleaned } if (not CheckTargetVariable('clean_units')) and (not CheckTargetVariable('clean_files')) and (not CheckTargetVariable('install_createpackagefpc')) then FHasSection[sec_clean]:=false; end; end; procedure TMakefileWriter.WriteGenericMakefile; begin { Remove unused sections } OptimizeSections; { Generate Output } with FOutput do begin { Header } Add('#'); Add('# Don''t edit, this file is generated by '+TitleDate); Add('#'); if CheckVariable('default_rule') then Add('default: '+FInput.GetVariable('default_rule',false)) else Add('default: all'); { Supported targets by this Makefile } AddMakefileTargets; { Add automatic detect sections } AddIniSection('osdetect'); { Forced target } if CheckVariable('require_target') then Add('override OS_TARGET='+FInput.GetVariable('require_target',false)) else if CheckVariable('default_target') then Add('override OS_TARGET_DEFAULT='+FInput.GetVariable('default_target',false)); if CheckVariable('require_cpu') then Add('override CPU_TARGET='+FInput.GetVariable('require_cpu',false)) else if CheckVariable('default_cpu') then Add('override CPU_TARGET_DEFAULT='+FInput.GetVariable('default_cpu',false)); { FPC Detection } AddVariable('default_fpcdir'); AddIniSection('fpcdetect'); AddIniSection('fpcdircheckenv'); AddIniSection('fpcdirdetect'); { Package } AddVariable('package_name'); AddVariable('package_version'); AddVariable('package_targets'); { LCL rules } if FInput.UsesLCL then begin AddVariable('default_lcldir'); AddVariable('lcl_platform'); AddIniSection('lclrules'); end; { First add the required packages sections } // for i:=0 to FInput.RequireList.Count-1 do // AddCustomSection(FInput.Requirelist[i]); { prerules section } if assigned(FInput['prerules']) then AddStrings(TFPCMakeSection(FInput['prerules']).List); { Default } AddVariable('default_dir'); { Targets } AddTargetVariable('target_dirs'); AddTargetVariable('target_programs'); AddTargetVariable('target_units'); AddTargetVariable('target_implicitunits'); AddTargetVariable('target_loaders'); AddTargetVariable('target_rsts'); AddTargetVariable('target_examples'); AddTargetVariable('target_exampledirs'); { Clean } AddTargetVariable('clean_units'); AddTargetVariable('clean_files'); { Install } AddTargetVariable('install_units'); AddTargetVariable('install_files'); AddVariable('install_buildunit'); AddVariable('install_prefix'); AddVariable('install_basedir'); AddVariable('install_datadir'); AddVariable('install_fpcpackage'); AddVariable('install_fpcsubdir'); AddVariable('install_createpackagefpc'); { Dist } AddVariable('dist_destdir'); AddVariable('dist_zipname'); AddVariable('dist_ziptarget'); { Compiler } AddTargetVariable('compiler_options'); AddTargetVariable('compiler_version'); AddTargetVariable('compiler_includedir'); AddTargetVariable('compiler_unitdir'); AddTargetVariable('compiler_sourcedir'); AddTargetVariable('compiler_objectdir'); AddTargetVariable('compiler_librarydir'); AddTargetVariable('compiler_targetdir'); AddTargetVariable('compiler_unittargetdir'); { default Dirs and extensions } AddIniSection('defaultdirs'); if FInput.CheckLibcRequire then AddIniSection('dirlibc'); AddIniSection('extensions'); { Add default tools } AddDefaultTools; { Required packages } AddVariable('require_packages'); AddRequiredPackages; { commandline } AddIniSection('command_begin'); if FInput.CheckLibcRequire then AddIniSection('command_libc'); AddIniSection('command_end'); { compile } if FHasSection[sec_loaders] then AddIniSection('loaderrules'); if FHasSection[sec_units] then AddIniSection('unitrules'); if FHasSection[sec_exes] then AddIniSection('exerules'); if FHasSection[sec_rsts] then AddIniSection('rstrules'); if FHasSection[sec_examples] then AddIniSection('examplerules'); if FHasSection[sec_compile] then AddIniSection('compilerules'); if FHasSection[sec_libs] then AddIniSection('libraryrules'); { install } if FHasSection[sec_install] then AddIniSection('installrules'); if FHasSection[sec_distinstall] then AddIniSection('distinstallrules'); if FHasSection[sec_zipinstall] then AddIniSection('zipinstallrules'); { clean } AddIniSection('cleanrules'); { info } AddIniSection('baseinforules'); if FInput.UsesLCL then AddIniSection('lclinforules'); AddIniSection('inforules'); { info } AddIniSection('makefilerules'); { Subdirs } AddTargetDirs('target_dirs'); AddTargetDirs('target_exampledirs'); { Tools } AddTools('require_tools'); { Rules } AddRules; { Users own rules } AddIniSection('localmakefile'); AddIniSection('userrules'); if assigned(FInput['rules']) then AddStrings(TFPCMakeSection(FInput['rules']).List); end; { write to disk } FInput.Verbose(FPCMakeInfo,'Writing Makefile'); Fixtab(FOutput); FOutput.SaveToFile(FFileName); end; end. { $Log$ Revision 1.28 2003-04-25 20:53:33 peter * target_dir variable generation was not cpu dependent yet Revision 1.27 2003/04/24 23:21:01 peter * support different cpu target Revision 1.26 2003/03/24 10:56:02 marco * fix recursive zip making that corrupted utilsxxx.zip Revision 1.25 2002/09/27 06:54:54 pierre * translate default_cpu/os into CPU/OS_TARGET_DEFAULT Revision 1.24 2002/09/07 15:40:32 peter * old logs removed and tabs fixed Revision 1.23 2002/03/19 19:37:09 peter * fix source location in zips for packages and demos Revision 1.22 2002/03/11 19:10:36 peter * Regenerated with updated fpcmake Revision 1.21 2002/02/28 17:03:47 pierre + CHECKDEPEND var to check if packages are up to date Revision 1.20 2002/01/27 21:42:35 peter * -r option to process target dirs also * default changed to build only for current target * removed auto building of required packages * removed makefile target because it causes problems with an internal rule of make Revision 1.19 2002/01/06 21:50:05 peter * lcl updates * small optimizes for package check }