fpc/utils/fppkg/fpmkunitsrc.inc
peter 4f4b0efa51 * regenerated
git-svn-id: trunk@10563 -
2008-03-25 17:15:41 +00:00

5506 lines
192 KiB
PHP

{$ifdef Delphi}
const fpmkunitsrc : array[0..597] of string[240]=(
{$else Delphi}
const fpmkunitsrc : array[0..597,1..240] of char=(
{$endif Delphi}
'{'#010+
' This file is part of the Free Pascal Makefile Package'#010+
#010+
' Implementation of fpmake classes and functions'#010+
#010+
' Copyright (c) 2007 by the freepascal team'#010+
#010+
' See the file COPYING.FPC, included in this distribution,'#010+
' for details abo','ut the copyright.'#010+
#010+
' This program is distributed in the hope that it will be useful,'#010+
' but WITHOUT ANY WARRANTY; without even the implied warranty of'#010+
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.'#010+
#010+
' ***************************','****************************************'+
'***}'#010+
#010+
'unit fpmkunit;'#010+
#010+
'{$Mode objfpc}'#010+
'{$H+}'#010+
'{$inline on}'#010+
#010+
'{ For target or cpu dependent dependencies add also an overload were y'+
'ou'#010+
' can pass only a set of cpus. This is disabled for now because it cre',
'ates'#010+
' an error in the compiler with overload choosing }'#010+
'{ define cpu_only_overloads}'#010+
#010+
'Interface'#010+
#010+
'{$ifndef NO_UNIT_PROCESS}'#010+
' {$define HAS_UNIT_PROCESS}'#010+
'{$endif NO_UNIT_PROCESS}'#010+
#010+
'{$ifndef NO_UNIT_ZIPPER}'#010+
' {$define HAS_UNIT_ZIPPER}'#010+
'{$endif ','NO_UNIT_ZIPPER}'#010+
#010+
'uses'#010+
' SysUtils, Classes, StrUtils'#010+
'{$ifdef HAS_UNIT_PROCESS}'#010+
' ,process'#010+
'{$endif HAS_UNIT_PROCESS}'#010+
'{$ifdef HAS_UNIT_ZIPPER}'#010+
' ,zipper'#010+
'{$endif HAS_UNIT_ZIPPER}'#010+
' ;'#010+
#010+
'Type'#010+
' TFileType = (ftSource,ftUnit,ftObject,ftResource,ftEx','ecutable,ftSt'+
'aticLibrary,'#010+
' ftSharedLibrary);'#010+
' TFileTypes = set of TFileType;'#010+
#010+
' // Please keep this order, see OSCPUSupported below'#010+
' TCpu=(cpuNone,'#010+
' i386,m68k,powerpc,sparc,x86_64,arm,powerpc64'#010+
' );'#010+
' TCPUS = Set of TCPU;',#010+
#010+
' // Please keep this order, see OSCPUSupported below'#010+
' TOS=(osNone,'#010+
' linux,go32v2,win32,os2,freebsd,beos,netbsd,'#010+
' amiga,atari, solaris, qnx, netware, openbsd,wdosx,'#010+
' palmos,macos,darwin,emx,watcom,morphos,netwlibc,'#010+
' win64,win','ce,gba,nds,embedded,symbian'#010+
' );'#010+
' TOSes = Set of TOS;'#010+
#010+
' TCompilerMode = (cmFPC,cmTP,cmObjFPC,cmDelphi,cmMacPas);'#010+
' TCompilerModes = Set of TCompilerMode;'#010+
#010+
' TTargetType = (ttProgram,ttUnit,ttImplicitUnit,ttCleanOnlyUnit,ttExa'+
'mpleUnit,ttEx','ampleProgram);'#010+
' TTargetTypes = set of TTargetType;'#010+
#010+
' TTargetState = (tsNeutral,tsConsidering,tsNoCompile,tsCompiled,tsIns'+
'talled,tsNotFound);'#010+
' TTargetStates = Set of TTargetState;'#010+
#010+
' TSourceType = (stDoc,stSrc,stExample,stTest);'#010+
' TSource','Types = set of TSourceType;'#010+
#010+
' TVerboseLevel = (vlError,vlWarning,vlInfo,vldebug,vlCommand);'#010+
' TVerboseLevels = Set of TVerboseLevel;'#010+
#010+
' TCommandAt = (caBeforeCompile,caAfterCompile,'#010+
' caBeforeInstall,caAfterInstall,'#010+
' ',' caBeforeArchive,caAfterArchive,'#010+
' caBeforeClean,caAfterClean,'#010+
' caBeforeDownload,caAfterDownload);'#010+
#010+
' TDependencyType = (depPackage,depImplicitPackage,depUnit,depInclude)'+
';'#010+
' TDependencyTypes = set of TDepe','ndencyType;'#010+
#010+
' TLogEvent = Procedure (Level : TVerboseLevel; Const Msg : String) of'+
' Object;'#010+
#010+
' TRunMode = (rmCompile,rmBuild,rmInstall,rmArchive,rmClean,rmManifest'+
');'#010+
#010+
'Const'#010+
' // Aliases'#010+
' Amd64 = X86_64;'#010+
' PPC = PowerPC;'#010+
' PPC64 = PowerPC','64;'#010+
' DOS = Go32v2;'#010+
' MacOSX = Darwin;'#010+
#010+
' AllOSes = [Low(TOS)..High(TOS)];'#010+
' AllCPUs = [Low(TCPU)..High(TCPU)];'#010+
' AllUnixOSes = [Linux,FreeBSD,NetBSD,OpenBSD,Darwin,QNX,BeOS,Solaris'+
'];'#010+
' AllBSDOSes = [FreeBSD,NetBSD,OpenBSD,Darwin];'#010+
' ','AllWindowsOSes = [Win32,Win64,WinCE];'#010+
#010+
' { This table is kept OS,Cpu because it is easier to maintain (PFV) }'+
#010+
' OSCPUSupported : array[TOS,TCpu] of boolean = ('#010+
' { os none i386 m68k ppc sparc x86_64 arm ppc'+
'64}'#010+
' {',' none } ( false, false, false, false, false, false, false, f'+
'alse),'#010+
' { linux } ( false, true, true, true, true, true, true, tru'+
'e ),'#010+
' { go32v2 } ( false, true, false, false, false, false, false, fal'+
'se),'#010+
' { win32 } ( fa','lse, true, false, false, false, false, false, f'+
'alse),'#010+
' { os2 } ( false, true, false, false, false, false, false, fal'+
'se),'#010+
' { freebsd } ( false, true, true, false, false, true, false, fal'+
'se),'#010+
' { beos } ( false, true, fal','se, false, false, false, false, f'+
'alse),'#010+
' { netbsd } ( false, false, false, false, false, false, false, fal'+
'se),'#010+
' { amiga } ( false, false, true, true, false, false, false, fal'+
'se),'#010+
' { atari } ( false, false, false, false, fals','e, false, false, f'+
'alse),'#010+
' { solaris } ( false, true, false, false, true, false, false, fal'+
'se),'#010+
' { qnx } ( false, false, false, false, false, false, false, fal'+
'se),'#010+
' { netware } ( false, true, false, false, false, false, false',', f'+
'alse),'#010+
' { openbsd } ( false, false, false, false, false, false, false, fal'+
'se),'#010+
' { wdosx } ( false, true, false, false, false, false, false, fal'+
'se),'#010+
' { palmos } ( false, false, true, false, false, false, true, fal'+
'se),'#010+
' {',' macos } ( false, false, false, true, false, false, false, f'+
'alse),'#010+
' { darwin } ( false, true, false, true, false, true, false, tru'+
'e ),'#010+
' { emx } ( false, true, false, false, false, false, false, fal'+
'se),'#010+
' { watcom } ( fa','lse, true, false, false, false ,false, false, f'+
'alse),'#010+
' { morphos } ( false, false, false, true, false ,false, false, fal'+
'se),'#010+
' { netwlibc }( false, true, false, false, false, false, false, fal'+
'se),'#010+
' { win64 } ( false, false, fal','se, false, false, true, false, f'+
'alse),'#010+
' { wince }( false, true, false, false, false, false, true, fal'+
'se),'#010+
' { gba } ( false, false, false, false, false, false, true, fal'+
'se),'#010+
' { nds } ( false, false, false, false, fals','e, false, true, f'+
'alse),'#010+
' { embedded }( false, false, false, false, false, false, true, fal'+
'se),'#010+
' { symbian } ( false, true, false, false, false, false, true, fal'+
'se)'#010+
' );'#010+
#010+
' // Useful'#010+
' UnitExt = '#039'.ppu'#039';'#010+
' PPUExt = UnitExt;'#010+
' PasEx','t = '#039'.pas'#039';'#010+
' PPExt = '#039'.pp'#039';'#010+
' IncExt = '#039'.inc'#039';'#010+
' ObjExt = '#039'.o'#039';'#010+
' RstExt = '#039'.rst'#039';'#010+
' LibExt = '#039'.a'#039';'#010+
' SharedLibExt = '#039'.so'#039';'#010+
' DLLExt = '#039'.dll'#039';'#010+
' ExeExt = '#039'.exe'#039';'#010+
' ZipExt = '#039'.zip'#039';'#010+
#010+
' FPMakePPFile = '#039'fpmake.pp'#039';'#010+
' ManifestFile = ',#039'manifest.xml'#039';'#010+
' UnitConfigFile = '#039'fpunits.conf'#039';'#010+
#010+
' DirNotFound = '#039'<dirnotfound>'#039';'#010+
#010+
' UnitTargets = [ttUnit,ttImplicitUnit,ttCleanOnlyUnit,ttExampleUnit];'+
#010+
' ProgramTargets = [ttProgram,ttExampleProgram];'#010+
#010+
' DefaultMessages = [vlError,vlWa','rning,vlCommand];'#010+
' AllMessages = [vlError,vlWarning,vlCommand,vlInfo];'#010+
#010+
#010+
'Type'#010+
' { TNamedItem }'#010+
#010+
' TNamedItem = Class(TCollectionItem)'#010+
' private'#010+
' FName: String;'#010+
' procedure SetName(const AValue: String);virtual;'#010+
' Public'#010+
' property N','ame : String Read FName Write SetName;'#010+
' end;'#010+
#010+
' { TNamedCollection }'#010+
#010+
' TNamedCollection = Class(TCollection)'#010+
' private'#010+
' FUniqueNames: Boolean;'#010+
' Public'#010+
' Function IndexOfName(const AName : String) : Integer;'#010+
' Function ItemByName(c','onst AName : String) : TNamedItem;'#010+
' Property UniqueNames : Boolean Read FUniqueNames;'#010+
' end;'#010+
#010+
' { TNamedItemList }'#010+
#010+
' TNamedItemList = Class(TFPList)'#010+
' private'#010+
' function GetNamedItem(Index : Integer): TNamedItem;'#010+
' procedure SetName','dItem(Index : Integer; const AValue: TNamedItem'+
');'#010+
' public'#010+
' Function IndexOfName(const AName : String) : Integer;'#010+
' Function ItemByName(const ANAme : String) : TNamedItem;'#010+
' Property NamedItems[Index : Integer] : TNamedItem Read GetN','amedI'+
'tem Write SetNamedItem; default;'#010+
' end;'#010+
#010+
' { TCommand }'#010+
' TCommand = Class(TNamedItem)'#010+
' private'#010+
' FAfterCommand: TNotifyEvent;'#010+
' FBeforeCommand: TNotifyEvent;'#010+
' FCommand: String;'#010+
' FCommandAt: TCommandAt;'#010+
' FDestFile: String',';'#010+
' FIgnoreResult: Boolean;'#010+
' FOptions: String;'#010+
' FSourceFile: String;'#010+
' Public'#010+
' Property SourceFile : String Read FSourceFile Write FSourceFile;'#010+
' Property DestFile : String Read FDestFile Write FDestFile;'#010+
' Property Command :',' String Read FCommand Write FCommand;'#010+
' Property Options : String Read FOptions Write FOptions;'#010+
' Property At : TCommandAt Read FCommandAt Write FCommandAt;'#010+
' Property IgnoreResult : Boolean Read FIgnoreResult Write FIgnoreRe'+
'sult;'#010+
' ',' Property BeforeCommand : TNotifyEvent Read FBeforeCommand Write '+
'FBeforeCommand;'#010+
' Property AfterCommand : TNotifyEvent Read FAfterCommand Write FAft'+
'erCommand;'#010+
' end;'#010+
#010+
' { TCommands }'#010+
#010+
' TCommands = Class(TNamedCollection)'#010+
' private'#010+
' F','DefaultAt: TCommandAt;'#010+
' function GetCommand(const Dest : String): TCommand;'#010+
' function GetCommandItem(Index : Integer): TCommand;'#010+
' procedure SetCommandItem(Index : Integer; const AValue: TCommand);'+
#010+
' Public'#010+
' Function AddCommand(C','onst Cmd : String) : TCommand;'#010+
' Function AddCommand(Const Cmd,Options : String) : TCommand;'#010+
' Function AddCommand(Const Cmd,Options,Dest,Source : String) : TCom'+
'mand;'#010+
' Function AddCommand(At : TCommandAt; Const Cmd : String) : TComma',
'nd;'#010+
' Function AddCommand(At : TCommandAt; Const Cmd,Options : String) :'+
' TCommand;'#010+
' Function AddCommand(At : TCommandAt; Const Cmd,Options, Dest,Sourc'+
'e : String) : TCommand;'#010+
' Property CommandItems[Index : Integer] : TCommand Read Ge','tComman'+
'dItem Write SetCommandItem;'#010+
' Property Commands[Dest : String] : TCommand Read GetCommand; defau'+
'lt;'#010+
' Property DefaultAt : TCommandAt Read FDefaultAt Write FDefaultAt;'#010+
' end;'#010+
#010+
' { TFPVersion }'#010+
#010+
' TFPVersion = Class(TPersistent)'#010+
' ',' private'#010+
' FMajor,'#010+
' FMinor,'#010+
' FMicro,'#010+
' FBuild : Word;'#010+
' function GetAsString: String;'#010+
' function GetEmpty: Boolean;'#010+
' procedure SetAsString(const AValue: String);'#010+
' Public'#010+
' Procedure Clear;'#010+
' Procedure Assign(Source : ','TPersistent); override;'#010+
' Function CompareVersion(AVersion : TFPVersion) : Integer;'#010+
' Function SameVersion(AVersion : TFPVersion) : Boolean;'#010+
' Property AsString : String Read GetAsString Write SetAsString;'#010+
' Property Empty : Boolean Rea','d GetEmpty;'#010+
' Published'#010+
' Property Major : Word Read FMajor Write FMajor;'#010+
' Property Minor : Word Read FMinor Write FMinor;'#010+
' Property Micro : Word Read FMicro Write FMicro;'#010+
' Property Build : Word Read FBuild Write FBuild;'#010+
' end;'#010+
#010+
' { ','TConditionalString }'#010+
' TConditionalString = Class'#010+
' private'#010+
' FOSes : TOSes;'#010+
' FCPUs : TCPUs;'#010+
' FValue : String;'#010+
' Public'#010+
' Constructor Create;virtual;'#010+
' Property Value : String Read FValue Write FValue;'#010+
' Property OSes : ','TOSes Read FOSes Write FOSes;'#010+
' Property CPUs : TCPUs Read FCPUS Write FCPUs;'#010+
' end;'#010+
#010+
' TConditionalStringClass = class of TConditionalString;'#010+
#010+
' { TConditionalStrings }'#010+
#010+
' TConditionalStrings = Class(TFPList)'#010+
' private'#010+
' FCSClass : TCo','nditionalStringClass;'#010+
' function GetConditionalString(Index : Integer): TConditionalString'+
';'#010+
' procedure SetConditionalString(Index : Integer; const AValue: TCon'+
'ditionalString);'#010+
' Public'#010+
' Constructor Create(AClass:TConditionalStringCl','ass);'#010+
' Function Add(Const Value : String) : TConditionalString;inline;'#010+
' Function Add(Const Value : String;const OSes:TOSes) : TConditional'+
'String;inline;'#010+
'{$ifdef cpu_only_overloads}'#010+
' Function Add(Const Value : String;const CPUs:TCPU','s) : TCondition'+
'alString;inline;'#010+
'{$endif cpu_only_overloads}'#010+
' Function Add(Const Value : String;const CPUs:TCPUs;const OSes:TOSe'+
's) : TConditionalString;'#010+
' Property ConditionalStrings[Index : Integer] : TConditionalString '+
'Read GetConditi','onalString Write SetConditionalString; default;'#010+
' end;'#010+
#010+
' { TDependency }'#010+
' TDependency = Class(TConditionalString)'#010+
' private'#010+
' FDependencyType : TDependencyType;'#010+
' // Package, Unit'#010+
' FTarget : TObject;'#010+
' FVersion : TFPVersion;'#010+
' ','FRequireChecksum : Cardinal;'#010+
' // Filenames, Includes'#010+
' FTargetFileName : String;'#010+
' Function GetVersion : string;'#010+
' Procedure SetVersion(const V : string);'#010+
' Public'#010+
' Constructor Create;override;'#010+
' Destructor Destroy;override;'#010+
' ',' Property Target : TObject Read FTarget Write FTarget;'#010+
' Property DependencyType : TDependencyType Read FDependencyType;'#010+
' Property TargetFileName : String Read FTargetFileName Write FTarge'+
'tFileName;'#010+
' Property Version : String Read',' GetVersion Write SetVersion;'#010+
' Property RequireChecksum : Cardinal Read FRequireChecksum Write FR'+
'equireChecksum;'#010+
' end;'#010+
#010+
' TDependencies = Class(TConditionalStrings)'#010+
' function GetDependency(Index : Integer): TDependency;'#010+
' procedure',' SetDependency(Index : Integer; const AValue: TDependen'+
'cy);'#010+
' Public'#010+
' Function Add(Const Value : String) : TDependency;inline;'#010+
' Function Add(Const Value : String;const OSes:TOSes) : TDependency;'+
'inline;'#010+
'{$ifdef cpu_only_overloads}'#010+
' ','Function Add(Const Value : String;const CPUs:TCPUs) : TDependenc'+
'y;inline;'#010+
'{$endif cpu_only_overloads}'#010+
' Function Add(Const Value : String;const CPUs:TCPUs;const OSes:TOSe'+
's) : TDependency;'#010+
' Function AddUnit(Const Value : String) : TDepe','ndency;inline;'#010+
' Function AddUnit(Const Value : String;const OSes:TOSes) : TDepende'+
'ncy;inline;'#010+
'{$ifdef cpu_only_overloads}'#010+
' Function AddUnit(Const Value : String;const CPUs:TCPUs) : TDepende'+
'ncy;inline;'#010+
'{$endif cpu_only_overloads}'#010+
' F','unction AddUnit(Const Value : String;const CPUs:TCPUs;const OSe'+
's:TOSes) : TDependency;'#010+
' Function AddInclude(Const Value : String) : TDependency;inline;'#010+
' Function AddInclude(Const Value : String;const OSes:TOSes) : TDepe'+
'ndency;inline;'#010,
'{$ifdef cpu_only_overloads}'#010+
' Function AddInclude(Const Value : String;const CPUs:TCPUs) : TDepe'+
'ndency;inline;'#010+
'{$endif cpu_only_overloads}'#010+
' Function AddInclude(Const Value : String;const CPUs:TCPUs;const OS'+
'es:TOSes) : TDependency;'#010+
' ','Property Dependencies[Index : Integer] : TDependency Read GetDep'+
'endency Write SetDependency; default;'#010+
' end;'#010+
#010+
' { TTarget }'#010+
#010+
' TTarget = Class(TNamedItem)'#010+
' private'#010+
' FInstall : Boolean;'#010+
' FAfterClean: TNotifyEvent;'#010+
' FAfterCompile: T','NotifyEvent;'#010+
' FBeforeClean: TNotifyEvent;'#010+
' FBeforeCompile: TNotifyEvent;'#010+
' FCPUs: TCPUs;'#010+
' FOSes: TOSes;'#010+
' FMode: TCompilerMode;'#010+
' FResourceStrings: Boolean;'#010+
' FObjectPath,'#010+
' FUnitPath,'#010+
' FIncludePath : TConditionalStrin','gs;'#010+
' FDependencies : TDependencies;'#010+
' FCommands : TCommands;'#010+
' FDirectory: String;'#010+
' FExtension: String;'#010+
' FTargetSourceFileName : String;'#010+
' FFileType: TFileType;'#010+
' FOptions: String;'#010+
' FFPCTarget: String;'#010+
' FTargetState: ','TTargetState;'#010+
' FTargetType: TTargetType;'#010+
' Protected'#010+
' Function GetSourceFileName : String; virtual;'#010+
' Function GetUnitFileName : String; virtual;'#010+
' Function GetObjectFileName : String; virtual;'#010+
' Function GetRSTFileName : String','; Virtual;'#010+
' Function GetProgramFileName(AOS : TOS) : String; Virtual;'#010+
' Public'#010+
' Constructor Create(ACollection : TCollection); override;'#010+
' Destructor Destroy; override;'#010+
' Function GetOutputFileName (AOs : TOS) : String; Virtual;'#010,
' procedure SetName(const AValue: String);override;'#010+
' Procedure GetCleanFiles(List : TStrings; const APrefixU, APrefixB '+
': String; ACPU:TCPU; AOS : TOS); virtual;'#010+
' Procedure GetInstallFiles(List : TStrings; const APrefixU, APrefix'+
'B: S','tring; ACPU:TCPU; AOS : TOS); virtual;'#010+
' Procedure GetArchiveFiles(List : TStrings; ACPU:TCPU; AOS : TOS); '+
'virtual;'#010+
' Property Dependencies : TDependencies Read FDependencies;'#010+
' Property Commands : TCommands Read FCommands;'#010+
' Proper','ty State : TTargetState Read FTargetState;'#010+
' Property TargetType : TTargetType Read FTargetType Write FTargetTy'+
'pe;'#010+
' Property OSes : TOSes Read FOSes Write FOSes;'#010+
' Property CPUs : TCPUs Read FCPUs Write FCPUs;'#010+
' Property Mode : TCo','mpilerMode Read FMode Write FMode;'#010+
' Property Options : String Read FOptions Write Foptions;'#010+
' Property SourceFileName: String Read GetSourceFileName ;'#010+
' Property UnitFileName : String Read GetUnitFileName;'#010+
' Property ObjectFileName',' : String Read GetObjectFileName;'#010+
' Property RSTFileName : String Read GetRSTFileName;'#010+
' Property FPCTarget : String Read FFPCTarget Write FFPCTarget;'#010+
' Property Extension : String Read FExtension Write FExtension;'#010+
' Property FileTy','pe : TFileType Read FFileType Write FFileType;'#010+
' Property Directory : String Read FDirectory Write FDirectory;'#010+
' Property ResourceStrings : Boolean Read FResourceStrings Write FRe'+
'sourceStrings;'#010+
' Property Install : Boolean Read FInsta','ll Write FInstall;'#010+
' Property TargetSourceFileName: String Read FTargetSourceFileName;'#010+
' Property ObjectPath : TConditionalStrings Read FObjectPath;'#010+
' Property UnitPath : TConditionalStrings Read FUnitPath;'#010+
' Property IncludePath : ','TConditionalStrings Read FIncludePath;'#010+
' // Events.'#010+
' Property BeforeCompile : TNotifyEvent Read FBeforeCompile Write FB'+
'eforeCompile;'#010+
' Property AfterCompile : TNotifyEvent Read FAfterCompile Write FAft'+
'erCompile;'#010+
' Property BeforeCl','ean : TNotifyEvent Read FBeforeClean Write FBef'+
'oreClean;'#010+
' Property AfterClean : TNotifyEvent Read FAfterClean Write FAfterCl'+
'ean;'#010+
' end;'#010+
#010+
' { TTargets }'#010+
#010+
' TTargets = Class(TNamedCollection)'#010+
' private'#010+
' function GetTargetItem(Index : In','teger): TTarget;'#010+
' function GetTarget(const AName : String): TTarget;'#010+
' procedure SetTargetItem(Index : Integer; const AValue: TTarget);'#010+
' Public'#010+
' Function AddUnit(Const AUnitName : String) : TTarget;inline;'#010+
' Function AddUnit(Cons','t AUnitName : String;const OSes:TOSes) : TT'+
'arget;inline;'#010+
'{$ifdef cpu_only_overloads}'#010+
' Function AddUnit(Const AUnitName : String;const CPUs:TCPUs) : TTar'+
'get;inline;'#010+
'{$endif cpu_only_overloads}'#010+
' Function AddUnit(Const AUnitName : String',';const CPUs:TCPUs;const'+
' OSes:TOSes) : TTarget;'#010+
' Function AddImplicitUnit(Const AUnitName : String;InstallUnit:bool'+
'ean=true) : TTarget;inline;'#010+
' Function AddImplicitUnit(Const AUnitName : String;const OSes:TOSes'+
';InstallUnit:boolean=true',') : TTarget;inline;'#010+
' Function AddImplicitUnit(Const AUnitName : String;const CPUs:TCPUs'+
';InstallUnit:boolean=true) : TTarget;inline;'#010+
' Function AddImplicitUnit(Const AUnitName : String;const CPUs:TCPUs'+
';const OSes:TOSes;InstallUnit:boole','an=true) : TTarget;'#010+
' Function AddProgram(Const AProgramName : String) : TTarget;inline;'+
#010+
' Function AddProgram(Const AProgramName : String;const OSes:TOSes) '+
': TTarget;inline;'#010+
'{$ifdef cpu_only_overloads}'#010+
' Function AddProgram(Const APr','ogramName : String;const CPUs:TCPUs'+
') : TTarget;inline;'#010+
'{$endif cpu_only_overloads}'#010+
' Function AddProgram(Const AProgramName : String;const CPUs:TCPUs;c'+
'onst OSes:TOSes) : TTarget;'#010+
' Function AddExampleUnit(Const AUnitName : String) : TTa','rget;inli'+
'ne;'#010+
' Function AddExampleUnit(Const AUnitName : String;const OSes:TOSes)'+
' : TTarget;inline;'#010+
'{$ifdef cpu_only_overloads}'#010+
' Function AddExampleUnit(Const AUnitName : String;const CPUs:TCPUs)'+
' : TTarget;inline;'#010+
'{$endif cpu_only_over','loads}'#010+
' Function AddExampleUnit(Const AUnitName : String;const CPUs:TCPUs;'+
'const OSes:TOSes) : TTarget;'#010+
' Function AddExampleProgram(Const AProgramName : String) : TTarget;'+
'inline;'#010+
' Function AddExampleProgram(Const AProgramName : Stri','ng;const OSe'+
's:TOSes) : TTarget;inline;'#010+
'{$ifdef cpu_only_overloads}'#010+
' Function AddExampleProgram(Const AProgramName : String;const CPUs:'+
'TCPUs) : TTarget;inline;'#010+
'{$endif cpu_only_overloads}'#010+
' Function AddExampleProgram(Const AProgramName ',': String;const CPU'+
's:TCPUs;const OSes:TOSes) : TTarget;'#010+
' Property Targets[AName : String] : TTarget Read GetTarget; default'+
';'#010+
' Property TargetItems[Index : Integer] : TTarget Read GetTargetItem'+
' Write SetTargetItem;'#010+
' end;'#010+
#010+
' { TSource }',#010+
#010+
' TSource = Class(TNamedItem)'#010+
' private'#010+
' FSourceType : TSourceType;'#010+
' Public'#010+
' Constructor Create(ACollection : TCollection); override;'#010+
' Destructor Destroy; override;'#010+
' property SourceType : TSourceType read FSourceType;'#010+
' end;'#010,
#010+
' { TSources }'#010+
#010+
' TSources = Class(TNamedCollection)'#010+
' private'#010+
' function GetSourceItem(Index : Integer): TSource;'#010+
' procedure SetSourceItem(Index : Integer; const AValue: TSource);'#010+
' public'#010+
' Function AddDoc(const AFiles : String) :',' TSource;'#010+
' Function AddSrc(const AFiles : String) : TSource;'#010+
' Function AddExample(const AFiles : String) : TSource;'#010+
' Function AddTest(const AFiles : String) : TSource;'#010+
' procedure AddDocFiles(const AFileMask: string; Recursive: b','oolea'+
'n = False);'#010+
' procedure AddSrcFiles(const AFileMask: string; Recursive: boolean '+
'= False);'#010+
' procedure AddExampleFiles(const AFileMask: string; Recursive: bool'+
'ean = False);'#010+
' procedure AddTestFiles(const AFileMask: string; Recursi','ve: boole'+
'an = False);'#010+
' Property SourceItems[Index : Integer] : TSource Read GetSourceItem'+
' Write SetSourceItem;default;'#010+
' end;'#010+
#010+
' { TPackage }'#010+
#010+
' TPackage = Class(TNamedItem)'#010+
' private'#010+
' FAfterArchive: TNotifyEvent;'#010+
' FAfterClean: TNo','tifyEvent;'#010+
' FAfterCompile: TNotifyEvent;'#010+
' FAfterInstall: TNotifyEvent;'#010+
' FAfterManifest: TNotifyEvent;'#010+
' FBeforeArchive: TNotifyEvent;'#010+
' FBeforeClean: TNotifyEvent;'#010+
' FBeforeCompile: TNotifyEvent;'#010+
' FBeforeInstall: TNotifyEv','ent;'#010+
' FBeforeManifest: TNotifyEvent;'#010+
' FUnitPath,'#010+
' FObjectPath,'#010+
' FIncludePath,'#010+
' FSourcePath,'#010+
' FExamplePath,'#010+
' FTestPath,'#010+
' FCleanFiles,'#010+
' FInstallFiles : TConditionalStrings;'#010+
' FDependencies : TDependencies;'#010+
' FCP','Us: TCPUs;'#010+
' FOSes: TOSes;'#010+
' FTargetState: TTargetState;'#010+
' FTargets: TTargets;'#010+
' FSources: TSources;'#010+
' FDirectory: String;'#010+
' FOptions: String;'#010+
' FFileName: String;'#010+
' FAuthor: String;'#010+
' FLicense: String;'#010+
' FExternalURL: S','tring;'#010+
' FVersion: TFPVersion;'#010+
' FEmail : String;'#010+
' FNeedLibC : Boolean;'#010+
' FCommands : TCommands;'#010+
' FDescriptionFile : String;'#010+
' FDescription : String;'#010+
' FInstalledChecksum : Cardinal;'#010+
' // Cached directory of installed pack','ages'#010+
' FUnitDir : String;'#010+
' Function GetDescription : string;'#010+
' Function GetFileName : string;'#010+
' Function GetVersion : string;'#010+
' Procedure SetVersion(const V : string);'#010+
' Protected'#010+
' procedure SetName(const AValue: String);overr','ide;'#010+
' procedure LoadUnitConfigFromFile(Const AFileName: String);'#010+
' procedure SaveUnitConfigToFile(Const AFileName: String;ACPU:TCPU;A'+
'OS:TOS);'#010+
' Public'#010+
' constructor Create(ACollection: TCollection); override;'#010+
' destructor destroy; ','override;'#010+
' Function GetUnitsOutputDir(ACPU:TCPU; AOS : TOS):String;'#010+
' Function GetBinOutputDir(ACPU:TCPU; AOS : TOS) : String;'#010+
' Procedure GetCleanFiles(List : TStrings; ACPU:TCPU; AOS : TOS); vi'+
'rtual;'#010+
' procedure GetInstallFiles','(List: TStrings;Types : TTargetTypes;AC'+
'PU:TCPU; AOS : TOS);'#010+
' Procedure GetArchiveFiles(List : TStrings; ACPU:TCPU; AOS : TOS); '+
'virtual;'#010+
' Procedure GetManifest(Manifest : TStrings);'#010+
' Property Version : String Read GetVersion Write S','etVersion;'#010+
' Property FileName : String Read GetFileName Write FFileName;'#010+
' Property ExternalURL : String Read FExternalURL Write FExternalURL'+
';'#010+
' Property Email : String Read FEmail Write FEmail;'#010+
' Property Author : String Read FAut','hor Write FAuthor;'#010+
' Property License : String Read FLicense Write FLicense;'#010+
' Property Directory : String Read FDirectory Write FDirectory;'#010+
' Property Description : String Read GetDescription Write FDescripti'+
'on;'#010+
' Property Descript','ionFile : String Read FDescriptionFile Write FD'+
'escriptionFile;'#010+
' Property InstalledChecksum : Cardinal Read FInstalledChecksum Writ'+
'e FInstalledChecksum;'#010+
' // Compiler options.'#010+
' Property OSes : TOSes Read FOSes Write FOSes;'#010+
' Proper','ty CPUs : TCPUs Read FCPUs Write FCPUs;'#010+
' Property NeedLibC : Boolean Read FNeedLibC Write FNeedLibC;'#010+
' Property Options: String Read FOptions Write FOptions;'#010+
' Property UnitPath : TConditionalStrings Read FUnitPath;'#010+
' Property Obje','ctPath : TConditionalStrings Read FObjectPath;'#010+
' Property IncludePath : TConditionalStrings Read FIncludePath;'#010+
' Property SourcePath : TConditionalStrings Read FSourcePath;'#010+
' Property ExamplePath : TConditionalStrings Read FExamplePat','h;'#010+
' Property TestPath : TConditionalStrings Read FTestPath;'#010+
' // Targets and dependencies'#010+
' Property InstallFiles : TConditionalStrings Read FInstallFiles;'#010+
' Property CleanFiles : TConditionalStrings Read FCleanFiles;'#010+
' Property ','Dependencies : TDependencies Read FDependencies;'#010+
' Property Commands : TCommands Read FCommands;'#010+
' Property State : TTargetState Read FTargetState;'#010+
' Property Targets : TTargets Read FTargets;'#010+
' Property Sources : TSources Read FSou','rces;'#010+
' Property UnitDir : String Read FUnitDir Write FUnitDir;'#010+
' // events'#010+
' Property BeforeCompile : TNotifyEvent Read FBeforeCompile Write FB'+
'eforeCompile;'#010+
' Property AfterCompile : TNotifyEvent Read FAfterCompile Write FAft'+
'erComp','ile;'#010+
' Property BeforeInstall : TNotifyEvent Read FBeforeInstall Write FB'+
'eforeInstall;'#010+
' Property AfterInstall : TNotifyEvent Read FAfterInstall Write FAft'+
'erInstall;'#010+
' Property BeforeClean : TNotifyEvent Read FBeforeClean Write FBefor',
'eClean;'#010+
' Property AfterClean : TNotifyEvent Read FAfterClean Write FAfterCl'+
'ean;'#010+
' Property BeforeArchive : TNotifyEvent Read FBeforeArchive Write FB'+
'eforeArchive;'#010+
' Property AfterArchive : TNotifyEvent Read FAfterArchive Write FAft'+
'erA','rchive;'#010+
' Property BeforeManifest : TNotifyEvent Read FBeforeManifest Write '+
'FBeforeManifest;'#010+
' Property AfterManifest : TNotifyEvent Read FAfterManifest Write FA'+
'fterManifest;'#010+
' end;'#010+
#010+
' { TPackages }'#010+
#010+
' TPackages = Class(TNamedCollection',')'#010+
' private'#010+
' function GetPackage(const AName : String): TPackage;'#010+
' function GetPackageItem(AIndex : Integer): TPackage;'#010+
' procedure SetPackageItem(AIndex : Integer; const AValue: TPackage)'+
';'#010+
' Public'#010+
' Function AddPackage(Const ANa','me : String) : TPackage;'#010+
' Property Packages[AName : String] : TPackage Read GetPackage ; Def'+
'ault;'#010+
' Property PackageItems[AIndex : Integer] : TPackage Read GetPackage'+
'Item Write SetPackageItem;'#010+
' end;'#010+
#010+
' { TCustomDefaults }'#010+
#010+
' TCustomDe','faults = Class(TPersistent)'#010+
' Private'#010+
' FArchive: String;'#010+
' FCompiler: String;'#010+
' FCopy: String;'#010+
' FMkDir: String;'#010+
' FMove: String;'#010+
' FOptions: String;'#010+
' FCPU: TCPU;'#010+
' FOS: TOS;'#010+
' FMode : TCompilerMode;'#010+
' FCompilerVersion',' : String;'#010+
' FPrefix: String;'#010+
' FLocalUnitDir,'#010+
' FGlobalUnitDir,'#010+
' FBaseInstallDir,'#010+
' FUnitInstallDir,'#010+
' FBinInstallDir,'#010+
' FDocInstallDir,'#010+
' FExamplesInstallDir : String;'#010+
' FRemove: String;'#010+
' FTarget: String;'#010+
' FUnixPa','ths: Boolean;'#010+
' FNoFPCCfg: Boolean;'#010+
' function GetLocalUnitDir: String;'#010+
' function GetGlobalUnitDir: String;'#010+
' function GetBaseInstallDir: String;'#010+
' function GetBinInstallDir: String;'#010+
' function GetCompiler: String;'#010+
' function',' GetDocInstallDir: String;'#010+
' function GetExamplesInstallDir: String;'#010+
' function GetUnitInstallDir: String;'#010+
' procedure SetLocalUnitDir(const AValue: String);'#010+
' procedure SetGlobalUnitDir(const AValue: String);'#010+
' procedure SetBaseI','nstallDir(const AValue: String);'#010+
' procedure SetCPU(const AValue: TCPU);'#010+
' procedure SetOS(const AValue: TOS);'#010+
' procedure SetPrefix(const AValue: String);'#010+
' procedure SetTarget(const AValue: String);'#010+
' Protected'#010+
' procedure Recal','cTarget;'#010+
' Public'#010+
' Constructor Create;'#010+
' Procedure InitDefaults;'#010+
' procedure CompilerDefaults; virtual;'#010+
' Procedure LocalInit(Const AFileName : String);'#010+
' Procedure LoadFromFile(Const AFileName : String);'#010+
' Procedure SaveToFile','(Const AFileName : String);'#010+
' procedure SaveToStream(S : TStream);virtual;'#010+
' procedure LoadFromStream(S : TStream);virtual;'#010+
' // Compile Information'#010+
' Property Target : String Read FTarget Write SetTarget;'#010+
' Property OS : TOS Read',' FOS Write SetOS;'#010+
' Property CPU : TCPU Read FCPU Write SetCPU;'#010+
' Property Mode : TCompilerMode Read FMode Write FMode;'#010+
' Property UnixPaths : Boolean Read FUnixPaths Write FUnixPaths;'#010+
' Property Options : String Read FOptions Write',' FOptions; // De'+
'fault compiler options.'#010+
' Property NoFPCCfg : Boolean Read FNoFPCCfg Write FNoFPCCfg;'#010+
' // paths etc.'#010+
' Property LocalUnitDir : String Read GetLocalUnitDir Write SetLocal'+
'UnitDir;'#010+
' Property GlobalUnitDir : String ','Read GetGlobalUnitDir Write SetG'+
'lobalUnitDir;'#010+
' Property Prefix : String Read FPrefix Write SetPrefix;'#010+
' Property BaseInstallDir : String Read GetBaseInstallDir Write SetB'+
'aseInstallDir;'#010+
' Property UnitInstallDir : String Read GetUnitI','nstallDir Write FU'+
'nitInstallDir;'#010+
' Property BinInstallDir : String Read GetBinInstallDir Write FBinIn'+
'stallDir;'#010+
' Property DocInstallDir : String Read GetDocInstallDir Write FDocIn'+
'stallDir;'#010+
' Property ExamplesInstallDir : String Read G','etExamplesInstallDir '+
'Write FExamplesInstallDir;'#010+
' // Command tools. If not set, internal commands will be used.'#010+
' Property Compiler : String Read GetCompiler Write FCompiler; // Co'+
'mpiler. Defaults to fpc'#010+
' Property Copy : String Read',' FCopy Write FCopy; // co'+
'py $(FILES) to $(DEST)'#010+
' Property Move : String Read FMove Write FMove; // Move'+
' $(FILES) to $(DEST)'#010+
' Property Remove : String Read FRemove Write FRemove; // Dele'+
'te $(FILES)'#010+
' Pro','perty MkDir : String Read FMkDir write FMkDir; // Ma'+
'ke $(DIRECTORY)'#010+
' Property Archive : String Read FArchive Write FArchive; // zip '+
'$(ARCHIVE) $(FILESORDIRS)'#010+
' end;'#010+
#010+
' { TBasicDefaults }'#010+
#010+
' TBasicDefaults = Class(TCustomDefau','lts)'#010+
' end;'#010+
#010+
' { TFPCDefaults }'#010+
#010+
' TFPCDefaults = Class(TCustomDefaults)'#010+
' public'#010+
' procedure CompilerDefaults; override;'#010+
' end;'#010+
#010+
' { TBuildEngine }'#010+
#010+
' TBuildEngine = Class(TComponent)'#010+
' private'#010+
' // general variables'#010+
' FCompiler : St','ring;'#010+
' FStartDir : String;'#010+
' FForceCompile : Boolean;'#010+
' FListMode : Boolean;'#010+
'{$ifdef HAS_UNIT_ZIPPER}'#010+
' FZipFile: TZipper;'#010+
'{$endif HAS_UNIT_ZIPPER}'#010+
' FExternalPackages : TPackages;'#010+
' // Logging'#010+
' FLogPrefix : String;'#010+
' // E','vents'#010+
' FOnLog: TLogEvent;'#010+
' FAfterArchive: TNotifyEvent;'#010+
' FAfterClean: TNotifyEvent;'#010+
' FAfterCompile: TNotifyEvent;'#010+
' FAfterInstall: TNotifyEvent;'#010+
' FAfterManifest: TNotifyEvent;'#010+
' FBeforeArchive: TNotifyEvent;'#010+
' FBeforeCl','ean: TNotifyEvent;'#010+
' FBeforeCompile: TNotifyEvent;'#010+
' FBeforeInstall: TNotifyEvent;'#010+
' FBeforeManifest: TNotifyEvent;'#010+
' Protected'#010+
' Procedure Error(const Msg : String);'#010+
' Procedure Error(const Fmt : String; const Args : Array of con','st)'+
';'#010+
' // Internal copy/delete/move/archive/mkdir files'#010+
' Function SysDirectoryExists(const ADir:string):Boolean;'#010+
' Function SysFileExists(const AFileName:string):Boolean;'#010+
' Procedure SysCopyFile(Const Src,Dest : String); virtual;',#010+
' Procedure SysMoveFile(Const Src,Dest : String); virtual;'#010+
' Procedure SysDeleteFile(Const AFileName : String); virtual;'#010+
' Procedure SysArchiveFiles(List : TStrings; Const AFileName : Strin'+
'g); virtual;'#010+
' procedure LogIndent;'#010+
' pr','ocedure LogUnIndent;'#010+
' Procedure Log(Level : TVerboseLevel; Const Msg : String);'#010+
' Procedure Log(Level : TVerboseLevel; Const Fmt : String; const Arg'+
's : Array Of Const);'#010+
' Procedure EnterDir(ADir : String);'#010+
' Function GetCompiler : ','String;'#010+
' Function InstallPackageFiles(APAckage : TPackage; tt : TTargetType'+
'; Const Dest : String):Boolean;'#010+
' Function FileNewer(const Src,Dest : String) : Boolean;'#010+
' Procedure LogSearchPath(const ASearchPathName:string;Path:TConditi'+
'o','nalStrings; ACPU:TCPU;AOS:TOS);'#010+
' Function FindFileInPath(Path:TConditionalStrings; AFileName:String'+
'; var FoundPath:String;ACPU:TCPU;AOS:TOS):Boolean;'#010+
#010+
' //package commands'#010+
' Procedure ResolveFileNames(APackage : TPackage; ACPU:TCPU;A','OS:TO'+
'S;DoChangeDir:boolean=true);'#010+
' function GetUnitDir(APackage:TPackage):String;'#010+
' procedure AddDependencyIncludePaths(L:TStrings;ATarget: TTarget);'#010+
' procedure AddDependencyUnitPaths(L:TStrings;APackage: TPackage);'#010+
' Public'#010+
' Co','nstructor Create(AOwner : TComponent); override;'#010+
' destructor Destroy;override;'#010+
' // Public Copy/delete/Move/Archive/Mkdir Commands.'#010+
' Procedure ExecuteCommand(const Cmd,Args : String; IgnoreError : Bo'+
'olean = False); virtual;'#010+
' Proc','edure CmdCopyFiles(List : TStrings; Const DestDir : String);'+
#010+
' Procedure CmdCreateDir(const DestDir : String);'#010+
' Procedure CmdMoveFiles(List : TStrings; Const DestDir : String);'#010+
' Procedure CmdDeleteFiles(List : TStrings);'#010+
' Procedu','re CmdArchiveFiles(List : TStrings; Const ArchiveFile : S'+
'tring);'#010+
' Procedure ExecuteCommands(Commands : TCommands; At : TCommandAt);'#010+
' // Dependency commands'#010+
' Function DependencyOK(ADependency : TDependency) : Boolean;'#010+
' // Target',' commands'#010+
' Function GetCompilerCommand(APackage : TPackage; ATarget : TTarge'+
't) : String;'#010+
' Function TargetOK(ATarget : TTarget) : Boolean;'#010+
' Function NeedsCompile(APackage:TPackage; ATarget : TTarget) : Boo'+
'lean;'#010+
' Procedure Comp','ile(APackage:TPackage; ATarget : TTarget); virtua'+
'l;'#010+
' Procedure MaybeCompile(APackage:TPackage; ATarget: TTarget);'#010+
' Procedure CompileDependencies(APackage:TPackage; ATarget: TTarget)'+
';'#010+
' // Package commands'#010+
'{ Function GetPackageD','ir(APackage : TPackage; AbsolutePath : Boo'+
'lean = False) : String;'#010+
' Function GetUnitsOutputDir(APackage : TPackage; AbsolutePath : Bo'+
'olean = False) : String;'#010+
' Function GetBinOutputDir(APackage : TPackage; AbsolutePath : Bool'+
'ean = Fal','se) : String; }'#010+
' Function PackageOK(APackage : TPackage) : Boolean; virtual;'#010+
' Procedure DoBeforeCompile(APackage : TPackage);virtual;'#010+
' Procedure DoAfterCompile(APackage : TPackage);virtual;'#010+
' Procedure DoBeforeInstall(APackage ',': TPackage);virtual;'#010+
' Procedure DoAfterInstall(APackage : TPackage);virtual;'#010+
' Procedure DoBeforeArchive(APackage : TPackage);virtual;'#010+
' Procedure DoAfterArchive(APackage : TPackage);virtual;'#010+
' Procedure DoBeforeClean(APackage : TP','ackage);virtual;'#010+
' Procedure DoAfterClean(APackage : TPackage);virtual;'#010+
' Function NeedsCompile(APackage : TPackage) : Boolean; virtual;'#010+
' Procedure Compile(APackage : TPackage);'#010+
' Procedure MaybeCompile(APackage:TPackage);'#010+
' Pro','cedure Install(APackage : TPackage);'#010+
' Procedure Archive(APackage : TPackage);'#010+
' Procedure Manifest(APackage : TPackage);'#010+
' Procedure Clean(APackage : TPackage);'#010+
' Procedure CompileDependencies(APackage : TPackage);'#010+
' Function Ch','eckExternalPackage(Const APackageName : String):TPac'+
'kage;'#010+
' procedure CreateOutputDir(APackage: TPackage);'#010+
' // Packages commands'#010+
' Procedure Compile(Packages : TPackages);'#010+
' Procedure Install(Packages : TPackages);'#010+
' Procedure Ar','chive(Packages : TPackages);'#010+
' procedure Manifest(Packages: TPackages);'#010+
' Procedure Clean(Packages : TPackages);'#010+
' Property ListMode : Boolean Read FListMode Write FListMode;'#010+
' Property ForceCompile : Boolean Read FForceCompile Writ','e FForceC'+
'ompile;'#010+
' Property ExternalPackages: TPackages Read FExternalPackages;'#010+
' // Events'#010+
' Property BeforeCompile : TNotifyEvent Read FBeforeCompile Write FB'+
'eforeCompile;'#010+
' Property AfterCompile : TNotifyEvent Read FAfterCompile ','Write FA'+
'fterCompile;'#010+
' Property BeforeInstall : TNotifyEvent Read FBeforeInstall Write FB'+
'eforeInstall;'#010+
' Property AfterInstall : TNotifyEvent Read FAfterInstall Write FAft'+
'erInstall;'#010+
' Property BeforeClean : TNotifyEvent Read FBeforeCl','ean Write FBef'+
'oreClean;'#010+
' Property AfterClean : TNotifyEvent Read FAfterClean Write FAfterCl'+
'ean;'#010+
' Property BeforeArchive : TNotifyEvent Read FBeforeArchive Write FB'+
'eforeArchive;'#010+
' Property AfterArchive : TNotifyEvent Read FAfterArchi','ve Write FA'+
'fterArchive;'#010+
' Property BeforeManifest : TNotifyEvent Read FBeforeManifest Write '+
'FBeforeManifest;'#010+
' Property AfterManifest : TNotifyEvent Read FAfterManifest Write FA'+
'fterManifest;'#010+
' Property OnLog : TLogEvent Read FOnLog Wr','ite FOnlog;'#010+
' end;'#010+
#010+
' { TCustomInstaller }'#010+
#010+
' TCustomInstaller = Class(TComponent)'#010+
' private'#010+
' FBuildEngine: TBuildEngine;'#010+
' FPackages: TPackages;'#010+
' FRunMode: TRunMode;'#010+
' FListMode : Boolean;'#010+
' FLogLevels : TVerboseLevels;'#010+
' Prote','cted'#010+
' Procedure Log(Level : TVerboseLevel; Const Msg : String);'#010+
' Procedure CreatePackages; virtual;'#010+
' Procedure CheckPackages; virtual;'#010+
' Procedure CreateBuildEngine; virtual;'#010+
' Procedure Error(const Msg : String);'#010+
' Procedure',' Error(const Fmt : String; Args : Array of const);'#010+
' Procedure AnalyzeOptions;'#010+
' Procedure Usage(const FMT : String; Args : Array of const);'#010+
' Procedure Compile(Force : Boolean); virtual;'#010+
' Procedure Clean; virtual;'#010+
' Procedure In','stall; virtual;'#010+
' Procedure Archive; virtual;'#010+
' Procedure Manifest; virtual;'#010+
' Property BuildEngine : TBuildEngine Read FBuildEngine;'#010+
' Public'#010+
' Constructor Create(AOwner : TComponent); virtual;'#010+
' Destructor destroy; override;'#010+
' ',' Function AddPackage(Const AName : String) : TPackage;'#010+
' Function Run : Boolean;'#010+
' //files in package'#010+
' Property Packages : TPackages Read FPackages;'#010+
' Property RunMode : TRunMode Read FRunMode;'#010+
' Property ListMode : Boolean Read ','FListMode;'#010+
' end;'#010+
#010+
' { TFPCInstaller }'#010+
' TFPCInstaller = class(TCustomInstaller)'#010+
' public'#010+
' Constructor Create(AOwner : TComponent); override;'#010+
' end;'#010+
#010+
' { TBasicInstaller }'#010+
' TBasicInstaller = class(TCustomInstaller)'#010+
' Constructor Creat','e(AOwner : TComponent); override;'#010+
' end;'#010+
#010+
' TReplaceFunction = Function (Const AName,Args : String) : String of '+
'Object;'#010+
#010+
' { TValueItem }'#010+
#010+
' TValueItem = Class(TObject)'#010+
' FValue : String;'#010+
' Constructor Create(AValue : String);'#010+
' end;'#010+
#010+
' ',' { TFunctionItem }'#010+
#010+
' TFunctionItem = Class(TObject)'#010+
' FFunc : TReplaceFunction;'#010+
' Constructor Create(AFunc : TReplaceFunction);'#010+
' end;'#010+
#010+
' { TDictionary }'#010+
#010+
' TDictionary = Class(TComponent)'#010+
' FList : TStringList;'#010+
' Public'#010+
' Construc','tor Create(AOwner : TComponent); override;'#010+
' Destructor Destroy;override;'#010+
' Procedure AddVariable(Const AName,Value : String);'#010+
' Procedure AddFunction(Const AName : String; FReplacement : TReplac'+
'eFunction);'#010+
' Procedure RemoveItem(Co','nst AName : String);'#010+
' Function GetValue(Const AName : String) : String;'#010+
' Function GetValue(Const AName,Args : String) : String; virtual;'#010+
' Function ReplaceStrings(Const ASource : String) : String; virtual;'+
#010+
' end;'#010+
#010+
' ECollectionError',' = Class(Exception);'#010+
' EDictionaryError = Class(Exception);'#010+
' EInstallerError = Class(Exception);'#010+
#010+
' TInstallerClass = Class of TCustomInstaller;'#010+
' TDictionaryClass = Class of TDictionary;'#010+
#010+
'Type'#010+
' TArchiveEvent = Procedure (Const AFileName ',': String; List : TStrin'+
'gs) of Object;'#010+
' TArchiveProc = Procedure (Const AFileName : String; List : TStrings)'+
';'#010+
#010+
'Var'#010+
' DictionaryClass : TDictionaryClass = TDictionary;'#010+
' OnArchiveFiles : TArchiveEvent = Nil;'#010+
' ArchiveFilesProc : TArchiveProc',' = Nil;'#010+
#010+
' Defaults : TCustomDefaults; // Set by installer.'#010+
' Dictionary : TDictionary;'#010+
#010+
#010+
'Function CurrentOS : String;'#010+
'Function CurrentCPU : String;'#010+
#010+
'Function Installer(InstallerClass: TInstallerClass) : TCustomInstaller'+
'; overload;'#010+
'Function',' Installer : TCustomInstaller; overload;'#010+
#010+
'Function OSToString(OS: TOS) : String;'#010+
'Function OSesToString(OSes: TOSes) : String;'#010+
'Function CPUToString(CPU: TCPU) : String;'#010+
'Function CPUSToString(CPUS: TCPUS) : String;'#010+
'Function StringToOS(const S',' : String) : TOS;'#010+
'Function OSesToString(const S : String) : TOSes;'#010+
'Function StringToCPU(const S : String) : TCPU;'#010+
'Function StringToCPUS(const S : String) : TCPUS;'#010+
'Function ModeToString(Mode: TCompilerMode) : String;'#010+
'Function StringToMode(co','nst S : String) : TCompilerMode;'#010+
'Function MakeTargetString(CPU : TCPU;OS: TOS) : String;'#010+
'Procedure StringToCPUOS(const S : String; Var CPU : TCPU; Var OS: TOS)'+
';'#010+
'Function FixPath (const APath : String) : String;'#010+
'Procedure ChangeDir(const APa','th : String);'#010+
'Function Substitute(Const Source : String; Macros : Array of string) :'+
' String;'#010+
'Procedure SplitCommand(Const Cmd : String; Var Exe,Options : String);'#010+
#010+
'Implementation'#010+
#010+
'uses typinfo;'#010+
#010+
'ResourceString'#010+
' SErrInvalidCPU = '#039'Inv','alid CPU name "%s"'#039';'#010+
' SErrInvalidOS = '#039'Invalid OS name "%s"'#039';'#010+
' SErrInvalidMode = '#039'Invalid compiler mode "%s"'#039';'#010+
' SErrInvalidTarget = '#039'Invalid compiler target "%s"'#039';'#010+
' SErrNameExists = '#039'Name "%s" already exists in ','the colle'+
'ction.'#039';'#010+
' SErrNoSuchName = '#039'Could not find item with name "%s" in t'+
'he collection.'#039';'#010+
' SErrInValidArgument = '#039'Invalid command-line argument at positi'+
'on %d: %s'#039';'#010+
' SErrNeedArgument = '#039'Option at position %d (%s) needs a','n a'+
'rgument'#039';'#010+
' SErrNoPackagesDefined = '#039'No action possible: No packages were de'+
'fined.'#039';'#010+
' SErrInstaller = '#039'The installer encountered the following'+
' error:'#039';'#010+
' SErrDepUnknownTarget = '#039'Unknown target in dependencies for %s: '+
'%s'#039';'#010+
' SEr','rExternalCommandFailed = '#039'External command "%s" failed with'+
' exit code %d'#039';'#010+
' SErrCreatingDirectory = '#039'Failed to create directory "%s"'#039';'#010+
' SErrDeletingFile = '#039'Failed to delete file "%s"'#039';'#010+
' SErrMovingFile = '#039'Failed to move file "','%s" to "%s"'#039';'+
#010+
' SErrCopyingFile = '#039'Failed to copy file "%s" to "%s"'#039';'#010+
' SErrChangeDirFailed = '#039'Failed to enter directory "%s"'#039';'#010+
' SErrInvalidArgumentToSubstitute = '#039'Invalid number of arguments t'+
'o Substitute'#039';'#010+
' SErrNoArchiveSupport ',' = '#039'This binary contains no archive suppo'+
'rt. Please recompile with archive support'#039';'#010+
' SErrNoDictionaryItem = '#039'No item called "%s" in the dictionary'#039+
';'#010+
' SErrNoDictionaryValue = '#039'The item "%s" in the dictionary is not '+
'a value'#039';'#010+
' SErrNoDict','ionaryFunc = '#039'The item "%s" in the dictionary is no'+
't a function'#039';'#010+
' SErrInvalidFPCInfo = '#039'Compiler returns invalid information, c'+
'heck if fpc -iV works'#039';'#010+
' SErrDependencyNotFound = '#039'Could not find unit directory for depe'+
'ndency package "%','s"'#039';'#010+
' SErrAlreadyInitialized = '#039'Installer can only be initialized once'+
#039';'#010+
' SErrInvalidState = '#039'Invalid state for target %s'#039';'#010+
#010+
' SWarnCircularTargetDependency = '#039'Warning: Circular dependency de'+
'tected when compiling target %s with targe','t %s'#039';'#010+
' SWarnCircularPackageDependency = '#039'Warning: Circular dependency d'+
'etected when compiling package %s with package %s'#039';'#010+
' SWarnFailedToSetTime = '#039'Warning: Failed to set timestamp on f'+
'ile "%s"'#039';'#010+
' SWarnFailedToGetTime = '#039'Warning: ','Failed to get timestamp fr'+
'om file "%s"'#039';'#010+
' SWarnFileDoesNotExist = '#039'Warning: File "%s" does not exist'#039+
';'#010+
' SWarnAttemptingToCompileNonNeutralTarget = '#039'Warning: Attempting '+
'to compile non-neutral target %s'#039';'#010+
' SWarnSourceFileNotFound = '#039'War','ning: Source file "%s" not foun'+
'd for %s'#039';'#010+
' SWarnIncludeFileNotFound = '#039'Warning: Include file "%s" not found'+
' for %s'#039';'#010+
' SWarnDepUnitNotFound = '#039'Warning: Dependency on unit %s is no'+
't supported for %s'#039';'#010+
#010+
' SInfoCompilingPackage = '#039'Compi','ling package %s'#039';'#010+
' SInfoCompilingTarget = '#039'Compiling target %s'#039';'#010+
' SInfoExecutingCommand = '#039'Executing command "%s %s"'#039';'#010+
' SInfoCreatingOutputDir = '#039'Creating output dir "%s"'#039';'#010+
' SInfoInstallingPackage = '#039'Installing package %s'#039';'#010+
' SIn','foArchivingPackage = '#039'Archiving package %s in "%s"'#039';'#010+
' SInfoCleaningPackage = '#039'Cleaning package %s'#039';'#010+
' SInfoManifestPackage = '#039'Creating manifest for package %s'#039';'+
#010+
' SInfoCopyingFile = '#039'Copying file "%s" to "%s"'#039';'#010+
' SInfoSource','NewerDest = '#039'Source file "%s" (%s) is newer than'+
' destination "%s" (%s).'#039';'#010+
#010+
' SDbgComparingFileTimes = '#039'Comparing file "%s" time "%s" to "%'+
's" time "%s".'#039';'#010+
' SDbgCompilingDependenciesOfTarget = '#039'Compiling dependencies of t'+
'arget %s'#039';'#010+
' S','DbgResolvingSourcesOfTarget = '#039'Resolving filenames of target '+
'%s for %s'#039';'#010+
' SDbgResolvedSourceFile = '#039'Resolved source file %s to "%s"'#039+
';'#010+
' SDbgResolvedIncludeFile = '#039'Resolved include file %s to "%s"'#039+
';'#010+
' SDbgOutputNotYetAvailable = '#039'Outpu','t file %s not available'#039';'+
#010+
' SDbgDependencyOnUnit = '#039'Dependency of %s on unit %s'#039';'#010+
' SDbgDependencyUnitRecompiled = '#039'Dependent unit %s is being recom'+
'piled'#039';'#010+
' SDbgMustCompile = '#039'Must compile %s'#039';'#010+
' SDbgSkippingTargetWrongCPU =',' '#039'Skipping target %s, different CP'+
'U (%s)'#039';'#010+
' SDbgSkippingTargetWrongOS = '#039'Skipping target %s, different OS ('+
'%s)'#039';'#010+
' SDbgTargetIsNotAUnitOrProgram = '#039'Skipping Target %s, not an unit'+
' or program'#039';'#010+
' SDbgConsideringTarget = '#039'Considering ta','rget %s'#039';'#010+
' SDbgConsideringPackage = '#039'Considering package %s'#039';'#010+
' SDbgExternalDependency = '#039'External dependency %s found in "%s'+
'"'#039';'#010+
' SDbgBuildEngineArchiving = '#039'Build engine archiving'#039';'#010+
' SDbgBuildEngineGenerateManifests = '#039'Build engi','ne generating ma'+
'nifests'#039';'#010+
' SDbgBuildEngineCleaning = '#039'Build engine cleaning'#039';'#010+
' SDbgGenerating = '#039'Generating "%s"'#039';'#010+
' SDbgLoading = '#039'Loading "%s"'#039';'#010+
' SDbgFound = '#039'Found'#039';'#010+
' SDbgNotFound ',' = '#039'Not Found'#039';'#010+
' SDbgDirectoryExists = '#039'Directory "%s" %s'#039';'#010+
' SDbgFileExists = '#039'File "%s" %s'#039';'#010+
' SDbgArchivingFile = '#039'Archiving "%s"'#039';'#010+
' SDbgSearchPath = '#039'Using %s path "%s"'#039';'#010+
' SDbgEnterDir ',' = '#039'Entering directory "%s"'#039';'#010+
' SDbgPackageChecksumChanged = '#039'Dependent package %s is modified'#039+
';'#010+
#010+
' // Help messages for usage'#010+
' SValue = '#039'Value'#039';'#010+
' SHelpUsage = '#039'Usage: %s command [options]'#039';'#010+
' SHelpCommand =',' '#039'Where command is one of the following:'#039+
';'#010+
' SHelpCompile = '#039'Compile all units in the package(s).'#039';'+
#010+
' SHelpBuild = '#039'Build all units in the package(s).'#039';'#010+
' SHelpInstall = '#039'Install all units in the package(s).'#039';'+
#010+
' SHelp','Clean = '#039'Clean (remove) all units in the package'+
'(s).'#039';'#010+
' SHelpArchive = '#039'Create archive (zip) with all units in th'+
'e package(s).'#039';'#010+
' SHelpHelp = '#039'This message.'#039';'#010+
' SHelpManifest = '#039'Create a manifest suitable f','or import i'+
'n repository.'#039';'#010+
' SHelpCmdOptions = '#039'Where options is one or more of the follo'+
'wing:'#039';'#010+
' SHelpCPU = '#039'Compile for indicated CPU.'#039';'#010+
' SHelpOS = '#039'Compile for indicated OS'#039';'#010+
' SHelpTarget = '#039'Compile ','for indicated target'#039';'#010+
' SHelpList = '#039'list commands instead of actually executi'+
'ng them.'#039';'#010+
' SHelpPrefix = '#039'Use indicated prefix directory for all co'+
'mmands.'#039';'#010+
' SHelpNoFPCCfg = '#039'Compiler will not use fpc.cfg'#039';'#010+
' SHelp','BaseInstallDir = '#039'Use indicated directory as base install'+
' dir.'#039';'#010+
' SHelpLocalUnitDir = '#039'Use indicated directory as local (user) u'+
'nit dir.'#039';'#010+
' SHelpGlobalUnitDir = '#039'Use indicated directory as global unit di'+
'r.'#039';'#010+
' SHelpCompiler = '#039'Us','e indicated binary as compiler'#039';'#010+
' SHelpConfig = '#039'Use indicated config file when compiling.'+
#039';'#010+
' SHelpVerbose = '#039'Be verbose when working.'#039';'#010+
#010+
#010+
'Const'#010+
' // Keys for Defaults file. Do not localize.'#010+
' KeyCompiler = '#039'Compiler'#039';'#010+
' Ke','yArchive = '#039'Archive'#039';'#010+
' KeyCopy = '#039'Copy'#039';'#010+
' KeyMkDir = '#039'MkDir'#039';'#010+
' KeyMove = '#039'Move'#039';'#010+
' KeyRemove = '#039'Remove'#039';'#010+
' KeyOptions = '#039'Options'#039';'#010+
' KeyCPU = '#039'CPU'#039';'#010+
' KeyOS = '#039'OS'#039';'#010+
' KeyMode = '#039'Mode'#039';'#010+
' KeyPrefix = '#039'Prefi','x'#039';'#010+
' KeyTarget = '#039'Target'#039';'#010+
' KeyNoFPCCfg = '#039'NoFPCCfg'#039';'#010+
' KeyLocalUnitDir = '#039'LocalUnitDir'#039';'#010+
' KeyGlobalUnitDir = '#039'GlobalUnitDir'#039';'#010+
' KeyBaseInstallDir = '#039'BaseInstallDir'#039';'#010+
' KeyUnitInstallDir = '#039'UnitInstallDir'#039';'#010+
' KeyBinI','nstallDir = '#039'BinInstallDir'#039';'#010+
' KeyDocInstallDir = '#039'DocInstallDir'#039';'#010+
' KeyExamplesInstallDir = '#039'ExamplesInstallDir'#039';'#010+
' // Keys for unit config'#010+
' KeyName = '#039'Name'#039';'#010+
' KeyVersion = '#039'Version'#039';'#010+
' KeyChecksum = '#039'Checksum'#039';'#010+
' KeyNeedL','ibC = '#039'NeedLibC'#039';'#010+
' KeyDepends = '#039'Depends'#039';'#010+
#010+
'{*********************************************************************'+
'*******'#010+
' Helpers'#010+
'**********************************************************************'+
'******','}'#010+
#010+
#010+
'Function QuoteXML(S : String) : string;'#010+
#010+
' Procedure W(Var J : Integer; Var R : String; T : String);'#010+
' Var'#010+
' I: integer;'#010+
' begin'#010+
' If J+Length(T)>Length(R) then'#010+
' SetLength(R,J+Length(T));'#010+
' For I:=1 to Length(t) do'#010+
' begi','n'#010+
' R[J]:=T[i];'#010+
' If I<Length(T) then'#010+
' Inc(J);'#010+
' end;'#010+
' end;'#010+
#010+
'const'#010+
' QuotStr = '#039'&quot;'#039';'#010+
' AmpStr = '#039'&amp;'#039';'#010+
' ltStr = '#039'&lt;'#039';'#010+
' gtStr = '#039'&gt;'#039';'#010+
'Var'#010+
' I,J : Integer;'#010+
'begin'#010+
' SetLength(Result,Length(S));'#010+
' J:=0;'#010+
' For I:=','1 to Length(S) do'#010+
' begin'#010+
' Inc(J);'#010+
' case S[i] of'#010+
' '#039'"'#039': W(j,Result,QuotStr);'#010+
' '#039'&'#039': W(J,Result,AmpStr);'#010+
' '#039'<'#039': W(J,Result,ltStr);'#010+
' '#039'>'#039': W(J,Result,gtStr);'#010+
' // Escape whitespace using CharRefs to be consistent w','ith W3 s'+
'pec X 3.3.3'#010+
' #9: w(J,Result,'#039'&#x9;'#039');'#010+
'{ #10: wrtStr('#039'&#xA;'#039');'#010+
' #13: wrtStr('#039'&#xD;'#039');}'#010+
' else'#010+
' Result[J]:=S[i];'#010+
' end;'#010+
' If (J=Length(Result)) and (I<Length(S)) then'#010+
' SetLength(Result,J+Length(S)-I);'#010,
' end;'#010+
' If J<>Length(Result) then'#010+
' SetLength(Result,J);'#010+
'end;'#010+
#010+
#010+
'function maybequoted(const s:string):string;'#010+
'const'#010+
' {$IFDEF MSWINDOWS}'#010+
' FORBIDDEN_CHARS = ['#039'!'#039', '#039'@'#039', '#039'#'#039', '#039'$'#039+
', '#039'%'#039', '#039'^'#039', '#039'&'#039', '#039'*'#039', '#039'('#039', '#039+
')'#039','#010+
' '#039'{'#039,', '#039'}'#039', '#039#039#039#039', '#039+
'`'#039', '#039'~'#039'];'#010+
' {$ELSE}'#010+
' FORBIDDEN_CHARS = ['#039'!'#039', '#039'@'#039', '#039'#'#039', '#039'$'#039+
', '#039'%'#039', '#039'^'#039', '#039'&'#039', '#039'*'#039', '#039'('#039', '#039+
')'#039','#010+
' '#039'{'#039', '#039'}'#039', '#039#039#039#039', '#039':'+
#039', '#039'\'#039', '#039'`'#039', '#039'~'#039'];'#010+
' {$ENDIF}'#010+
'var'#010+
' s1 : string;'#010+
' i : integer;'#010+
' quoted : boolean;'#010+
'begin'#010+
' ',' quoted:=false;'#010+
' s1:='#039'"'#039';'#010+
' for i:=1 to length(s) do'#010+
' begin'#010+
' case s[i] of'#010+
' '#039'"'#039' :'#010+
' begin'#010+
' quoted:=true;'#010+
' s1:=s1+'#039'\"'#039';'#010+
' end;'#010+
' '#039' '#039','#010+
' #128..#255 :'#010+
' begin'#010+
' quoted:=tr','ue;'#010+
' s1:=s1+s[i];'#010+
' end;'#010+
' else begin'#010+
' if s[i] in FORBIDDEN_CHARS then'#010+
' quoted:=True;'#010+
' s1:=s1+s[i];'#010+
' end;'#010+
' end;'#010+
' end;'#010+
' if quoted then'#010+
' maybequoted:=s1+'#039'"'#039#010+
' else'#010+
' maybequote','d:=s;'#010+
'end;'#010+
#010+
#010+
'procedure ReadIniFile(Const AFileName: String;L:TStrings);'#010+
'Var'#010+
' F : TFileStream;'#010+
' Line : String;'#010+
' I,P,PC : Integer;'#010+
'begin'#010+
' F:=TFileStream.Create(AFileName,fmOpenRead);'#010+
' Try'#010+
' L.LoadFromStream(F);'#010+
' // Fix lines.'#010+
' Fo','r I:=L.Count-1 downto 0 do'#010+
' begin'#010+
' Line:=L[I];'#010+
' P:=Pos('#039'='#039',Line);'#010+
' PC:=Pos('#039';'#039',Line); // Comment line.'#010+
' If (P=0) or ((PC<>0) and (PC<P)) then'#010+
' L.Delete(I)'#010+
' else'#010+
' L[i]:=Trim(System.C','opy(Line,1,P-1)+'#039'='#039'+Trim(System'+
'.Copy(Line,P+1,Length(Line)-P)));'#010+
' end;'#010+
' Finally'#010+
' F.Free;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'// Callback for Sysutils getapplicationname.'#010+
'Function GetFPMakeName : String;'#010+
#010+
'begin'#010+
' Result:='#039'fpmake'#039';'#010+
'end;'#010+
#010+
#010+
'Function Current','OS : String;'#010+
#010+
'begin'#010+
' Result:=OSToString(Defaults.OS);'#010+
'end;'#010+
#010+
'Function CurrentCPU : String;'#010+
#010+
'begin'#010+
' Result:=CPUToString(Defaults.CPU);'#010+
'end;'#010+
#010+
'Function OSToString(OS: TOS) : String;'#010+
#010+
'begin'#010+
' Result:=LowerCase(GetenumName(TypeInfo(TOS),Ord(OS)','));'#010+
'end;'#010+
#010+
'Function OSesToString(OSes: TOSes) : String;'#010+
#010+
'begin'#010+
' Result:=LowerCase(SetToString(PtypeInfo(TypeInfo(TOSes)),Integer(OSe'+
's),False));'#010+
'end;'#010+
#010+
'Function CPUToString(CPU: TCPU) : String;'#010+
#010+
'begin'#010+
' Result:=LowerCase(GetenumName(TypeInfo(','TCPU),Ord(CPU)));'#010+
'end;'#010+
#010+
'Function CPUSToString(CPUS: TCPUS) : String;'#010+
#010+
'begin'#010+
' Result:=LowerCase(SetToString(PTypeInfo(TypeInfo(TCPUS)),Integer(CPU'+
'S),False));'#010+
'end;'#010+
#010+
'Function StringToOS(const S : String) : TOS;'#010+
#010+
'Var'#010+
' I : Integer;'#010+
#010+
'begin'#010+
' I:','=GetEnumValue(TypeInfo(TOS),S);'#010+
' if (I=-1) then'#010+
' Raise EInstallerError.CreateFmt(SErrInvalidOS,[S]);'#010+
' Result:=TOS(I);'#010+
'end;'#010+
#010+
#010+
'Function OSesToString(const S : String) : TOSes;'#010+
#010+
'begin'#010+
' Result:=TOSes(StringToSet(PTypeInfo(TypeInfo(TOSes))',',S));'#010+
'end;'#010+
#010+
'Function StringToCPU(const S : String) : TCPU;'#010+
#010+
'Var'#010+
' I : Integer;'#010+
#010+
'begin'#010+
' I:=GetEnumValue(TypeInfo(TCPU),S);'#010+
' if (I=-1) then'#010+
' Raise EInstallerError.CreateFmt(SErrInvalidCPU,[S]);'#010+
' Result:=TCPU(I);'#010+
'end;'#010+
#010+
'Function StringToC','PUS(const S : String) : TCPUS;'#010+
#010+
'begin'#010+
' Result:=TCPUS(StringToSet(PTypeInfo(TypeInfo(TCPUS)),S));'#010+
'end;'#010+
#010+
'Function ModeToString(Mode: TCompilerMode) : String;'#010+
#010+
'begin'#010+
' Result:=LowerCase(GetenumName(TypeInfo(TCompilerMode),Ord(Mode)));'#010+
' Delet','e(Result,1,2);'#010+
'end;'#010+
#010+
'Function StringToMode(const S : String) : TCompilerMode;'#010+
#010+
'Var'#010+
' I : Integer;'#010+
#010+
'begin'#010+
' I:=GetEnumValue(TypeInfo(TCompilerMode),S);'#010+
' if (I=-1) then'#010+
' Raise EInstallerError.CreateFmt(SErrInvalidMode,[S]);'#010+
' Result:=TCom','pilerMode(I);'#010+
'end;'#010+
#010+
#010+
'Function MakeTargetString(CPU : TCPU;OS: TOS) : String;'#010+
#010+
'begin'#010+
' Result:=CPUToString(CPU)+'#039'-'#039'+OSToString(OS);'#010+
'end;'#010+
#010+
'Procedure StringToCPUOS(const S : String; Var CPU : TCPU; Var OS: TOS)'+
';'#010+
#010+
'Var'#010+
' P : integer;'#010+
#010+
'begin'#010+
' P:','=Pos('#039'-'#039',S);'#010+
' If (P=0) then'#010+
' Raise EInstallerError.CreateFmt(SErrInvalidTarget,[S]);'#010+
' CPU:=StringToCPU(Copy(S,1,P-1));'#010+
' OS:=StringToOs(Copy(S,P+1,Length(S)-P));'#010+
'end;'#010+
#010+
#010+
'Procedure ResolveDependencies(L : TDependencies; P : TNamedCollect','io'+
'n);'#010+
'Var'#010+
' I,J : Integer;'#010+
' C : TDependency;'#010+
'begin'#010+
' If Assigned(L) then'#010+
' For I:=0 to L.Count-1 do'#010+
' begin'#010+
' C:=L[i];'#010+
' if C.DependencyType in [depPackage,depUnit] then'#010+
' begin'#010+
' J:=P.IndexOfName(C.Valu','e);'#010+
' If J<>-1 then'#010+
' C.Target:=P.Items[J];'#010+
' end;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'function AddConditionalStrings(Dest : TStrings; Src : TConditionalStri'+
'ngs;ACPU:TCPU;AOS:TOS; Const APrefix : String='#039#039') : Integer ;'#010+
'Var'#010+
' I :',' Integer;'#010+
' C : TConditionalString;'#010+
' S : String;'#010+
'begin'#010+
' Result:=0;'#010+
' Dictionary.AddVariable('#039'CPU'#039',CPUToString(ACPU));'#010+
' Dictionary.AddVariable('#039'OS'#039',OSToString(AOS));'#010+
' For I:=0 to Src.Count-1 do'#010+
' begin'#010+
' C:=Src[I];'#010+
' if (ACPU i','n C.CPUs) and (AOS in C.OSes) then'#010+
' begin'#010+
' If (APrefix<>'#039#039') then'#010+
' S:=APrefix+C.Value'#010+
' else'#010+
' S:=C.Value;'#010+
' Dest.Add(Dictionary.ReplaceStrings(S));'#010+
' Inc(Result);'#010+
' end;'#010+
' ',' end;'#010+
'end;'#010+
#010+
#010+
'function FileListToString(List : TStrings; const APrefix : String) : S'+
'tring;'#010+
'Var'#010+
' I : integer;'#010+
' S : String;'#010+
'begin'#010+
' Result:='#039#039';'#010+
' For I:=0 to List.Count-1 do'#010+
' begin'#010+
' If (I>0) then'#010+
' Result:=Result+'#039' '#039';'#010+
' S:=','APrefix+List[i];'#010+
' If (Pos('#039' '#039',S)<>0) then'#010+
' S:='#039'"'#039'+S+'#039'"'#039';'#010+
' Result:=Result+S;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'function FixPath (const APath : String) : String;'#010+
'Var'#010+
' P : PChar;'#010+
'begin'#010+
' Result:=APath;'#010+
' If (result<>'#039#039') then'#010+
' begin'#010+
' P:','=PChar(Result);'#010+
' While (P^<>#0) do'#010+
' begin'#010+
' If P^ in ['#039'/'#039','#039'\'#039'] then'#010+
' P^:=PathDelim;'#010+
' Inc(P);'#010+
' end;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure ChangeDir(const APath : String);'#010+
'begin'#010+
' if Not SetCurrentDir(APath)',' then'#010+
' Raise EInstallerError.CreateFmt(SErrChangeDirFailed,[APath]);'#010+
'end;'#010+
#010+
#010+
'procedure SearchFiles(const AFileName: string; Recursive: boolean; var'+
' List: TStrings);'#010+
#010+
' procedure AddRecursiveFiles(const SearchDir, FileMask: string; Recur'+
'si','ve: boolean);'#010+
' const'#010+
' IgnoreCase = {$ifdef UNIX}False{$else}True{$endif};'#010+
' var'#010+
' Info : TSearchRec;'#010+
' begin'#010+
' if FindFirst(SearchDir+'#039'*'#039',faAnyFile and faDirectory,Info)'+
'=0 then'#010+
' begin'#010+
' repeat'#010+
' if ((Info.Attr and faD','irectory) = faDirectory) and (Info.N'+
'ame <> '#039'.'#039') and (Info.Name <> '#039'..'#039') and (Recursive) th'+
'en'#010+
' AddRecursiveFiles(SearchDir + Info.Name + PathDelim, FileM'+
'ask, Recursive);'#010+
' if ((Info.Attr and faDirectory) <> faDirectory) an','d IsWild'+
'(Info.Name, FileMask, IgnoreCase) then'#010+
' List.Add(SearchDir + Info.Name);'#010+
' until FindNext(Info)<>0;'#010+
' end;'#010+
' FindClose(Info);'#010+
' end;'#010+
#010+
'var'#010+
' CurrDir,'#010+
' BasePath: string;'#010+
' i: integer;'#010+
'begin'#010+
' BasePath := ExtractFil','ePath(ExpandFileName(AFileName));'#010+
' AddRecursiveFiles(BasePath, ExtractFileName(AFileName), Recursive);'#010+
#010+
' CurrDir:=GetCurrentDir;'#010+
' for i := 0 to Pred(List.Count) do'#010+
' List[i] := ExtractRelativepath(IncludeTrailingPathDelimiter(CurrDi'+
'r),',' List[i]);'#010+
'end;'#010+
#010+
#010+
'procedure SplitCommand(const Cmd : String; var Exe, Options : String);'+
#010+
#010+
'Const'#010+
' WhiteSpace = [#9,#10,#13,'#039' '#039'];'#010+
' QuoteChars = ['#039#039#039#039','#039'"'#039'];'#010+
#010+
'Var'#010+
' I : Integer;'#010+
' InQuote : Boolean;'#010+
' LastQuote : Char;'#010+
' S : String;'#010+
#010+
'begin'#010+
' ','S:=Trim(Cmd);'#010+
' InQuote:=False;'#010+
' LastQuote:=#0;'#010+
' I:=1;'#010+
' While (I<=Length(S)) and (Inquote or not (S[I] in whiteSpace)) do'#010+
' begin'#010+
' If S[i] in QuoteChars then'#010+
' begin'#010+
' InQuote:=Not (S[i]=LastQuote);'#010+
' If InQuote then'#010+
' ',' LastQuote:=S[i]'#010+
' else'#010+
' LastQuote:=#0;'#010+
' end;'#010+
' Inc(I);'#010+
' end;'#010+
' Exe:=Copy(S,1,I-1);'#010+
' Delete(S,1,I);'#010+
' Options:=Trim(S);'#010+
'end;'#010+
#010+
#010+
'{$ifdef HAS_UNIT_PROCESS}'#010+
'function GetCompilerInfo(const ACompiler,AOptions:string):','string;'#010+
'const'#010+
' BufSize = 1024;'#010+
'var'#010+
' S: TProcess;'#010+
' Buf: array [0..BufSize - 1] of char;'#010+
' Count: longint;'#010+
'begin'#010+
' S:=TProcess.Create(Nil);'#010+
' S.Commandline:=ACompiler+'#039' '#039'+AOptions;'#010+
' S.Options:=[poUsePipes];'#010+
' S.execute;'#010+
' Count:=s.output.','read(buf,BufSize);'#010+
' S.Free;'#010+
' SetLength(Result,Count);'#010+
' Move(Buf,Result[1],Count);'#010+
'end;'#010+
'{$endif HAS_UNIT_PROCESS}'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' TNamedItem'#010+
'*','*******************************************************************'+
'********}'#010+
#010+
'procedure TNamedItem.SetName(const AValue: String);'#010+
#010+
'begin'#010+
' if FName=AValue then exit;'#010+
' With TNamedCollection(Collection) do'#010+
' If UniqueNames then'#010+
' If (I','ndexOfName(AVAlue)<>-1) then'#010+
' Raise ECollectionError.CreateFmt(SErrNameExists,[AValue]);'#010+
' FName:=AValue;'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' TNamedColl','ection'#010+
'**********************************************************************'+
'******}'#010+
#010+
'function TNamedCollection.IndexOfName(const AName: String): Integer;'#010+
#010+
'begin'#010+
' Result:=Count-1;'#010+
' While (Result>=0) and (CompareText(TNamedItem(Items[Resul','t]).FName'+
',AName)<>0) do'#010+
' Dec(Result);'#010+
'end;'#010+
#010+
'function TNamedCollection.ItemByName(const AName: String): TNamedItem;'+
#010+
#010+
'Var'#010+
' I : Integer;'#010+
#010+
'begin'#010+
' I:=IndexOfName(AName);'#010+
' If (I=-1) Then'#010+
' Raise ECollectionError.CreateFmt(SErrNoSuchName,[','AName]);'#010+
' Result:=TNamedItem(Items[i]);'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' TNamedItemList'#010+
'**********************************************************************',
'******}'#010+
#010+
'function TNamedItemList.GetNamedItem(Index : Integer): TNamedItem;'#010+
'begin'#010+
' Result:=TNamedItem(Items[Index]);'#010+
'end;'#010+
#010+
#010+
'procedure TNamedItemList.SetNamedItem(Index : Integer; const AValue: T'+
'NamedItem);'#010+
'begin'#010+
' Items[Index]:=AValue;'#010+
'end',';'#010+
#010+
#010+
'function TNamedItemList.IndexOfName(const AName: String): Integer;'#010+
'begin'#010+
' Result:=Count-1;'#010+
' While (Result>=0) and (CompareText(GetNamedItem(Result).Name,AName)<'+
'>0) do'#010+
' Dec(Result);'#010+
'end;'#010+
#010+
#010+
'function TNamedItemList.ItemByName(const AN','Ame: String): TNamedItem;'+
#010+
'Var'#010+
' I : Integer;'#010+
'begin'#010+
' I:=IndexOfName(AName);'#010+
' If (I=-1) Then'#010+
' Raise ECollectionError.CreateFmt(SErrNoSuchName,[AName]);'#010+
' Result:=TNamedItem(Items[i]);'#010+
'end;'#010+
#010+
#010+
'{*********************************************','**********************'+
'*********'#010+
' TTargets'#010+
'**********************************************************************'+
'******}'#010+
#010+
'function TTargets.GetTargetItem(Index : Integer): TTarget;'#010+
'begin'#010+
' Result:=TTarget(Items','[Index]);'#010+
'end;'#010+
#010+
#010+
'function TTargets.GetTarget(const AName : String): TTarget;'#010+
'begin'#010+
' Result:=TTarget(ItemByName(AName));'#010+
'end;'#010+
#010+
#010+
'procedure TTargets.SetTargetItem(Index : Integer; const AValue: TTarge'+
't);'#010+
'begin'#010+
' Items[Index]:=AValue;'#010+
'end;'#010+
#010+
#010+
'F','unction TTargets.AddUnit(Const AUnitName : String) : TTarget;'#010+
'begin'#010+
' Result:=AddUnit(AUnitName,AllCPUs,AllOSes);'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddUnit(Const AUnitName : String;const OSes:TOSes) :'+
' TTarget;'#010+
'begin'#010+
' Result:=AddUnit(AUnitName,AllCP','Us,OSes);'#010+
'end;'#010+
#010+
#010+
'{$ifdef cpu_only_overloads}'#010+
'Function TTargets.AddUnit(Const AUnitName : String;const CPUs:TCPUs) :'+
' TTarget;'#010+
'begin'#010+
' Result:=AddUnit(AUnitName,CPUs,AllOSes);'#010+
'end;'#010+
'{$endif cpu_only_overloads}'#010+
#010+
#010+
'Function TTargets.AddUnit(Const',' AUnitName : String;const CPUs:TCPUs;'+
'const OSes:TOSes) : TTarget;'#010+
'begin'#010+
' Result:=Add as TTarget;'#010+
' Result.Name:=AUnitName;'#010+
' Result.TargetType:=TTUnit;'#010+
' Result.CPUs:=CPUs;'#010+
' Result.OSes:=OSes;'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddImplicitUnit(Cons','t AUnitName : String;InstallUn'+
'it:boolean=true) : TTarget;'#010+
'begin'#010+
' Result:=AddImplicitUnit(AUnitName,AllCPUs,AllOSes,InstallUnit);'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddImplicitUnit(Const AUnitName : String;const OSes:'+
'TOSes;InstallUnit:boolean=true) :',' TTarget;'#010+
'begin'#010+
' Result:=AddImplicitUnit(AUnitName,AllCPUs,OSes,InstallUnit);'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddImplicitUnit(Const AUnitName : String;const CPUs:'+
'TCPUs;InstallUnit:boolean=true) : TTarget;'#010+
'begin'#010+
' Result:=AddImplicitUnit(AUnitName',',CPUs,AllOSes,InstallUnit);'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddImplicitUnit(Const AUnitName : String;const CPUs:'+
'TCPUs;const OSes:TOSes;InstallUnit:boolean=true) : TTarget;'#010+
'begin'#010+
' Result:=Add as TTarget;'#010+
' Result.Name:=AUnitName;'#010+
' Result.CPUs:=CP','Us;'#010+
' Result.OSes:=OSes;'#010+
' if InstallUnit then'#010+
' Result.TargetType:=TTImplicitUnit'#010+
' else'#010+
' Result.TargetType:=TTCleanOnlyUnit;'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddProgram(Const AProgramName : String) : TTarget;'#010+
'begin'#010+
' Result:=AddProgram(AProg','ramName,AllCPUs,AllOSes);'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddProgram(Const AProgramName : String;const OSes:TO'+
'Ses) : TTarget;'#010+
'begin'#010+
' Result:=AddProgram(AProgramName,AllCPUs,OSes);'#010+
'end;'#010+
#010+
#010+
'{$ifdef cpu_only_overloads}'#010+
'Function TTargets.AddProgram(Co','nst AProgramName : String;const CPUs:'+
'TCPUs) : TTarget;'#010+
'begin'#010+
' Result:=AddProgram(AProgramName,CPUs,AllOSes);'#010+
'end;'#010+
'{$endif cpu_only_overloads}'#010+
#010+
#010+
'Function TTargets.AddProgram(Const AProgramName : String;const CPUs:TC'+
'PUs;const OSes:TOSes) : T','Target;'#010+
'begin'#010+
' Result:=Add as TTarget;'#010+
' Result.Name:=AProgramName;'#010+
' Result.CPUs:=CPUs;'#010+
' Result.OSes:=OSes;'#010+
' Result.TargetType:=ttProgram;'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddExampleUnit(Const AUnitName : String) : TTarget;'#010+
'begin'#010+
' Result:=AddE','xampleUnit(AUnitName,AllCPUs,AllOSes);'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddExampleUnit(Const AUnitName : String;const OSes:T'+
'OSes) : TTarget;'#010+
'begin'#010+
' Result:=AddExampleUnit(AUnitName,AllCPUs,OSes);'#010+
'end;'#010+
#010+
#010+
'{$ifdef cpu_only_overloads}'#010+
'Function TTarget','s.AddExampleUnit(Const AUnitName : String;const CPUs'+
':TCPUs) : TTarget;'#010+
'begin'#010+
' Result:=AddExampleUnit(AUnitName,CPUs,AllOSes);'#010+
'end;'#010+
'{$endif cpu_only_overloads}'#010+
#010+
#010+
'Function TTargets.AddExampleUnit(Const AUnitName : String;const CPUs:T'+
'CPUs;con','st OSes:TOSes) : TTarget;'#010+
'begin'#010+
' Result:=Add as TTarget;'#010+
' Result.Name:=AUnitName;'#010+
' Result.CPUs:=CPUs;'#010+
' Result.OSes:=OSes;'#010+
' Result.TargetType:=ttExampleUnit;'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddExampleProgram(Const AProgramName : String) : TTa'+
'r','get;'#010+
'begin'#010+
' Result:=AddExampleProgram(AProgramName,AllCPUs,AllOSes);'#010+
'end;'#010+
#010+
#010+
'Function TTargets.AddExampleProgram(Const AProgramName : String;const '+
'OSes:TOSes) : TTarget;'#010+
'begin'#010+
' Result:=AddExampleProgram(AProgramName,AllCPUs,OSes);'#010+
'end;'#010+
#010+
#010+
'{','$ifdef cpu_only_overloads}'#010+
'Function TTargets.AddExampleProgram(Const AProgramName : String;const '+
'CPUs:TCPUs) : TTarget;'#010+
'begin'#010+
' Result:=AddExampleProgram(AProgramName,CPUs,AllOSes);'#010+
'end;'#010+
'{$endif cpu_only_overloads}'#010+
#010+
#010+
'Function TTargets.AddEx','ampleProgram(Const AProgramName : String;cons'+
't CPUs:TCPUs;const OSes:TOSes) : TTarget;'#010+
'begin'#010+
' Result:=Add as TTarget;'#010+
' Result.Name:=AProgramName;'#010+
' Result.CPUs:=CPUs;'#010+
' Result.OSes:=OSes;'#010+
' Result.TargetType:=ttExampleProgram;'#010+
'end;'#010+
#010+
#010+
'{***','****************************************************************'+
'*********'#010+
' TSources'#010+
'**********************************************************************'+
'******}'#010+
#010+
'function TSources.GetSourceItem(Index : Intege','r): TSource;'#010+
'begin'#010+
' Result:=TSource(Items[Index]);'#010+
'end;'#010+
#010+
#010+
'procedure TSources.SetSourceItem(Index : Integer; const AValue: TSourc'+
'e);'#010+
'begin'#010+
' Items[Index]:=AValue;'#010+
'end;'#010+
#010+
#010+
'function TSources.AddDoc (const AFiles : String) : TSource;'#010+
'begin'#010+
' Re','sult:=Add as TSource;'#010+
' Result.Name:=AFiles;'#010+
' Result.FSourceType:=stDoc;'#010+
'end;'#010+
#010+
#010+
'function TSources.AddSrc(const AFiles : String) : TSource;'#010+
'begin'#010+
' Result:=Add as TSource;'#010+
' Result.Name:=AFiles;'#010+
' Result.FSourceType:=stSrc;'#010+
'end;'#010+
#010+
#010+
'function ','TSources.AddExample(const AFiles : String) : TSource;'#010+
'begin'#010+
' Result:=Add as TSource;'#010+
' Result.Name:=AFiles;'#010+
' Result.FSourceType:=stExample;'#010+
'end;'#010+
#010+
#010+
'function TSources.AddTest(const AFiles : String) : TSource;'#010+
'begin'#010+
' Result:=Add as TSource;',#010+
' Result.Name:=AFiles;'#010+
' Result.FSourceType:=stTest;'#010+
'end;'#010+
#010+
#010+
'procedure TSources.AddDocFiles(const AFileMask: string; Recursive: boo'+
'lean);'#010+
'var'#010+
' List : TStrings;'#010+
' i: integer;'#010+
'begin'#010+
' List := TStringList.Create;'#010+
' SearchFiles(AFileMask, Recu','rsive, List);'#010+
' for i:= 0 to Pred(List.Count) do'#010+
' AddDoc(List[i]);'#010+
' List.Free;'#010+
'end;'#010+
#010+
#010+
'procedure TSources.AddSrcFiles(const AFileMask: string; Recursive: boo'+
'lean);'#010+
'var'#010+
' List : TStrings;'#010+
' i: integer;'#010+
'begin'#010+
' List := TStringList.Create;'#010,
' SearchFiles(AFileMask, Recursive, List);'#010+
' for i:= 0 to Pred(List.Count) do'#010+
' AddSrc(List[i]);'#010+
' List.Free;'#010+
'end;'#010+
#010+
#010+
'procedure TSources.AddExampleFiles(const AFileMask: string; Recursive:'+
' boolean);'#010+
'var'#010+
' List : TStrings;'#010+
' i: integer;'#010+
'beg','in'#010+
' List := TStringList.Create;'#010+
' SearchFiles(AFileMask, Recursive, List);'#010+
' for i:= 0 to Pred(List.Count) do'#010+
' AddExample(List[i]);'#010+
' List.Free;'#010+
'end;'#010+
#010+
#010+
'procedure TSources.AddTestFiles(const AFileMask: string; Recursive: bo'+
'olean);'#010+
'var'#010+
' ','List : TStrings;'#010+
' i: integer;'#010+
'begin'#010+
' List := TStringList.Create;'#010+
' SearchFiles(AFileMask, Recursive, List);'#010+
' for i:= 0 to Pred(List.Count) do'#010+
' AddTest(List[i]);'#010+
' List.Free;'#010+
'end;'#010+
#010+
#010+
'{****************************************************','***************'+
'*********'#010+
' TPackage'#010+
'**********************************************************************'+
'******}'#010+
#010+
'constructor TPackage.Create(ACollection: TCollection);'#010+
'begin'#010+
' inherited Create(ACollection);'#010+
' FV','ersion:=TFPVersion.Create;'#010+
' FTargets:=TTargets.Create(TTarget);'#010+
' FSources:=TSources.Create(TSource);'#010+
' FDependencies:=TDependencies.Create(TDependency);'#010+
' FInstallFiles:=TConditionalStrings.Create(TConditionalString);'#010+
' FCleanFiles:=TCond','itionalStrings.Create(TConditionalString);'#010+
' FUnitPath:=TConditionalStrings.Create(TConditionalString);'#010+
' FObjectPath:=TConditionalStrings.Create(TConditionalString);'#010+
' FIncludePath:=TConditionalStrings.Create(TConditionalString);'#010+
' FSource','Path:=TConditionalStrings.Create(TConditionalString);'#010+
' FExamplePath:=TConditionalStrings.Create(TConditionalString);'#010+
' FTestPath:=TConditionalStrings.Create(TConditionalString);'#010+
' FCommands:=TCommands.Create(TCommand);'#010+
' FCPUs:=AllCPUs;'#010+
' ','FOSes:=AllOSes;'#010+
' FInstalledChecksum:=$ffffffff;'#010+
' // Implicit dependency on RTL'#010+
' FDependencies.Add('#039'rtl'#039');'#010+
'end;'#010+
#010+
#010+
'destructor TPackage.destroy;'#010+
'begin'#010+
' FreeAndNil(FDependencies);'#010+
' FreeAndNil(FInstallFiles);'#010+
' FreeAndNil(FCleanFiles);'#010+
' Fr','eeAndNil(FIncludePath);'#010+
' FreeAndNil(FSourcePath);'#010+
' FreeAndNil(FExamplePath);'#010+
' FreeAndNil(FTestPath);'#010+
' FreeAndNil(FObjectPath);'#010+
' FreeAndNil(FUnitPath);'#010+
' FreeAndNil(FSources);'#010+
' FreeAndNil(FTargets);'#010+
' FreeAndNil(FVersion);'#010+
' inherited ','destroy;'#010+
'end;'#010+
#010+
#010+
'procedure TPackage.SetName(const AValue: String);'#010+
'begin'#010+
' inherited SetName(AValue);'#010+
' // RTL should not have any dependencies'#010+
' if AValue='#039'rtl'#039' then'#010+
' FDependencies.Clear;'#010+
'end;'#010+
#010+
#010+
'Function TPackage.GetUnitsOutputDir(ACPU:T','CPU; AOS : TOS):String;'#010+
'begin'#010+
' Result:='#039'units'#039'+PathDelim+MakeTargetString(ACPU,AOS);'#010+
'end;'#010+
#010+
#010+
'Function TPackage.GetBinOutputDir(ACPU:TCPU; AOS : TOS) : String;'#010+
'begin'#010+
' Result:='#039'bin'#039'+PathDelim+MakeTargetString(ACPU,AOS);'#010+
'end;'#010+
#010+
#010+
'procedure TPac','kage.GetCleanFiles(List: TStrings; ACPU:TCPU; AOS : TO'+
'S);'#010+
'Var'#010+
' OB,OU : String;'#010+
' I : Integer;'#010+
'begin'#010+
' OB:=IncludeTrailingPathDelimiter(GetBinOutputDir(Defaults.CPU,Defaul'+
'ts.OS));'#010+
' OU:=IncludeTrailingPathDelimiter(GetUnitsOutputDir(Default','s.CPU,De'+
'faults.OS));'#010+
' AddConditionalStrings(List,CleanFiles,ACPU,AOS);'#010+
' For I:=0 to FTargets.Count-1 do'#010+
' FTargets.TargetItems[I].GetCleanFiles(List, OU, OB, ACPU, AOS);'#010+
'end;'#010+
#010+
#010+
'procedure TPackage.GetInstallFiles(List: TStrings;Types : T','TargetTyp'+
'es;ACPU:TCPU; AOS : TOS);'#010+
'Var'#010+
' OB,OU : String;'#010+
' I : Integer;'#010+
' T : TTarget;'#010+
'begin'#010+
' OB:=IncludeTrailingPathDelimiter(GetBinOutputDir(Defaults.CPU,Defaul'+
'ts.OS));'#010+
' OU:=IncludeTrailingPathDelimiter(GetUnitsOutputDir(Defaults.CPU,De','f'+
'aults.OS));'#010+
' AddConditionalStrings(List,InstallFiles,ACPU,AOS);'#010+
' For I:=0 to FTargets.Count-1 do'#010+
' begin'#010+
' T:=FTargets.TargetItems[I];'#010+
' if (T.TargetType in Types) and (T.Install) then'#010+
' T.GetInstallFiles(List, OU, OB, AC','PU, AOS);'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TPackage.GetArchiveFiles(List: TStrings; ACPU:TCPU; AOS : TO'+
'S);'#010+
'Var'#010+
' I : Integer;'#010+
'begin'#010+
' // Targets only'#010+
' For I:=0 to FTargets.Count-1 do'#010+
' FTargets.TargetItems[I].GetArchiveFiles(List,ACPU,AOS);'#010+
'end',';'#010+
#010+
#010+
'Function TPackage.GetDescription : string;'#010+
'Var'#010+
' FN : String;'#010+
' L : TStringList;'#010+
'begin'#010+
' If (FDescription<>'#039#039') then'#010+
' Result:=FDescription'#010+
' else'#010+
' If (FDescriptionFile<>'#039#039') then'#010+
' begin'#010+
' // Always relative to binary name','.'#010+
' FN:=ExtractFilePath(ParamStr(0));'#010+
' FN:=FN+FDescriptionFile;'#010+
' If FileExists(FN) then'#010+
' begin'#010+
' L:=TStringList.Create;'#010+
' Try'#010+
' L.LoadFromFile(FN);'#010+
' Result:=L.Text;'#010+
' ',' Finally'#010+
' L.Free;'#010+
' end;'#010+
' end;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'Function TPackage.GetVersion : string;'#010+
'begin'#010+
' result:=FVersion.AsString;'#010+
'end;'#010+
#010+
#010+
'Procedure TPackage.SetVersion(const V : string);'#010+
'begin'#010+
' FVersion.As','String:=V;'#010+
'end;'#010+
#010+
#010+
'Function TPackage.GetFileName : string;'#010+
'begin'#010+
' If (FFileName<>'#039#039') then'#010+
' Result:=FFileName'#010+
' else'#010+
' if not FVersion.Empty then'#010+
' Result := Name + '#039'-'#039' + FVersion.AsString'#010+
' else'#010+
' Result := Name;'#010+
'end;'#010+
#010+
#010+
'Proce','dure TPackage.GetManifest(Manifest : TStrings);'#010+
#010+
' procedure AddOSes(const AIndent:string;AOSes:TOSes);'#010+
' var'#010+
' IOS : TOS;'#010+
' begin'#010+
' if (AOSes=AllOSes) then'#010+
' exit;'#010+
' Manifest.Add(AIndent+'#039'<oses>'#039');'#010+
' for IOS:=low(TOSes) to high','(TOSes) do'#010+
' if IOS in AOSes then'#010+
' Manifest.Add(Format(AIndent+'#039' <os name="%s"/>'#039',[OSToSt'+
'ring(IOS)]));'#010+
' Manifest.Add(AIndent+'#039'</oses>'#039');'#010+
' end;'#010+
#010+
' procedure AddCPUs(const AIndent:string;ACPUs:TCPUs);'#010+
' var'#010+
' ICPU : TCPU;'#010+
' b','egin'#010+
' if (ACPUs=AllCPUs) then'#010+
' exit;'#010+
' Manifest.Add(AIndent+'#039'<cpus>'#039');'#010+
' for ICPU:=low(TCPUs) to high(TCPUs) do'#010+
' if ICPU in ACPUs then'#010+
' Manifest.Add(Format(AIndent+'#039' <cpu name="%s"/>'#039',[CPUTo'+
'String(ICPU)]));'#010+
' Manif','est.Add(AIndent+'#039'</cpus>'#039');'#010+
' end;'#010+
#010+
'Var'#010+
' S : String;'#010+
' i : Integer;'#010+
' D : TDependency;'#010+
'begin'#010+
' With Manifest do'#010+
' begin'#010+
' Add(Format('#039'<package name="%s">'#039',[QuoteXml(Name)]));'#010+
' Add(Format('#039' <version major="%d" minor="%d" micro="%d" b','uild'+
'="%d"/>'#039',[FVersion.Major,FVersion.Minor,FVersion.Micro,FVersion.Bu'+
'ild]));'#010+
' AddOSes('#039' '#039',OSes);'#010+
' AddCPUs('#039' '#039',CPUs);'#010+
' Add(Format('#039' <filename>%s</filename>'#039',[QuoteXml(FileName +'+
' ZipExt)]));'#010+
' Add(Format('#039' <author>%s</author>'#039',[Qu','oteXml(Author)]));'#010+
' Add(Format('#039' <license>%s</license>'#039',[QuoteXml(License)]));'+
#010+
' if ExternalURL<>'#039#039' then'#010+
' Add(Format('#039' <externalurl>%s</externalurl>'#039',[QuoteXml(Ex'+
'ternalURL)]));'#010+
' Add(Format('#039' <email>%s</email>'#039',[QuoteXMl(Email)]','));'#010+
' S:=Description;'#010+
' If (S<>'#039#039') then'#010+
' Add(Format('#039' <description>%s</description>'#039',[QuoteXML(S)'+
']));'#010+
' If (Dependencies.Count>0) then'#010+
' begin'#010+
' Add('#039' <dependencies>'#039');'#010+
' for I:=0 to Dependencies.Count-1 do'#010+
' ',' begin'#010+
' D:=Dependencies[i];'#010+
' Add('#039' <dependency>'#039');'#010+
' Add(Format('#039' <package packagename="%s"/>'#039',[Quote'+
'XML(D.Value)]));'#010+
' if not D.FVersion.Empty then'#010+
' Add(Format('#039' <version major','="%d" minor="%d" micr'+
'o="%d" build="%d"/>'#039',[D.FVersion.Major,D.FVersion.Minor,D.FVersion'+
'.Micro,D.FVersion.Build]));'#010+
' AddOSes('#039' '#039',D.OSes);'#010+
' AddCPUs('#039' '#039',D.CPUs);'#010+
' Add('#039' </dependency>'#039');'#010+
' end;'#010+
' ',' Add('#039' </dependencies>'#039');'#010+
' end;'#010+
' Add('#039'</package>'#039');'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TPackage.LoadUnitConfigFromFile(Const AFileName: String);'#010+
'var'#010+
' L,L2 : TStrings;'#010+
' VOS : TOS;'#010+
' VCPU : TCPU;'#010+
' i,k : Integer;'#010+
' DepChecksum : Cardinal;',#010+
' DepName : String;'#010+
' D : TDependency;'#010+
'begin'#010+
' L:=TStringList.Create;'#010+
' Try'#010+
' ReadIniFile(AFileName,L);'#010+
' With L do'#010+
' begin'#010+
' Version:=Values[KeyVersion];'#010+
' InstalledChecksum:=Cardinal(StrToInt64Def(Values[KeyChecksum],',
'$ffffffff));'#010+
' VCPU:=StringToCPU(Values[KeyCPU]);'#010+
' VOS:=StringToOS(Values[KeyOS]);'#010+
' OSes:=[VOS];'#010+
' CPUs:=[VCPU];'#010+
' L2:=TStringList.Create;'#010+
' L2.CommaText:=Values[KeyDepends];'#010+
' for i:=0 to L2.Coun','t-1 do'#010+
' begin'#010+
' DepName:=L2[i];'#010+
' k:=Pos('#039'|'#039',DepName);'#010+
' if k>0 then'#010+
' begin'#010+
' DepChecksum:=StrToInt(Copy(DepName,k+1,Length(DepName)'+
'-k));'#010+
' DepName:=Copy(DepNam','e,1,k-1);'#010+
' end'#010+
' else'#010+
' DepChecksum:=$ffffffff;'#010+
' D:=Dependencies.Add(DepName,CPUs,OSes);'#010+
' D.RequireChecksum:=DepChecksum;'#010+
' end;'#010+
' FreeAndNil(L2);'#010+
' NeedLibC:=Upca','se(Values[KeyNeedLibC])='#039'Y'#039';'#010+
' end;'#010+
' Finally'#010+
' L.Free;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TPackage.SaveUnitConfigToFile(Const AFileName: String;ACPU:T'+
'CPU;AOS:TOS);'#010+
'Var'#010+
' F : TFileStream;'#010+
' L : TStringList;'#010+
' Deps : String;'#010+
' i : integer;'#010+
' D : ','TDependency;'#010+
' p : TPackage;'#010+
'begin'#010+
' F:=TFileStream.Create(AFileName,fmCreate);'#010+
' L:=TStringList.Create;'#010+
' try'#010+
' With L do'#010+
' begin'#010+
' Values[KeyName]:=Name;'#010+
' Values[KeyVersion]:=Version;'#010+
' // TODO Generate checksum b','ased on PPUs'#010+
' Values[KeyChecksum]:=IntToStr(DateTimeToFileDate(Now));'#010+
' Values[KeyCPU]:=CPUToString(ACPU);'#010+
' Values[KeyOS]:=OSToString(AOS);'#010+
' Deps:='#039#039';'#010+
' for i:=0 to Dependencies.Count-1 do'#010+
' begin'#010+
' ',' D:=Dependencies[i];'#010+
' if (ACPU in D.CPUs) and (AOS in D.OSes) then'#010+
' begin'#010+
' if Deps<>'#039#039' then'#010+
' Deps:=Deps+'#039','#039';'#010+
' Deps:=Deps+D.Value;'#010+
' P:=TPackage(D.','Target);'#010+
' if assigned(P) and (P.InstalledChecksum<>$ffffffff) th'+
'en'#010+
' Deps:=Deps+'#039'|'#039'+IntToStr(P.InstalledChecksum)'+
';'#010+
' end;'#010+
' end;'#010+
' Values[KeyDepends]:=Deps;'#010+
' if NeedLibC then'#010+
' ',' Values[KeyNeedLibC]:='#039'Y'#039#010+
' else'#010+
' Values[KeyNeedLibC]:='#039'N'#039';'#010+
' end;'#010+
' L.SaveToStream(F);'#010+
' Finally'#010+
' L.Free;'#010+
' F.Free;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
#010+
'{*********************************************************************'+
'****','***'#010+
' TPackages'#010+
'**********************************************************************'+
'******}'#010+
#010+
'function TPackages.GetPackage(const AName : String): TPackage;'#010+
'begin'#010+
' Result:=TPackage(ItemByName(AName))'#010+
'end;'#010+
#010+
'func','tion TPackages.GetPackageItem(AIndex : Integer): TPackage;'#010+
'begin'#010+
' Result:=TPackage(Items[AIndex]);'#010+
'end;'#010+
#010+
#010+
'procedure TPackages.SetPackageItem(AIndex : Integer; const AValue: TPa'+
'ckage);'#010+
'begin'#010+
' Items[AIndex]:=AValue;'#010+
'end;'#010+
#010+
#010+
'function TPackage','s.AddPackage(const AName: String): TPackage;'#010+
'begin'#010+
' Result:=Add as TPackage;'#010+
' Result.Name:=AName;'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' TCustomDefaults'#010+
'**********','**********************************************************'+
'********}'#010+
#010+
'procedure TCustomDefaults.SetCPU(const AValue: TCPU);'#010+
'begin'#010+
' FCPU:=AValue;'#010+
' RecalcTarget;'#010+
'end;'#010+
#010+
#010+
'function TCustomDefaults.GetBaseInstallDir: String;'#010+
'begin'#010+
' If (FBaseIns','tallDir<>'#039#039') then'#010+
' Result:=FBaseInstallDir'#010+
' else'#010+
' if UnixPaths then'#010+
' Result:=Prefix +'#039'lib'#039' + PathDelim + '#039'fpc'#039' + Path'+
'Delim'#010+
' else'#010+
' Result:=Prefix;'#010+
'end;'#010+
#010+
#010+
'function TCustomDefaults.GetBinInstallDir: String;'#010+
'begin'#010+
' If (FBin','InstallDir<>'#039#039') then'#010+
' Result:=FBinInstallDir'#010+
' else'#010+
' If UnixPaths then'#010+
' Result:=BaseInstallDir+'#039'bin'#039#010+
' else'#010+
' Result:=BaseInstallDir+'#039'bin'#039';'#010+
'end;'#010+
#010+
#010+
'function TCustomDefaults.GetCompiler: String;'#010+
'begin'#010+
' If (FCompiler<>'#039#039') the','n'#010+
' Result:=FCompiler'#010+
' else'#010+
' Result:='#039'fpc'#039';'#010+
'end;'#010+
#010+
#010+
'function TCustomDefaults.GetDocInstallDir: String;'#010+
'begin'#010+
' If (FBinInstallDir<>'#039#039') then'#010+
' Result:=FBinInstallDir'#010+
' else'#010+
' If UnixPaths then'#010+
' Result:=Prefix+'#039'share'#039'+PathDelim+',#039'doc'#039#010+
' else'#010+
' Result:=BaseInstallDir+'#039'docs'#039';'#010+
'end;'#010+
#010+
#010+
'function TCustomDefaults.GetExamplesInstallDir: String;'#010+
'begin'#010+
' If (FExamplesInstallDir<>'#039#039') then'#010+
' Result:=FExamplesInstallDir'#010+
' else'#010+
' If UnixPaths then'#010+
' Result:=Prefix+'#039,'share'#039'+PathDelim+'#039'docs'#039'+PathDel'+
'im+'#039'examples'#039#010+
' else'#010+
' Result:=BaseInstallDir+'#039'examples'#039';'#010+
'end;'#010+
#010+
#010+
'function TCustomDefaults.GetUnitInstallDir: String;'#010+
'begin'#010+
' If (FUnitInstallDir<>'#039#039') then'#010+
' Result:=FUnitInstallDir'#010+
' else'#010+
' If UnixPa','ths then'#010+
' Result:=BaseInstallDir+'#039'units'#039'+PathDelim+Target'#010+
' else'#010+
' Result:=BaseInstallDir+'#039'units'#039'+PathDelim+Target;'#010+
'end;'#010+
#010+
#010+
'function TCustomDefaults.GetLocalUnitDir: String;'#010+
'begin'#010+
' Result:=FLocalUnitDir;'#010+
'end;'#010+
#010+
#010+
'function TCustomDe','faults.GetGlobalUnitDir: String;'#010+
'begin'#010+
' If (FGlobalUnitDir<>'#039#039') then'#010+
' Result:=FGlobalUnitDir'#010+
' else'#010+
' Result:=UnitInstallDir;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.SetLocalUnitDir(const AValue: String);'#010+
'begin'#010+
' // Use ExpandFileName to sup','port ~/ expansion'#010+
' if AValue<>'#039#039' then'#010+
' FLocalUnitDir:=IncludeTrailingPathDelimiter(ExpandFileName(AValue)'+
')'#010+
' else'#010+
' FLocalUnitDir:='#039#039';'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.SetGlobalUnitDir(const AValue: String);'#010+
'begin'#010+
' // Use ExpandFileN','ame to support ~/ expansion'#010+
' if AValue<>'#039#039' then'#010+
' FGlobalUnitDir:=IncludeTrailingPathDelimiter(ExpandFileName(AValue'+
'))'#010+
' else'#010+
' FGlobalUnitDir:='#039#039';'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.SetBaseInstallDir(const AValue: String);'#010+
'begin'#010+
' // Us','e ExpandFileName to support ~/ expansion'#010+
' if AValue<>'#039#039' then'#010+
' FBaseInstallDir:=IncludeTrailingPathDelimiter(ExpandFileName(AValu'+
'e))'#010+
' else'#010+
' FBaseInstallDir:='#039#039';'#010+
' UnitInstallDir:='#039#039';'#010+
' BinInstallDir:='#039#039';'#010+
' ExamplesInstallDir:='#039#039';'#010+
'end',';'#010+
#010+
#010+
'procedure TCustomDefaults.SetOS(const AValue: TOS);'#010+
'begin'#010+
' FOS:=AValue;'#010+
' Recalctarget;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.SetPrefix(const AValue: String);'#010+
'begin'#010+
' if FPrefix=AValue then exit;'#010+
' FPrefix:=IncludeTrailingPathDelimiter(AVal','ue);'#010+
' BaseInstallDir:='#039#039';'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.SetTarget(const AValue: String);'#010+
'Var'#010+
' P : Integer;'#010+
'begin'#010+
' if FTarget<>AValue then'#010+
' begin'#010+
' P:=Pos('#039'-'#039',AValue);'#010+
' If (P<>0) then'#010+
' begin'#010+
' FOS:=StringToOS','(System.Copy(Avalue,P+1,Length(AValue)-P));'+
#010+
' FCPU:=StringToCPU(System.Copy(Avalue,1,P-1));'#010+
' end'#010+
' else'#010+
' FOS:=StringToOS(AValue);'#010+
' FTarget:=AValue;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.RecalcTarget;'#010+
'begin',#010+
' Ftarget:=CPUToString(FCPU)+'#039'-'#039'+OStoString(FOS);'#010+
'end;'#010+
#010+
#010+
'constructor TCustomDefaults.Create;'#010+
'begin'#010+
' InitDefaults;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.InitDefaults;'#010+
'begin'#010+
'{$ifdef unix}'#010+
' UnixPaths:=True;'#010+
'{$else}'#010+
' UnixPaths:=False;'#010+
'{$endif}'#010+
' ',' FNoFPCCfg:=False;'#010+
' FCPU:=cpuNone;'#010+
' FOS:=osNone;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.LocalInit(Const AFileName : String);'#010+
'Var'#010+
' FN : String;'#010+
'begin'#010+
' FN:=AFileName;'#010+
' If (FN='#039#039') then'#010+
' begin'#010+
' // Environment variable.'#010+
' FN:=GetEnvironme','ntVariable('#039'FPMAKECFG'#039');'#010+
' If (FN<>'#039#039') then'#010+
' If not FileExists(FN) then'#010+
' FN:='#039#039';'#010+
' // User config file fpmake.cfg'#010+
' If (FN='#039#039') then'#010+
' begin'#010+
' FN:=GetAppConfigFile(False);'#010+
' If Not FileExists(FN) then'#010+
' FN',':='#039#039';'#010+
' end;'#010+
' // Global config file fpmake.cfg'#010+
' If (FN='#039#039') then'#010+
' begin'#010+
' FN:=GetAppConfigFile(True);'#010+
' If Not FileExists(FN) then'#010+
' FN:='#039#039';'#010+
' end;'#010+
' end;'#010+
' If (FN<>'#039#039') and FileExists(FN) then'#010+
' LoadFromF','ile(FN);'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.CompilerDefaults;'#010+
'{$ifdef HAS_UNIT_PROCESS}'#010+
'var'#010+
' infoSL : TStringList;'#010+
'{$endif HAS_UNIT_PROCESS}'#010+
'begin'#010+
' if (CPU=cpuNone) or (OS=osNone) or (FCompilerVersion='#039#039') then'#010+
' begin'#010+
'{$ifdef HAS_UNIT_PRO','CESS}'#010+
' // Detect compiler version/target from -i option'#010+
' infosl:=TStringList.Create;'#010+
' infosl.Delimiter:='#039' '#039';'#010+
' infosl.DelimitedText:=GetCompilerInfo(GetCompiler,'#039'-iVTPTO'#039+
');'#010+
' if infosl.Count<>3 then'#010+
' Raise EIns','tallerError.Create(SErrInvalidFPCInfo);'#010+
' if FCompilerVersion='#039#039' then'#010+
' FCompilerVersion:=infosl[0];'#010+
' if CPU=cpuNone then'#010+
' CPU:=StringToCPU(infosl[1]);'#010+
' if OS=osNone then'#010+
' OS:=StringToOS(infosl[2]);'#010+
'{$else ','HAS_UNIT_PROCESS}'#010+
' // Defaults taken from compiler used to build fpmake'#010+
' if CPU=cpuNone then'#010+
' CPU:=StringToCPU({$I %FPCTARGETCPU%});'#010+
' if OS=osNone then'#010+
' OS:=StringToOS({$I %FPCTARGETOS%});'#010+
' if FCompilerVers','ion='#039#039' then'#010+
' FCompilerVersion:={$I %FPCVERSION%};'#010+
'{$endif HAS_UNIT_PROCESS}'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.LoadFromFile(Const AFileName: String);'#010+
'Var'#010+
' F : TFileStream;'#010+
'begin'#010+
' F:=TFileStream.Create(AFileName,fmOpenRead);'#010,
' Try'#010+
' LoadFromStream(F);'#010+
' Finally'#010+
' F.Free;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.SaveToFile(Const AFileName: String);'#010+
'Var'#010+
' F : TFileStream;'#010+
'begin'#010+
' F:=TFileStream.Create(AFileName,fmCreate);'#010+
' Try'#010+
' SaveToStream(F);'#010+
' Finally'#010+
' ',' F.Free;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.SaveToStream(S : TStream);'#010+
'Var'#010+
' L : TStringList;'#010+
'begin'#010+
' L:=TStringList.Create;'#010+
' try'#010+
' With L do'#010+
' begin'#010+
' Values[KeyArchive]:=FArchive;'#010+
' Values[KeyCompiler]:=FCompiler;'#010+
' ',' Values[KeyCopy]:=FCopy;'#010+
' Values[KeyMkDir]:=FMkDir;'#010+
' Values[KeyMove]:=FMove;'#010+
' Values[KeyOptions]:=FOptions;'#010+
' Values[KeyCPU]:=CPUToString(FCPU);'#010+
' Values[KeyOS]:=OSToString(FOS);'#010+
' Values[KeyMode]:=ModeToString','(FMode);'#010+
' Values[KeyLocalUnitDir]:=FLocalUnitDir;'#010+
' Values[KeyGlobalUnitDir]:=FGlobalUnitDir;'#010+
' Values[KeyPrefix]:=FPrefix;'#010+
' Values[KeyBaseInstallDir]:=FBaseInstallDir;'#010+
' Values[KeyUnitInstallDir]:=FUnitInstallDir;'#010+
' ',' Values[KeyBinInstallDir]:=FBinInstallDir;'#010+
' Values[KeyDocInstallDir]:=FDocInstallDir;'#010+
' Values[KeyExamplesInstallDir]:=FExamplesInstallDir;'#010+
' Values[KeyRemove]:=FRemove;'#010+
' Values[KeyTarget]:=FTarget;'#010+
' if FNoFPCCfg th','en'#010+
' Values[KeyNoFPCCfg]:='#039'Y'#039';'#010+
' end;'#010+
' L.SaveToStream(S);'#010+
' Finally'#010+
' L.Free;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomDefaults.LoadFromStream(S: TStream);'#010+
'Var'#010+
' L : TStrings;'#010+
' Line : String;'#010+
' I,P,PC : Integer;'#010+
'begin'#010+
' L:=TStringList','.Create;'#010+
' Try'#010+
' L.LoadFromStream(S);'#010+
' // Fix lines.'#010+
' For I:=L.Count-1 downto 0 do'#010+
' begin'#010+
' Line:=L[I];'#010+
' P:=Pos('#039'='#039',Line);'#010+
' PC:=Pos('#039';'#039',Line); // Comment line.'#010+
' If (P=0) or ((PC<>0) and (PC<P)) then'#010+
' ','L.Delete(I)'#010+
' else'#010+
' L[i]:=Trim(System.Copy(Line,1,P-1)+'#039'='#039'+Trim(System.Cop'+
'y(Line,P+1,Length(Line)-P)));'#010+
' end;'#010+
' With L do'#010+
' begin'#010+
' FArchive:=Values[KeyArchive];'#010+
' FCompiler:=Values[KeyCompiler];'#010+
' FCopy:=V','alues[KeyCopy];'#010+
' FMkDir:=Values[KeyMkDir];'#010+
' FMove:=Values[KeyMove];'#010+
' FRemove:=Values[KeyRemove];'#010+
' FOptions:=Values[KeyOptions];'#010+
' Line:=Values[KeyCPU];'#010+
' If (Line<>'#039#039') then'#010+
' FCPU:=StringToCPU(Line);'#010+
' ','Line:=Values[KeyOS];'#010+
' If (Line<>'#039#039') then'#010+
' FOS:=StringToOS(Line);'#010+
' Line:=Values[KeyMode];'#010+
' If (Line<>'#039#039') then'#010+
' FMode:=StringToMode(Line);'#010+
' FTarget:=Values[KeyTarget];'#010+
' FLocalUnitDir:=Values[KeyLocalUnit','Dir];'#010+
' FGlobalUnitDir:=Values[KeyGlobalUnitDir];'#010+
' FPrefix:=Values[KeyPrefix];'#010+
' FBaseInstallDir:=Values[KeyBaseInstallDir];'#010+
' FUnitInstallDir:=Values[KeyUnitInstallDir];'#010+
' FBinInstallDir:=Values[KeyBinInstallDir];'#010+
' ',' FDocInstallDir:=Values[KeyDocInstallDir];'#010+
' FExamplesInstallDir:=Values[KeyExamplesInstallDir];'#010+
' FNoFPCCfg:=(Upcase(Values[KeyNoFPCCfg])='#039'Y'#039');'#010+
' end;'#010+
' Finally'#010+
' L.Free;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'{**************************************','*****************************'+
'*********'#010+
' TFPCDefaults'#010+
'**********************************************************************'+
'******}'#010+
#010+
'procedure TFPCDefaults.CompilerDefaults;'#010+
'var'#010+
' BD : String;'#010+
'begin'#010+
' inherited Co','mpilerDefaults;'#010+
#010+
' // Use the same algorithm as the compiler, see options.pas'#010+
'{$ifdef Unix}'#010+
' BD:=FixPath(GetEnvironmentVariable('#039'FPCDIR'#039'));'#010+
' if BD='#039#039' then'#010+
' begin'#010+
' BD:='#039'/usr/local/lib/fpc/'#039'+FCompilerVersion;'#010+
' if not DirectoryE','xists(BD) and'#010+
' DirectoryExists('#039'/usr/lib/fpc/'#039'+FCompilerVersion) the'+
'n'#010+
' BD:='#039'/usr/lib/fpc/'#039'+FCompilerVersion;'#010+
' end;'#010+
'{$else unix}'#010+
' BD:=FixPath(GetEnvironmentVariable('#039'FPCDIR'#039'));'#010+
' if BD='#039#039' then'#010+
' begin'#010+
' BD:=ExtractFi','lePath(FCompiler)+'#039'..'#039';'#010+
' if not(DirectoryExists(BD+'#039'/units'#039')) and'#010+
' not(DirectoryExists(BD+'#039'/rtl'#039')) then'#010+
' BD:=FBaseInstallDir+'#039'..'#039';'#010+
' end;'#010+
'{$endif unix}'#010+
#010+
' // Where to install by default'#010+
' if (FBaseInstallDir='#039#039') and (F','Prefix='#039#039') then'#010+
' BaseInstallDir:=BD;'#010+
#010+
' // Where to find the units by default'#010+
' if (FGlobalUnitDir='#039#039') then'#010+
' GlobalUnitDir:=IncludeTrailingPathDelimiter(BD)+'#039'units'#039'+Pa'+
'thDelim+Target;'#010+
'end;'#010+
#010+
#010+
'{*******************************************','************************'+
'*********'#010+
' TCustomInstaller'#010+
'**********************************************************************'+
'******}'#010+
#010+
'constructor TCustomInstaller.Create(AOwner: TComponent);'#010+
'begin'#010+
' Dictionary:=Dicti','onaryClass.Create(Nil);'#010+
' AnalyzeOptions;'#010+
' CreatePackages;'#010+
'end;'#010+
#010+
#010+
'destructor TCustomInstaller.Destroy;'#010+
'begin'#010+
' FreeAndNil(Defaults);'#010+
' FreeAndNil(Dictionary);'#010+
' inherited destroy;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.Log(Level: TVerboseLevel;',' const Msg: Stri'+
'ng);'#010+
'begin'#010+
' If Level in FLogLevels then'#010+
' begin'#010+
' if Level in [vlError,vlWarning] then'#010+
' Writeln(StdErr,Msg)'#010+
' else'#010+
' Writeln(StdOut,Msg);'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.CreatePackages;'#010+
'beg','in'#010+
' FPAckages:=TPackages.Create(TPackage);'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.CreateBuildEngine;'#010+
'begin'#010+
' FBuildEngine:=TBuildEngine.Create(Self);'#010+
'// FBuildEngine.Defaults:=Defaults;'#010+
' FBuildEngine.ListMode:=FListMode;'#010+
' FBuildEngine.OnLog:','=@Self.Log;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.Error(const Msg: String);'#010+
'begin'#010+
' Raise EInstallerError.Create(Msg);'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.Error(const Fmt: String; Args: array of con'+
'st);'#010+
'begin'#010+
' Raise EInstallerError.CreateFmt(Fmt',',Args);'#010+
'end;'#010+
#010+
#010+
'Function TCustomInstaller.AddPackage(const AName: String) : TPackage;'#010+
'begin'#010+
' result:=FPackages.AddPackage(AName);'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.AnalyzeOptions;'#010+
#010+
' Function CheckOption(Index : Integer;const Short,Long : S','tring): B'+
'oolean;'#010+
' var'#010+
' O : String;'#010+
' begin'#010+
' O:=Paramstr(Index);'#010+
' Result:=(O='#039'-'#039'+short) or (O='#039'--'#039'+long) or (copy(O,'+
'1,Length(Long)+3)=('#039'--'#039'+long+'#039'='#039'));'#010+
' end;'#010+
#010+
' Function CheckCommand(Index : Integer;const Short,Long : String): Bo'+
'o','lean;'#010+
' var'#010+
' O : String;'#010+
' begin'#010+
' O:=Paramstr(Index);'#010+
' Result:=(O='#039'-'#039'+short) or (O=long);'#010+
' end;'#010+
#010+
' Function OptionArg(Var Index : Integer) : String;'#010+
' Var'#010+
' P : Integer;'#010+
' begin'#010+
' if (Length(ParamStr(Index))>1) and (Paramstr(I','ndex)[2]<>'#039'-'#039+
') then'#010+
' begin'#010+
' If Index<ParamCount then'#010+
' begin'#010+
' Inc(Index);'#010+
' Result:=Paramstr(Index);'#010+
' end'#010+
' else'#010+
' Error(SErrNeedArgument,[Index,ParamStr(Index)]);'#010+
' end'#010+
' else If length(P','aramStr(Index))>2 then'#010+
' begin'#010+
' P:=Pos('#039'='#039',Paramstr(Index));'#010+
' If (P=0) then'#010+
' Error(SErrNeedArgument,[Index,ParamStr(Index)])'#010+
' else'#010+
' begin'#010+
' Result:=Paramstr(Index);'#010+
' Delete(Result,1,P);'#010+
' ','end;'#010+
' end;'#010+
' end;'#010+
#010+
'Var'#010+
' I : Integer;'#010+
' DefaultsFileName : string;'#010+
'begin'#010+
' I:=0;'#010+
' FListMode:=False;'#010+
' FLogLevels:=DefaultMessages;'#010+
' While (I<ParamCount) do'#010+
' begin'#010+
' Inc(I);'#010+
' if CheckOption(I,'#039'v'#039','#039'verbose'#039') then'#010+
' FLogLeve','ls:=AllMessages'#010+
' else if CheckOption(I,'#039'd'#039','#039'debug'#039') then'#010+
' FLogLevels:=AllMessages+[vlDebug]'#010+
' else if CheckCommand(I,'#039'm'#039','#039'compile'#039') then'#010+
' FRunMode:=rmCompile'#010+
' else if CheckCommand(I,'#039'b'#039','#039'build'#039') then'#010+
' FRunMode:=rmBuil','d'#010+
' else if CheckCommand(I,'#039'i'#039','#039'install'#039') then'#010+
' FRunMode:=rmInstall'#010+
' else if CheckCommand(I,'#039'c'#039','#039'clean'#039') then'#010+
' FRunMode:=rmClean'#010+
' else if CheckCommand(I,'#039'a'#039','#039'archive'#039') then'#010+
' FRunMode:=rmarchive'#010+
' else if CheckComman','d(I,'#039'M'#039','#039'manifest'#039') then'#010+
' FRunMode:=rmManifest'#010+
' else if CheckOption(I,'#039'h'#039','#039'help'#039') then'#010+
' Usage('#039#039',[])'#010+
' else if Checkoption(I,'#039'C'#039','#039'cpu'#039') then'#010+
' Defaults.CPU:=StringToCPU(OptionArg(I))'#010+
' else if Checkoption(I,'#039'O'#039','#039'os'#039') th','en'#010+
' Defaults.OS:=StringToOS(OptionArg(I))'#010+
' else if Checkoption(I,'#039't'#039','#039'target'#039') then'#010+
' Defaults.Target:=OptionArg(I)'#010+
' else if CheckOption(I,'#039'l'#039','#039'list-commands'#039') then'#010+
' FListMode:=True'#010+
' else if Checkoption(I,'#039'P'#039','#039'prefix'#039,') then'#010+
' Defaults.Prefix:=OptionArg(I)'#010+
' else if Checkoption(I,'#039'n'#039','#039'nofpccfg'#039') then'#010+
' Defaults.NoFPCCfg:=true'#010+
' else if CheckOption(I,'#039'B'#039','#039'baseinstalldir'#039') then'#010+
' Defaults.BaseInstallDir:=OptionArg(I)'#010+
' else if CheckOption','(I,'#039'UL'#039','#039'localunitdir'#039') then'#010+
' Defaults.LocalUnitDir:=OptionArg(I)'#010+
' else if CheckOption(I,'#039'UG'#039','#039'globalunitdir'#039') then'#010+
' Defaults.GlobalUnitDir:=OptionArg(I)'#010+
' else if CheckOption(I,'#039'r'#039','#039'compiler'#039') then'#010+
' Defaults.Compiler:=O','ptionArg(I)'#010+
' else if CheckOption(I,'#039'f'#039','#039'config'#039') then'#010+
' DefaultsFileName:=OptionArg(I)'#010+
' else'#010+
' begin'#010+
' Usage(SErrInValidArgument,[I,ParamStr(I)]);'#010+
' end;'#010+
' end;'#010+
' If DefaultsFileName<>'#039#039' then'#010+
' Defaults.LocalInit(D','efaultsFileName);'#010+
' Defaults.CompilerDefaults;'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.Usage(const FMT: String; Args: array of con'+
'st);'#010+
#010+
' Procedure LogCmd(const LC,Msg : String);'#010+
' begin'#010+
' Log(vlInfo,Format('#039' %-12s %s'#039',[LC,MSG]));'#010+
' end;'#010+
#010+
' Pro','cedure LogOption(const C,LC,Msg : String);'#010+
' begin'#010+
' Log(vlInfo,Format('#039' -%s --%-16s %s'#039',[C,LC,MSG]));'#010+
' end;'#010+
#010+
' Procedure LogArgOption(const C,LC,Msg : String);'#010+
' begin'#010+
' Log(vlInfo,Format('#039' -%s --%-20s %s'#039',[C,LC+'#039'='#039'+SVal'+
'ue,MSG]));'#010+
' e','nd;'#010+
#010+
'begin'#010+
' // Force the Usage to be displayed'#010+
' Include(FLogLevels,vlInfo);'#010+
' If (FMT<>'#039#039') then'#010+
' Log(vlInfo,Format(Fmt,Args));'#010+
' Log(vlInfo,Format(SHelpUsage,[Paramstr(0)]));'#010+
' Log(vlInfo,SHelpCommand);'#010+
' LogCmd('#039'compile'#039',SHelpCompile)',';'#010+
' LogCmd('#039'build'#039',SHelpBuild);'#010+
' LogCmd('#039'install'#039',SHelpInstall);'#010+
' LogCmd('#039'clean'#039',SHelpClean);'#010+
' LogCmd('#039'archive'#039',SHelpArchive);'#010+
' LogCmd('#039'manifest'#039',SHelpManifest);'#010+
' Log(vlInfo,SHelpCmdOptions);'#010+
' LogOption('#039'h'#039','#039'help'#039',SHelpHelp);'#010+
' LogOpt','ion('#039'l'#039','#039'list-commands'#039',SHelpList);'#010+
' LogOption('#039'n'#039','#039'nofpccfg'#039',SHelpNoFPCCfg);'#010+
' LogOption('#039'v'#039','#039'verbose'#039',SHelpVerbose);'#010+
' LogArgOption('#039'C'#039','#039'cpu'#039',SHelpCPU);'#010+
' LogArgOption('#039'O'#039','#039'os'#039',SHelpOS);'#010+
' LogArgOption('#039't'#039','#039'target'#039',SHelpTarget);'#010+
' LogArg','Option('#039'P'#039','#039'prefix'#039',SHelpPrefix);'#010+
' LogArgOption('#039'B'#039','#039'baseinstalldir'#039',SHelpBaseInstalldi'+
'r);'#010+
' LogArgOption('#039'UL'#039','#039'localunitdir'#039',SHelpLocalUnitdir);'+
#010+
' LogArgOption('#039'UG'#039','#039'globalunitdir'#039',SHelpGlobalUnitdir'+
');'#010+
' LogArgOption('#039'r'#039','#039'compiler'#039',SHelpC','ompiler);'#010+
' LogArgOption('#039'f'#039','#039'config'#039',SHelpConfig);'#010+
' Log(vlInfo,'#039#039');'#010+
' If (FMT<>'#039#039') then'#010+
' halt(1)'#010+
' else'#010+
' halt(0);'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.Compile(Force: Boolean);'#010+
'begin'#010+
' FBuildEngine.ForceCompile:=Force;'#010+
' FBuildEngine.Co','mpile(FPackages);'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.Clean;'#010+
'begin'#010+
' BuildEngine.Clean(FPackages);'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.Install;'#010+
'begin'#010+
' BuildEngine.Install(FPackages);'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.Archive;'#010+
'begin'#010+
' // Force ','generation of manifest.xml, this is required for the repo'+
'sitory'#010+
' BuildEngine.Manifest(FPackages);'#010+
' BuildEngine.Archive(FPackages);'#010+
'end;'#010+
#010+
#010+
'procedure TCustomInstaller.Manifest;'#010+
'begin'#010+
' BuildEngine.Manifest(FPackages);'#010+
'end;'#010+
#010+
#010+
'procedure TCust','omInstaller.CheckPackages;'#010+
'begin'#010+
' If (FPackages.Count=0) then'#010+
' Error(SErrNoPackagesDefined);'#010+
' // Check for other obvious errors ?'#010+
'end;'#010+
#010+
#010+
'Function TCustomInstaller.Run : Boolean;'#010+
'begin'#010+
' Result:=True;'#010+
' try'#010+
' CheckPackages;'#010+
' Create','BuildEngine;'#010+
' Case RunMode of'#010+
' rmCompile : Compile(False);'#010+
' rmBuild : Compile(True);'#010+
' rmInstall : Install;'#010+
' rmArchive : Archive;'#010+
' rmClean : Clean;'#010+
' rmManifest : Manifest;'#010+
' end;'#010+
' except'#010+
' On E : Ex','ception do'#010+
' begin'#010+
' Log(vlError,SErrInstaller);'#010+
' Log(vlError,E.Message);'#010+
' Result:=False;'#010+
' end;'#010+
' end;'#010+
' // Force returning an exitcode to the shell'#010+
' if not Result then'#010+
' ExitCode:=1;'#010+
'end;'#010+
#010+
#010+
'{**********************','*********************************************'+
'*********'#010+
' TFPCInstaller'#010+
'**********************************************************************'+
'******}'#010+
#010+
'constructor TFPCInstaller.Create(AOwner: TComponent);'#010+
'begin'#010,
' if assigned(Defaults) then'#010+
' Error(SErrAlreadyInitialized);'#010+
' Defaults:=TFPCDefaults.Create;'#010+
' inherited Create(AOwner);'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' ',' TBasicInstaller'#010+
'**********************************************************************'+
'******}'#010+
#010+
'constructor TBasicInstaller.Create(AOwner: TComponent);'#010+
'begin'#010+
' if assigned(Defaults) then'#010+
' Error(SErrAlreadyInitialized);'#010+
' Defaults:=TBas','icDefaults.Create;'#010+
' inherited Create(AOwner);'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' TBuildEngine'#010+
'**************************************************************','******'+
'********}'#010+
#010+
'constructor TBuildEngine.Create(AOwner: TComponent);'#010+
'begin'#010+
' inherited Create(AOwner);'#010+
' // Maybe this should be the current directory ?'#010+
' // Or have it as a command-line option.'#010+
' // Would allow to put all '#039'installers'#039' in ','one dir and call'+
' them'#010+
' // With --start-dir=/path/to/sources.'#010+
' FStartDir:=includeTrailingPathDelimiter(GetCurrentDir);'#010+
' FExternalPackages:=TPackages.Create(TPackage);'#010+
'end;'#010+
#010+
#010+
'destructor TBuildEngine.Destroy;'#010+
'begin'#010+
' FreeAndNil(FExternalPac','kages);'#010+
' inherited Destroy;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Error(const Msg: String);'#010+
'begin'#010+
' Raise EInstallerError.Create(Msg);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Error(const Fmt: String; const Args: array of c'+
'onst);'#010+
'begin'#010+
' Raise EInstallerErro','r.CreateFmt(Fmt,Args);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.ExecuteCommand(const Cmd,Args : String; IgnoreE'+
'rror : Boolean = False);'#010+
'Var'#010+
' E : Integer;'#010+
'begin'#010+
' Log(vlInfo,SInfoExecutingCommand,[Cmd,Args]);'#010+
' if ListMode then'#010+
' Log(vlCommand,'#039'%s %','s'#039',[Cmd,Args])'#010+
' else'#010+
' begin'#010+
' // We should check cmd for spaces, and move all after first spac'+
'e to args.'#010+
' E:=ExecuteProcess(cmd,args);'#010+
' If (E<>0) and (not IgnoreError) then'#010+
' Error(SErrExternalCommandFailed,[Cmd,E]);',#010+
' end;'#010+
'end;'#010+
#010+
#010+
'Function TBuildEngine.SysDirectoryExists(const ADir:string):Boolean;'#010+
'begin'#010+
' result:=SysUtils.DirectoryExists(ADir);'#010+
' if result then'#010+
' Log(vlDebug,SDbgDirectoryExists,[ADir,SDbgFound])'#010+
' else'#010+
' Log(vlDebug,SDbgDirector','yExists,[ADir,SDbgNotFound]);'#010+
'end;'#010+
#010+
#010+
'Function TBuildEngine.SysFileExists(const AFileName:string):Boolean;'#010+
'begin'#010+
' result:=SysUtils.FileExists(AFileName);'#010+
' if result then'#010+
' Log(vlDebug,SDbgFileExists,[AFileName,SDbgFound])'#010+
' else'#010+
' Log(','vlDebug,SDbgFileExists,[AFileName,SDbgNotFound]);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.SysCopyFile(Const Src,Dest : String);'#010+
'Var'#010+
' D,S : String;'#010+
' Fin,FOut : TFileStream;'#010+
' Count : Int64;'#010+
' A : Integer;'#010+
'begin'#010+
' Log(vlInfo,SInfoCopyingFile,[Src,Des','t]);'#010+
' FIn:=TFileStream.Create(Src,fmopenRead);'#010+
' Try'#010+
' D:=IncludeTrailingPathDelimiter(Dest);'#010+
' If DirectoryExists(D) then'#010+
' S:=D+ExtractFileName(Src)'#010+
' else'#010+
' S:=Dest;'#010+
' FOut:=TFileStream.Create(S,fmCreate);'#010+
' Try'#010+
' ','Count:=Fout.CopyFrom(FIn,0);'#010+
' If (Count<>Fin.Size) then'#010+
' Error(SErrCopyingFile,[Src,S]);'#010+
' Finally'#010+
' FreeAndNil(Fout);'#010+
' end;'#010+
' A:=FileGetDate(FIn.Handle);'#010+
' If (A=-1) then'#010+
' log(vlWarning,SWarnFailedToGetTime,[S','rc])'#010+
' else'#010+
' if FileSetDate(S,A)<>0 then'#010+
' Log(vlWarning,SWarnFailedToSetTime,[S]);'#010+
' finally'#010+
' FreeAndNil(Fin);'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.SysMoveFile(Const Src,Dest : String);'#010+
'Var'#010+
' S : String;'#010+
'begin'#010+
' If Director','yExists(IncludeTrailingPathDelimiter(Dest)) then'#010+
' S:=IncludeTrailingPathDelimiter(Dest)+ExtractFileName(Src)'#010+
' else'#010+
' S:=Dest;'#010+
' If Not RenameFile(Src,S) then'#010+
' begin'#010+
' Try'#010+
' SysCopyFile(Src,S);'#010+
' SysDeleteFile(Src);'#010,
' Except'#010+
' On E : Exception Do'#010+
' Error(SErrMovingFile,[Src,S]);'#010+
' end;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.SysDeleteFile(Const AFileName : String);'#010+
'begin'#010+
' if not FileExists(AFileName) then'#010+
' Log(vlWarning,SWarnFi','leDoesNotExist,[AFileName])'#010+
' else If Not DeleteFile(AFileName) then'#010+
' Error(SErrDeletingFile,[AFileName]);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.SysArchiveFiles(List: TStrings;Const AFileName:'+
' String);'#010+
'begin'#010+
' If Not (Assigned(OnArchivefiles) or',' Assigned(ArchiveFilesProc)) th'+
'en'#010+
' Raise EInstallerError.Create(SErrNoArchiveSupport);'#010+
' If Assigned(ArchiveFilesProc) then'#010+
' ArchiveFilesProc(AFileName,List)'#010+
' else'#010+
' OnArchiveFiles(AFileName,List);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Log','Indent;'#010+
'begin'#010+
' FLogPrefix:=FLogPrefix+'#039' '#039';'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.LogUnIndent;'#010+
'begin'#010+
' Delete(FLogPrefix,1,2);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Log(Level: TVerboseLevel; const Msg: String);'#010+
'begin'#010+
' If Assigned(FOnLog) then'#010+
' begin'#010+
' ',' if Level in [vlInfo,vlDebug] then'#010+
' FOnLog(Level,FLogPrefix+Msg)'#010+
' else'#010+
' FOnLog(Level,Msg);'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Log(Level: TVerboseLevel; const Fmt: String;con'+
'st Args: array of const);'#010+
'begin'#010+
' Log(Le','vel,Format(Fmt,Args));'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.EnterDir(ADir: String);'#010+
'Var'#010+
' D : String;'#010+
'begin'#010+
' D:=FStartDir;'#010+
' D:=D+ADir;'#010+
' Log(vlDebug,SDbgEnterDir,[D]);'#010+
' If Not SetCurrentDir(D) then'#010+
' Error(SErrChangeDirFailed,[D]);'#010+
'end;'#010+
#010+
#010+
'pro','cedure TBuildEngine.CmdCopyFiles(List: TStrings; Const DestDir: S'+
'tring);'#010+
#010+
'Var'#010+
' Args : String;'#010+
' I : Integer;'#010+
#010+
'begin'#010+
' CmdCreateDir(DestDir);'#010+
' If (Defaults.Copy<>'#039#039') then'#010+
' begin'#010+
' Args:=FileListToString(List,'#039#039');'#010+
' Args:=Args+'#039' ',#039'+DestDir;'#010+
' ExecuteCommand(Defaults.Copy,Args);'#010+
' end'#010+
' else'#010+
' For I:=0 to List.Count-1 do'#010+
' SysCopyFile(List[i],DestDir);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.CmdCreateDir(const DestDir: String);'#010+
'begin'#010+
' If (Defaults.MkDir<>'#039#039') then'#010,
' ExecuteCommand(Defaults.MkDir,DestDir)'#010+
' else'#010+
' If not ForceDirectories(DestDir) then'#010+
' Error(SErrCreatingDirectory,[DestDir]);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.CmdMoveFiles(List: TStrings; Const DestDir: Str'+
'ing);'#010+
'Var'#010+
' Args : String',';'#010+
' I : Integer;'#010+
'begin'#010+
' CmdCreateDir(DestDir);'#010+
' If (Defaults.Move<>'#039#039') then'#010+
' begin'#010+
' Args:=FileListToString(List,'#039#039');'#010+
' Args:=Args+'#039' '#039'+DestDir;'#010+
' ExecuteCommand(Defaults.Move,Args);'#010+
' end'#010+
' else'#010+
' For I:=0 to List.Count','-1 do'#010+
' SysMoveFile(List[i],DestDir);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.CmdDeleteFiles(List: TStrings);'#010+
'Var'#010+
' Args : String;'#010+
' I : Integer;'#010+
'begin'#010+
' If (Defaults.Remove<>'#039#039') then'#010+
' begin'#010+
' Args:=FileListToString(List,'#039#039');'#010+
' Execute','Command(Defaults.Remove,Args);'#010+
' end'#010+
' else'#010+
' For I:=0 to List.Count-1 do'#010+
' SysDeleteFile(List[i]);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.CmdArchiveFiles(List: TStrings; Const ArchiveFi'+
'le: String);'#010+
'Var'#010+
' S,C,O : String;'#010+
'begin'#010+
' If (Defaults','.Archive='#039#039') then'#010+
' SysArchiveFiles(List,ArchiveFile)'#010+
' else'#010+
' begin'#010+
' S:=FileListToString(List,'#039#039');'#010+
' SplitCommand(Defaults.Archive,C,O);'#010+
' If (O='#039#039') then'#010+
' O:=ArchiveFile+'#039' '#039'+S'#010+
' else'#010+
' O:=Substitute(O,['#039'AR','CHIVE'#039',ArchiveFile,'#039'FILESORD'+
'IRS'#039']);'#010+
' ExecuteCommand(C,O);'#010+
' end;'#010+
'end;'#010+
#010+
'Function TBuildEngine.FileNewer(const Src,Dest : String) : Boolean;'#010+
#010+
'Var'#010+
' DS,DD : Longint;'#010+
' D1,D2 : TDateTime;'#010+
#010+
'begin'#010+
' DS:=FileAge(Src);'#010+
' DD:=FileAge(Dest);'#010+
' ',' D1:=FileDateToDateTime(DS);'#010+
' D2:=FileDateToDateTime(DD);'#010+
' Log(vlDebug,SDbgComparingFileTimes,[Src,DateTimeToStr(D1),Dest,DateT'+
'imeToStr(D2)]);'#010+
' Result:=D1>=D2;'#010+
' If Result then'#010+
' Log(vlInfo,SInfoSourceNewerDest,[Src,DateTimeToStr(D1),D','est,Date'+
'TimeToStr(D2)]);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.ExecuteCommands(Commands: TCommands; At: TComma'+
'ndAt);'#010+
'Var'#010+
' C : TCommand;'#010+
' I : Integer;'#010+
' Cmd,O : String;'#010+
' E : Boolean;'#010+
'begin'#010+
' For I:=0 to Commands.Count-1 do'#010+
' begin'#010+
' C:=Comm','ands.CommandItems[i];'#010+
' if (C.At=At) then'#010+
' begin'#010+
' E:=True;'#010+
' If (C.SourceFile<>'#039#039') and (C.DestFile<>'#039#039') then'+
#010+
' E:=FileNewer(C.SourceFile,IncludeTrailingPathDelimiter(Dic'+
'tionary.GetValue('#039'OUTPUTDIR'#039'))+C','.DestFile);'#010+
' If E then'#010+
' begin'#010+
' If Assigned(C.BeforeCommand) then'#010+
' C.BeforeCommand(C);'#010+
' O:=Substitute(C.Options,['#039'SOURCE'#039',C.SourceFile,'#039+
'DEST'#039',C.DestFile]);'#010+
' Cmd:=C.Command;'#010+
' ',' If (ExtractFilePath(Cmd)='#039#039') then'#010+
' Cmd:=FileSearch(Cmd,GetEnvironmentvariable('#039'PATH'#039+
'));'#010+
' ExecuteCommand(Cmd,O,C.IgnoreResult);'#010+
' If Assigned(C.AfterCommand) then'#010+
' C.AfterCommand(C);'#010+
' ',' end;'#010+
' end;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'Procedure TBuildEngine.LogSearchPath(const ASearchPathName:string;Path'+
':TConditionalStrings; ACPU:TCPU;AOS:TOS);'#010+
'var'#010+
' S : String;'#010+
' I : Integer;'#010+
' C : TConditionalString;'#010+
'begin'#010+
' S:='#039#039';'#010+
' for i:=','0 to Path.Count-1 do'#010+
' begin'#010+
' C:=Path[I];'#010+
' if (ACPU in C.CPUs) and (AOS in C.OSes) then'#010+
' begin'#010+
' if S<>'#039#039' then'#010+
' S:=S+PathSeparator;'#010+
' S:=S+Dictionary.ReplaceStrings(C.Value)'#010+
' end;'#010+
' end',';'#010+
' if S<>'#039#039' then'#010+
' Log(vlDebug,SDbgSearchPath,[ASearchPathName,S]);'#010+
'end;'#010+
#010+
#010+
'Function TBuildEngine.FindFileInPath(Path:TConditionalStrings; AFileNa'+
'me:String; var FoundPath:String;ACPU:TCPU;AOS:TOS):Boolean;'#010+
'var'#010+
' I : Integer;'#010+
' C : TCondit','ionalString;'#010+
'begin'#010+
' Result:=false;'#010+
' for i:=0 to Path.Count-1 do'#010+
' begin'#010+
' C:=Path[I];'#010+
' if (ACPU in C.CPUs) and (AOS in C.OSes) then'#010+
' begin'#010+
' FoundPath:=IncludeTrailingPathDelimiter(Dictionary.ReplaceSt'+
'rings(C.Val','ue));'#010+
' if FileExists(FoundPath+AFileName) then'#010+
' begin'#010+
' result:=true;'#010+
' exit;'#010+
' end;'#010+
' end;'#010+
' end;'#010+
' FoundPath:='#039#039';'#010+
'end;'#010+
#010+
#010+
'Procedure TBuildEngine.ResolveFileNames(APackage : TPac','kage; ACPU:TC'+
'PU;AOS:TOS;DoChangeDir:boolean=true);'#010+
#010+
' procedure FindMainSource(T:TTarget);'#010+
' var'#010+
' SD,SF : String;'#010+
' begin'#010+
' LogSearchPath('#039'package source'#039',APackage.SourcePath,ACPU,AO'+
'S);'#010+
' SD:=Dictionary.ReplaceStrings(T.Directory);'#010,
' SF:=Dictionary.ReplaceStrings(T.SourceFileName);'#010+
' if SD='#039#039' then'#010+
' FindFileInPath(APackage.SourcePath,SF,SD,ACPU,AOS);'#010+
' if SD<>'#039#039' then'#010+
' SD:=IncludeTrailingPathDelimiter(SD);'#010+
' T.FTargetSourceFileName:=SD+SF;'#010+
' if FileE','xists(T.TargetSourceFileName) then'#010+
' Log(vlDebug,SDbgResolvedSourceFile,[T.SourceFileName,T.TargetSou'+
'rceFileName])'#010+
' else'#010+
' begin'#010+
' Log(vlWarning,SWarnSourceFileNotFound,[T.SourceFileName,MakeTa'+
'rgetString(ACPU,AOS)]);'#010+
' ',' T.FTargetSourceFileName:='#039#039';'#010+
' end;'#010+
' end;'#010+
#010+
' procedure FindIncludeSources(T:TTarget);'#010+
' var'#010+
' SD,SF : String;'#010+
' D : TDependency;'#010+
' j : integer;'#010+
' begin'#010+
' LogSearchPath('#039'target include'#039',T.IncludePath,ACPU,AOS);'#010+
' LogSearchP','ath('#039'package include'#039',APackage.IncludePath,ACP'+
'U,AOS);'#010+
' for j:=0 to T.Dependencies.Count-1 do'#010+
' begin'#010+
' D:=T.Dependencies[j];'#010+
' if (D.DependencyType=depInclude) then'#010+
' begin'#010+
' D.TargetFileName:='#039#039';'#010+
' ',' if (ACPU in D.CPUs) and (AOS in D.OSes) then'#010+
' begin'#010+
' if ExtractFilePath(D.Value)='#039#039' then'#010+
' begin'#010+
' SF:=Dictionary.ReplaceStrings(D.Value);'#010+
' SD:='#039#039';'#010+
' ',' // first check the target specific path'#010+
' if not FindFileInPath(T.IncludePath,SF,SD,ACPU,AOS'+
') then'#010+
' FindFileInPath(APackage.IncludePath,SF,SD,ACPU,A'+
'OS);'#010+
' if SD<>'#039#039' th','en'#010+
' SD:=IncludeTrailingPathDelimiter(SD);'#010+
' D.TargetFileName:=SD+SF;'#010+
' end'#010+
' else'#010+
' D.TargetFileName:=D.Value;'#010+
' if FileExists(D.TargetFile','Name) then'#010+
' Log(vlDebug,SDbgResolvedIncludeFile,[D.Value,D.Targe'+
'tFileName])'#010+
' else'#010+
' begin'#010+
' Log(vlWarning,SWarnIncludeFileNotFound,[D.Value,Ma'+
'keTargetString(ACPU,AOS)]);'#010+
' ',' D.TargetFileName:='#039#039';'#010+
' end;'#010+
' end;'#010+
' end;'#010+
' end;'#010+
' end;'#010+
#010+
' procedure FindExampleSource(T:TTarget);'#010+
' var'#010+
' SD,SF : String;'#010+
' begin'#010+
' LogSearchPath('#039'package example'#039',APackage.Exam','plePath,ACP'+
'U,AOS);'#010+
' SD:=Dictionary.ReplaceStrings(T.Directory);'#010+
' SF:=Dictionary.ReplaceStrings(T.SourceFileName);'#010+
' if SD='#039#039' then'#010+
' FindFileInPath(APackage.ExamplePath,SF,SD,ACPU,AOS);'#010+
' if SD<>'#039#039' then'#010+
' SD:=IncludeTrailin','gPathDelimiter(SD);'#010+
' T.FTargetSourceFileName:=SD+SF;'#010+
' if FileExists(T.TargetSourceFileName) then'#010+
' Log(vlDebug,SDbgResolvedSourceFile,[T.SourceFileName,T.TargetSou'+
'rceFileName])'#010+
' else'#010+
' begin'#010+
' Log(vlWarning,SWarnSourc','eFileNotFound,[T.SourceFileName,Make'+
'TargetString(ACPU,AOS)]);'#010+
' T.FTargetSourceFileName:='#039#039';'#010+
' end;'#010+
' end;'#010+
#010+
'var'#010+
' T : TTarget;'#010+
' i : Integer;'#010+
'begin'#010+
' if not((ACPU in APackage.CPUs) and (AOS in APackage.OSes)) then'#010+
' exit;'#010+
' try'#010,
' if DoChangeDir and (APackage.Directory<>'#039#039') then'#010+
' EnterDir(APackage.Directory);'#010+
' Dictionary.AddVariable('#039'CPU'#039',CPUToString(ACPU));'#010+
' Dictionary.AddVariable('#039'OS'#039',OSToString(AOS));'#010+
' For I:=0 to APackage.Targets.Count-1 do'#010+
' ',' begin'#010+
' T:=APackage.FTargets.TargetItems[I];'#010+
' if (ACPU in T.CPUs) and (AOS in T.OSes) then'#010+
' begin'#010+
' // Debug information'#010+
' Log(vlDebug,SDbgResolvingSourcesOfTarget,[T.Name,MakeTarge'+
'tString(ACPU,AO','S)]);'#010+
' LogIndent;'#010+
#010+
' case T.TargetType of'#010+
' ttProgram,'#010+
' ttUnit,'#010+
' ttImplicitUnit :'#010+
' begin'#010+
' FindMainSource(T);'#010+
' if T.Dependencies.Coun','t>0 then'#010+
' FindIncludeSources(T);'#010+
' end;'#010+
' ttExampleUnit,'#010+
' ttExampleProgram :'#010+
' begin'#010+
' FindExampleSource(T);'#010+
' end;'#010+
' end;'#010+
#010+
' ',' LogUnIndent;'#010+
' end;'#010+
' end;'#010+
' finally'#010+
' If DoChangeDir and (APackage.Directory<>'#039#039') then'#010+
' EnterDir('#039#039');'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'function TBuildEngine.GetUnitDir(APackage:TPackage):String;'#010+
'begin'#010+
' // Retrieve Full directory n','ame where to find the units.'#010+
' // The search order is:'#010+
' // - Package in this fpmake.pp'#010+
' // - LocalUnitDir'#010+
' // - GlobalUnitDir'#010+
' if (APackage.UnitDir='#039#039') and'#010+
' (APackage.State=tsCompiled) then'#010+
' begin'#010+
' APackage.UnitDir:=Inclu','deTrailingPathDelimiter(FStartDir)+Incl'+
'udeTrailingPathDelimiter(APackage.Directory)+APackage.GetUnitsOutputDi'+
'r(Defaults.CPU,Defaults.OS);'#010+
' end;'#010+
' if (APackage.UnitDir='#039#039') and'#010+
' (Defaults.LocalUnitDir<>'#039#039') then'#010+
' begin'#010+
' APackage','.UnitDir:=IncludeTrailingPathDelimiter(Defaults.LocalU'+
'nitDir)+APackage.Name;'#010+
' if not SysDirectoryExists(APackage.UnitDir) then'#010+
' APackage.UnitDir:='#039#039';'#010+
' end;'#010+
' if APackage.UnitDir='#039#039' then'#010+
' begin'#010+
' APackage.UnitDir:=Inclu','deTrailingPathDelimiter(Defaults.Global'+
'UnitDir)+APackage.Name;'#010+
' if not SysDirectoryExists(APackage.UnitDir) then'#010+
' APackage.UnitDir:=DirNotFound;'#010+
' end;'#010+
' // Special error marker to prevent searches in case of error'#010+
' if APacka','ge.UnitDir=DirNotFound then'#010+
' Result:='#039#039#010+
' else'#010+
' Result:=APackage.UnitDir;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.AddDependencyIncludePaths(L:TStrings;ATarget: T'+
'Target);'#010+
'Var'#010+
' I : Integer;'#010+
' D : TDependency;'#010+
' SD : String;'#010+
'begin'#010+
' For I:=0 to A','Target.Dependencies.Count-1 do'#010+
' begin'#010+
' D:=ATarget.Dependencies[i];'#010+
' if (D.DependencyType=depInclude) and'#010+
' (Defaults.CPU in D.CPUs) and (Defaults.OS in D.OSes) then'#010+
' begin'#010+
' SD:=ExcludeTrailingPathDelimite','r(ExtractFilePath(D.TargetF'+
'ileName));'#010+
' if SD<>'#039#039' then'#010+
' L.Add(SD);'#010+
' end;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.AddDependencyUnitPaths(L:TStrings;APackage: TPa'+
'ckage);'#010+
'Var'#010+
' I : Integer;'#010+
' P : TPackage;'#010+
' D : TDepen','dency;'#010+
' S : String;'#010+
'begin'#010+
' For I:=0 to APackage.Dependencies.Count-1 do'#010+
' begin'#010+
' D:=APackage.Dependencies[i];'#010+
' if (D.DependencyType=depPackage) and'#010+
' (Defaults.CPU in D.CPUs) and (Defaults.OS in D.OSes) then'#010+
' beg','in'#010+
' P:=TPackage(D.Target);'#010+
' If Assigned(P) then'#010+
' begin'#010+
' // Already processed?'#010+
' S:=GetUnitDir(P);'#010+
' if L.IndexOf(S)=-1 then'#010+
' begin'#010+
' // Add thi','s package and then dependencies'#010+
' L.Add(S);'#010+
' AddDependencyUnitPaths(L,P);'#010+
' end;'#010+
' end;'#010+
' end;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'Function TBuildEngine.GetCompilerCommand(APackage : TPackage; ATar','ge'+
't : TTarget) : String;'#010+
'Var'#010+
' L,Args : TStringList;'#010+
' i : Integer;'#010+
'begin'#010+
' Args:=TStringList.Create;'#010+
' Args.Duplicates:=dupIgnore;'#010+
#010+
' Result := '#039#039';'#010+
#010+
' //compiler configuration'#010+
' if Defaults.NoFPCCfg then'#010+
' Args.Add('#039'-n'#039');'#010+
#010+
' // Target OS',#010+
' Args.Add('#039'-T'#039'+OSToString(Defaults.OS));'#010+
#010+
' // Compile mode'#010+
' If ATarget.Mode<>cmFPC then'#010+
' Args.Add('#039'-M'#039'+ModeToString(ATarget.Mode))'#010+
' else If Defaults.Mode<>cmFPC then'#010+
' Args.Add('#039'-M'#039'+ModeToString(Defaults.Mode));'#010+
' // Output file p','aths'#010+
' If ATarget.TargetType in ProgramTargets then'#010+
' Args.Add('#039'-FE'#039'+APackage.GetBinOutputDir(Defaults.CPU,Defau'+
'lts.OS));'#010+
' Args.Add('#039'-FU'#039'+APackage.GetUnitsOutputDir(Defaults.CPU,Defau'+
'lts.OS));'#010+
' // Object Path'#010+
' L:=TStringList.Create;'#010+
' ','L.Sorted:=true;'#010+
' L.Duplicates:=dupIgnore;'#010+
' AddConditionalStrings(L,APackage.ObjectPath,Defaults.CPU,Defaults.OS'+
');'#010+
' AddConditionalStrings(L,ATarget.ObjectPath,Defaults.CPU,Defaults.OS)'+
';'#010+
' for i:=0 to L.Count-1 do'#010+
' Args.Add('#039'-Fo'#039'+L[i]);',#010+
' FreeAndNil(L);'#010+
' // Unit Dirs'#010+
' L:=TStringList.Create;'#010+
' L.Sorted:=true;'#010+
' L.Duplicates:=dupIgnore;'#010+
' AddDependencyUnitPaths(L,APackage);'#010+
' AddConditionalStrings(L,APackage.UnitPath,Defaults.CPU,Defaults.OS);'+
#010+
' AddConditionalStrings(L,AT','arget.UnitPath,Defaults.CPU,Defaults.OS)'+
';'#010+
' for i:=0 to L.Count-1 do'#010+
' Args.Add('#039'-Fu'#039'+L[i]);'#010+
' FreeAndNil(L);'#010+
' // Include Path'#010+
' L:=TStringList.Create;'#010+
' L.Sorted:=true;'#010+
' L.Duplicates:=dupIgnore;'#010+
' AddDependencyIncludePaths(L,ATarget);'#010,
' AddConditionalStrings(L,APackage.IncludePath,Defaults.CPU,Defaults.O'+
'S);'#010+
' AddConditionalStrings(L,ATarget.IncludePath,Defaults.CPU,Defaults.OS'+
');'#010+
' for i:=0 to L.Count-1 do'#010+
' Args.Add('#039'-Fi'#039'+L[i]);'#010+
' FreeAndNil(L);'#010+
' // Custom Options'#010+
' I','f (Defaults.Options<>'#039#039') then'#010+
' Args.Add(Defaults.Options);'#010+
' If (APackage.Options<>'#039#039') then'#010+
' Args.Add(APackage.Options);'#010+
' If (ATarget.Options<>'#039#039') then'#010+
' Args.Add(ATarget.Options);'#010+
' // Add Filename to compile'#010+
' Args.Add(ATarget.Ta','rgetSourceFileName);'#010+
' // Convert to string'#010+
' Result:='#039#039';'#010+
' for i:=0 to Args.Count-1 do'#010+
' Result:=Result+'#039' '#039'+maybequoted(Args[i]);'#010+
' Delete(result,1,1);'#010+
' Args.Free;'#010+
'end;'#010+
#010+
#010+
'Function TBuildEngine.GetCompiler : String;'#010+
'Var'#010+
' S : String;'#010+
'beg','in'#010+
' // Cache in FCompiler for speed.'#010+
' If (FCompiler='#039#039') then'#010+
' begin'#010+
' FCompiler:=Defaults.Compiler;'#010+
' If (ExtractFilePath(FCompiler)='#039#039') then'#010+
' begin'#010+
' S:=FileSearch(FCompiler,GetEnvironmentVariable('#039'PATH'#039'));'+
#010+
' If (S<>'#039,#039') then'#010+
' FCompiler:=S;'#010+
' end;'#010+
' end;'#010+
' Result:=FCompiler;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.CreateOutputDir(APackage: TPackage);'#010+
'Var'#010+
' D : String;'#010+
' i: integer;'#010+
'begin'#010+
' //create a units directory'#010+
' D:=APackage.GetUnitsOutputDir(De','faults.CPU,Defaults.OS);'#010+
' If not SysDirectoryExists(D) then'#010+
' begin'#010+
' Log(vlInfo,SInfoCreatingOutputDir,[D]);'#010+
' CmdCreateDir(D);'#010+
' end;'#010+
#010+
' //also create a bin directory for programtargets'#010+
' For i := 0 to Pred(APackage.Targets.C','ount) do'#010+
' begin'#010+
' if APackage.Targets.TargetItems[i].TargetType in ProgramTargets '+
'then'#010+
' begin'#010+
' D:=APackage.GetBinOutputDir(Defaults.CPU,Defaults.OS);'#010+
' If not SysDirectoryExists(D) then'#010+
' begin'#010+
' ',' Log(vlInfo,SInfoCreatingOutputDir,[D]);'#010+
' CmdCreateDir(D);'#010+
' end;'#010+
' //do not continue loop, directory is made anyway'#010+
' break;'#010+
' end;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'Function TBuildEngine.DependencyOK(ADe','pendency : TDependency) : Bool'+
'ean;'#010+
'begin'#010+
' Result:=(Defaults.CPU in ADependency.CPUs) and (Defaults.OS in ADepe'+
'ndency.OSes);'#010+
'end;'#010+
#010+
#010+
'Function TBuildEngine.TargetOK(ATarget : TTarget) : Boolean;'#010+
'begin'#010+
' Result:=(Defaults.CPU in ATarget.CPUs) ','and (Defaults.OS in ATarget'+
'.OSes);'#010+
'end;'#010+
#010+
#010+
'Function TBuildEngine.PackageOK(APackage : TPackage) : Boolean;'#010+
'begin'#010+
' Result:=(Defaults.CPU in APackage.CPUs) and (Defaults.OS in APackage'+
'.OSes);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.DoBeforeCompile(APac','kage: TPackage);'#010+
'begin'#010+
' ExecuteCommands(APackage.Commands,caBeforeCompile);'#010+
' If Assigned(APackage.BeforeCompile) then'#010+
' APackage.BeforeCompile(APackage);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.DoAfterCompile(APackage: TPackage);'#010+
'begin'#010+
' If Assig','ned(APackage.AfterCompile) then'#010+
' APackage.AfterCompile(APackage);'#010+
' ExecuteCommands(APackage.Commands,caAfterCompile);'#010+
'end;'#010+
#010+
#010+
'Function TBuildEngine.NeedsCompile(APackage:TPackage;ATarget: TTarget)'+
': Boolean;'#010+
'Var'#010+
' I : Integer;'#010+
' D : TDepe','ndency;'#010+
' T : TTarget;'#010+
' OD,OFN : String;'#010+
'begin'#010+
' Result:=False;'#010+
#010+
' // Forced recompile?'#010+
' if FForceCompile then'#010+
' Result:=true;'#010+
#010+
' // Check output file'#010+
' if not result then'#010+
' begin'#010+
' if ATarget.TargetType in ProgramTargets then'#010+
' ',' OD:=APackage.GetBinOutputDir(Defaults.CPU,Defaults.OS)'#010+
' else'#010+
' OD:=APackage.GetUnitsOutputDir(Defaults.CPU,Defaults.OS);'#010+
' If (OD<>'#039#039') then'#010+
' OD:=IncludeTrailingPathDelimiter(OD);'#010+
' OFN:=OD+ATarget.GetOutPutFil','eName(Defaults.OS);'#010+
' Result:=Not FileExists(OFN);'#010+
' if Result then'#010+
' Log(vlDebug,SDbgOutputNotYetAvailable,[OFN]);'#010+
' end;'#010+
#010+
' // Check main source'#010+
' If not Result then'#010+
' begin'#010+
' if FileExists(ATarget.TargetSourceFileNa','me) then'#010+
' Result:=FileNewer(ATarget.TargetSourceFileName,OFN)'#010+
' end;'#010+
#010+
' // Check unit and include dependencies'#010+
' If not Result then'#010+
' begin'#010+
' ResolveDependencies(ATarget.Dependencies,ATarget.Collection as T'+
'Targets);'#010+
' I:=','0;'#010+
' for i:=0 to ATarget.Dependencies.Count-1 do'#010+
' begin'#010+
' D:=ATarget.Dependencies[i];'#010+
' if (Defaults.CPU in D.CPUs) and (Defaults.OS in D.OSes) then'+
#010+
' begin'#010+
' case D.DependencyType of'#010+
' ',' depUnit :'#010+
' begin'#010+
' T:=TTarget(D.Target);'#010+
' If (T=Nil) then'#010+
' Error(SErrDepUnknownTarget,[ATarget.Name,D.Value'+
']);'#010+
' // If a dependent package',' is compiled we always '+
'need to recompile'#010+
' Log(vldebug, SDbgDependencyOnUnit, [ATarget.Name,T'+
'.Name]);'#010+
' Result:=(T.State=tsCompiled);'#010+
' if Result then'#010+
' Log(vldebug, ','SDbgDependencyUnitRecompiled, [T.'+
'Name]);'#010+
' end;'#010+
' depInclude :'#010+
' begin'#010+
' if D.TargetFileName<>'#039#039' then'#010+
' Result:=FileNewer(D.TargetFileName,OFN)'#010+
' ',' end;'#010+
' end;'#010+
' if result then'#010+
' break;'#010+
' end;'#010+
' end;'#010+
' end;'#010+
#010+
' if result then'#010+
' Log(vlDebug,SDbgMustCompile,[ATarget.Name]);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Compile(APackage: TPac','kage; ATarget: TTarget)'+
';'#010+
'Var'#010+
' S : String;'#010+
'begin'#010+
' Log(vlInfo,SInfoCompilingTarget,[ATarget.Name]);'#010+
' LogIndent;'#010+
' ExecuteCommands(ATarget.Commands,caBeforeCompile);'#010+
' If Assigned(ATarget.BeforeCompile) then'#010+
' ATarget.BeforeCompile(ATarge','t);'#010+
' S:=GetCompilerCommand(APackage,ATarget);'#010+
' ExecuteCommand(GetCompiler,S);'#010+
' If Assigned(ATarget.AfterCompile) then'#010+
' ATarget.AfterCompile(ATarget);'#010+
' ExecuteCommands(ATarget.Commands,caAfterCompile);'#010+
' LogUnIndent;'#010+
'end;'#010+
#010+
#010+
'procedure ','TBuildEngine.CompileDependencies(APackage:TPackage; ATarge'+
't: TTarget);'#010+
'Var'#010+
' I : Integer;'#010+
' T : TTarget;'#010+
' D : TDependency;'#010+
'begin'#010+
' Log(vlDebug, Format(SDbgCompilingDependenciesOfTarget, [ATarget.Name'+
']));'#010+
' LogIndent;'#010+
' For I:=0 to ATarget.','Dependencies.Count-1 do'#010+
' begin'#010+
' D:=ATarget.Dependencies[i];'#010+
' if (D.DependencyType=depUnit) and'#010+
' (Defaults.CPU in D.CPUs) and (Defaults.OS in D.OSes) then'#010+
' begin'#010+
' T:=TTarget(D.Target);'#010+
' if Assign','ed(T) and (T<>ATarget) then'#010+
' begin'#010+
' if TargetOK(T) then'#010+
' begin'#010+
' // We don'#039't need to compile implicit units, they'+
' are only'#010+
' // used for dependency checking'#010+
' ',' if (T.TargetType<>ttImplicitUnit) then'#010+
' begin'#010+
' case T.State of'#010+
' tsNeutral :'#010+
' MaybeCompile(APackage,T);'#010+
' tsConsidering :'#010+
' ',' Log(vlWarning,SWarnCircularTargetDependenc'+
'y,[ATarget.Name,T.Name]);'#010+
' end;'#010+
' end;'#010+
' end'#010+
' else'#010+
' Log(vlWarning, Format(SWarnDepUnitNotFound',', [T.Name,'+
' MakeTargetString(Defaults.CPU,Defaults.OS)]));'#010+
' end'#010+
' else'#010+
' Error(SErrDepUnknownTarget,[ATarget.Name,D.Value]);'#010+
' end;'#010+
' end;'#010+
' LogUnIndent;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.MaybeCompile(APackag','e: TPackage; ATarget: TTa'+
'rget);'#010+
'begin'#010+
' if ATarget.State<>tsNeutral then'#010+
' Error(SErrInvalidState,[ATarget.Name]);'#010+
' Log(vlDebug, Format(SDbgConsideringTarget, [ATarget.Name]));'#010+
' LogIndent;'#010+
' ATarget.FTargetState:=tsConsidering;'#010+
' Resolv','eDependencies(ATarget.Dependencies,ATarget.Collection as TTa'+
'rgets);'#010+
' CompileDependencies(APackage, ATarget);'#010+
' if NeedsCompile(APackage, ATarget) then'#010+
' begin'#010+
' Compile(APackage,ATarget);'#010+
' ATarget.FTargetState:=tsCompiled;'#010+
' e','nd'#010+
' else'#010+
' ATarget.FTargetState:=tsNoCompile;'#010+
' LogUnIndent;'#010+
'end;'#010+
#010+
#010+
'function TBuildEngine.NeedsCompile(APackage: TPackage): Boolean;'#010+
'Var'#010+
' I : Integer;'#010+
' P : TPackage;'#010+
' D : TDependency;'#010+
'begin'#010+
' Result:=False;'#010+
#010+
' // Forced recompile?'#010+
' i','f FForceCompile then'#010+
' Result:=true;'#010+
#010+
' // Recompile because of Package Dependencies?'#010+
' if not Result then'#010+
' begin'#010+
' I:=0;'#010+
' For I:=0 to APackage.Dependencies.Count-1 do'#010+
' begin'#010+
' D:=APackage.Dependencies[i];'#010+
' ',' if (D.DependencyType=depPackage) and'#010+
' (Defaults.CPU in D.CPUs) and (Defaults.OS in D.OSes) the'+
'n'#010+
' begin'#010+
' P:=TPackage(D.Target);'#010+
' if Assigned(P) then'#010+
' begin'#010+
' ',' Result:=(P.State=tsCompiled);'#010+
' if Result then'#010+
' break;'#010+
' end;'#010+
' end;'#010+
' end;'#010+
' end;'#010+
#010+
' // Recompile a Target of this package?'#010+
' If Not Result then'#010+
' begin',#010+
' try'#010+
' If (APackage.Directory<>'#039#039') then'#010+
' EnterDir(APackage.Directory);'#010+
' for i:=0 to APackage.Targets.Count-1 do'#010+
' begin'#010+
' Result:=NeedsCompile(APackage,APackage.Targets.TargetItems'+
'[i]);'#010+
' ',' if Result then'#010+
' break;'#010+
' end;'#010+
' Finally'#010+
' If (APackage.Directory<>'#039#039') then'#010+
' EnterDir('#039#039');'#010+
' end;'#010+
' end;'#010+
#010+
' if result then'#010+
' Log(vlDebug,SDbgMustCompile,[APackage.Name]);'#010+
'end;'#010+
#010+
#010+
'function TB','uildEngine.CheckExternalPackage(Const APackageName : Stri'+
'ng):TPackage;'#010+
'var'#010+
' S : String;'#010+
' I : Integer;'#010+
'begin'#010+
' // Already checked?'#010+
' I:=ExternalPackages.IndexOfName(APackageName);'#010+
' if I<>-1 then'#010+
' begin'#010+
' result:=ExternalPackages.Pa','ckageItems[I];'#010+
' exit;'#010+
' end;'#010+
' // Create new external package'#010+
' Result:=ExternalPackages.AddPackage(APackageName);'#010+
' Result.FTargetState:=tsNotFound;'#010+
' // Load unit config'#010+
' S:=GetUnitDir(Result);'#010+
' if S<>'#039#039' then'#010+
' begin'#010+
' Log(','vldebug, SDbgExternalDependency, [APackageName,S]);'#010+
' Result.FTargetState:=tsInstalled;'#010+
' // Load unit config if it exists'#010+
' S:=IncludeTrailingPathDelimiter(S)+UnitConfigFile;'#010+
' if FileExists(S) then'#010+
' begin'#010+
' ','Log(vlDebug, Format(SDbgLoading, [S]));'#010+
' Result.LoadUnitConfigFromFile(S);'#010+
' end;'#010+
' // Check recursive implicit dependencies'#010+
' CompileDependencies(Result);'#010+
' end'#010+
' else'#010+
' Error(SErrDependencyNotFound,[APackageName',']);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.CompileDependencies(APackage: TPackage);'#010+
'Var'#010+
' I : Integer;'#010+
' P : TPackage;'#010+
' D : TDependency;'#010+
'begin'#010+
' For I:=0 to APackage.Dependencies.Count-1 do'#010+
' begin'#010+
' D:=APackage.Dependencies[i];'#010+
' if (D.D','ependencyType=depPackage) and'#010+
' (Defaults.CPU in D.CPUs) and (Defaults.OS in D.OSes) then'#010+
' begin'#010+
' P:=TPackage(D.Target);'#010+
' If Assigned(P) then'#010+
' begin'#010+
' case P.State of'#010+
' ts','Neutral :'#010+
' MaybeCompile(P);'#010+
' tsConsidering :'#010+
' Log(vlWarning,SWarnCircularPackageDependency,[APacka'+
'ge.Name,P.Name]);'#010+
' end;'#010+
' end'#010+
' else'#010+
' begin'#010+
' ',' D.Target:=CheckExternalPackage(D.Value);'#010+
' P:=TPackage(D.Target);'#010+
' end;'#010+
' if (D.RequireChecksum<>$ffffffff) and'#010+
' (P.InstalledChecksum<>$ffffffff) and'#010+
' (P.InstalledChecksum<>D.Req','uireChecksum) then'#010+
' Log(vlDebug,SDbgPackageChecksumChanged,[P.Name]);'#010+
' end;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Compile(APackage: TPackage);'#010+
'Var'#010+
' T : TTarget;'#010+
' I : Integer;'#010+
'begin'#010+
' Try'#010+
' Log(vlInfo,SInfoCompilingPac','kage,[APackage.Name]);'#010+
' If (APackage.Directory<>'#039#039') then'#010+
' EnterDir(APackage.Directory);'#010+
' CreateOutputDir(APackage);'#010+
' Dictionary.AddVariable('#039'UNITSOUTPUTDIR'#039',APackage.GetUnitsO'+
'utputDir(Defaults.CPU,Defaults.OS));'#010+
' Dictionary','.AddVariable('#039'BINOUTPUTDIR'#039',APackage.GetBinOut'+
'putDir(Defaults.CPU,Defaults.OS));'#010+
' DoBeforeCompile(APackage);'#010+
' For I:=0 to APackage.Targets.Count-1 do'#010+
' begin'#010+
' T:=APackage.Targets.TargetItems[i];'#010+
' if (T.TargetType in ','[ttUnit,ttProgram]) then'#010+
' begin'#010+
' if TargetOK(T) then'#010+
' begin'#010+
' if T.State=tsNeutral then'#010+
' MaybeCompile(APackage,T);'#010+
' end'#010+
' else'#010+
' begin'#010+
' ',' if not(Defaults.CPU in T.CPUs) then'#010+
' Log(vldebug, Format(SDbgSkippingTargetWrongCPU, [T.N'+
'ame, CPUsToString(T.CPUs)]));'#010+
' if not(Defaults.OS in T.OSes) then'#010+
' Log(vldebug, Format(SDbgS','kippingTargetWrongOS, [T.'+
'Name, OSesToString(T.OSes)]));'#010+
' end;'#010+
' end'#010+
' else'#010+
' log(vldebug, SDbgTargetIsNotAUnitOrProgram,[T.Name]);'#010+
' end;'#010+
' DoAfterCompile(APackage);'#010+
' Finally'#010+
' If (APackage.Direct','ory<>'#039#039') then'#010+
' EnterDir('#039#039');'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.MaybeCompile(APackage: TPackage);'#010+
'begin'#010+
' if APackage.State<>tsNeutral then'#010+
' Error(SErrInvalidState,[APackage.Name]);'#010+
' Log(vlDebug,SDbgConsideringPackage,[APackage.N','ame]);'#010+
' LogIndent;'#010+
' APackage.FTargetState:=tsConsidering;'#010+
' ResolveDependencies(APackage.Dependencies,(APackage.Collection as TP'+
'ackages));'#010+
' CompileDependencies(APackage);'#010+
' ResolveFileNames(APackage,Defaults.CPU,Defaults.OS);'#010+
' If NeedsC','ompile(APackage) then'#010+
' begin'#010+
' Compile(APackage);'#010+
' APackage.FTargetState:=tsCompiled;'#010+
' end'#010+
' else'#010+
' APackage.FTargetState:=tsNoCompile;'#010+
' LogUnIndent;'#010+
'end;'#010+
#010+
#010+
'Function TBuildEngine.InstallPackageFiles(APAckage : TPackage; tt',' : '+
'TTargetType; Const Dest : String):Boolean;'#010+
'Var'#010+
' List : TStringList;'#010+
'begin'#010+
' Result:=False;'#010+
' List:=TStringList.Create;'#010+
' Try'#010+
' APackage.GetInstallFiles(List,[tt],Defaults.CPU, Defaults.OS);'#010+
' if (List.Count>0) then'#010+
' begin'#010+
' ',' Result:=True;'#010+
' CmdCopyFiles(List,Dest);'#010+
' end;'#010+
' Finally'#010+
' List.Free;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.DoBeforeInstall(APackage: TPackage);'#010+
'begin'#010+
' ExecuteCommands(APackage.Commands,caBeforeInstall);'#010+
' If Assigned(APacka','ge.BeforeInstall) then'#010+
' APackage.BeforeInstall(APackage);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.DoAfterInstall(APackage: TPackage);'#010+
'begin'#010+
' If Assigned(APackage.AfterInstall) then'#010+
' APackage.AfterInstall(APackage);'#010+
' ExecuteCommands(APackage.C','ommands,caAfterInstall);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Install(APackage: TPackage);'#010+
'Var'#010+
' UC,D : String;'#010+
' B : Boolean;'#010+
'begin'#010+
' If (Apackage.State<>tsCompiled) then'#010+
' MaybeCompile(APackage);'#010+
' try'#010+
' Log(vlInfo,SInfoInstallingPackage,[AP','ackage.Name]);'#010+
' If (APackage.Directory<>'#039#039') then'#010+
' EnterDir(APackage.Directory);'#010+
' DoBeforeInstall(APackage);'#010+
' // units'#010+
' B:=false;'#010+
' D:=IncludeTrailingPathDelimiter(Defaults.UnitInstallDir)+APackage.'+
'Name;'#010+
' if InstallPack','ageFiles(APAckage,ttUnit,D) then'#010+
' B:=true;'#010+
' if InstallPackageFiles(APAckage,ttImplicitUnit,D) then'#010+
' B:=true;'#010+
' // Unit (dependency) configuration if there were units installed'#010+
' if B then'#010+
' begin'#010+
' UC:=IncludeTrai','lingPathDelimiter(D)+UnitConfigFile;'#010+
' Log(vlInfo, Format(SDbgGenerating, [UC]));'#010+
' APackage.SaveUnitConfigToFile(UC,Defaults.CPU,Defaults.OS);'#010+
' end;'#010+
' // Programs'#010+
' D:=IncludeTrailingPathDelimiter(Defaults.BinInstallDi','r);'#010+
' InstallPackageFiles(APAckage,ttProgram,D);'#010+
' // Done.'#010+
' APackage.FTargetState:=tsInstalled;'#010+
' DoAfterInstall(APackage);'#010+
' Finally'#010+
' If (APackage.Directory<>'#039#039') then'#010+
' EnterDir('#039#039');'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Do','BeforeArchive(APackage: TPackage);'#010+
'begin'#010+
' ExecuteCommands(APackage.Commands,caBeforeArchive);'#010+
' If Assigned(APackage.BeforeArchive) then'#010+
' APackage.BeforeArchive(APackage);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.DoAfterArchive(APackage: TPackage)',';'#010+
'begin'#010+
' If Assigned(APackage.AfterArchive) then'#010+
' APackage.AfterArchive(APackage);'#010+
' ExecuteCommands(APackage.Commands,caAfterArchive);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Archive(APackage: TPackage);'#010+
'Var'#010+
' L : TStringList;'#010+
' A : String;'#010+
' i:',' integer;'#010+
' ICPU : TCPU;'#010+
' IOS : TOS;'#010+
'begin'#010+
' A:=FStartDir+ APackage.FileName + ZipExt;'#010+
' Log(vlInfo,SInfoArchivingPackage,[APackage.Name,A]);'#010+
' try'#010+
' If (APackage.Directory<>'#039#039') then'#010+
' EnterDir(APackage.Directory);'#010+
' DoBeforeArchi','ve(Apackage);'#010+
' L:=TStringList.Create;'#010+
' L.Sorted:=true;'#010+
' L.Duplicates:=dupIgnore;'#010+
' Try'#010+
' // Add fpmake.pp & manifest.xml always'#010+
' L.Add(FPMakePPFile);'#010+
' L.Add(ManifestFile);'#010+
' //get all files from all targets'#010+
' ',' for ICPU:=Low(TCPU) to high(TCPU) do'#010+
' for IOS:=Low(TOS) to high(TOS) do'#010+
' if OSCPUSupported[IOS,ICPU] then'#010+
' begin'#010+
' ResolveFileNames(APackage,ICPU,IOS,false);'#010+
' APackage.GetArchiveFiles(L,',' ICPU, IOS);'#010+
' end;'#010+
' //from sources'#010+
' for i := 0 to APackage.Sources.Count-1 do'#010+
' L.Add(APackage.Sources[i].Name);'#010+
#010+
' //show all files'#010+
' for i := 0 to L.Count-1 do'#010+
' Log(vlDebug, Format(SDbgArchivingFi','le, [L[i]]));'#010+
#010+
'{$ifdef HAS_UNIT_ZIPPER}'#010+
' if not Assigned(ArchiveFilesProc) then'#010+
' begin'#010+
' FZipFile := TZipper.Create;'#010+
' FZipFile.ZipFiles(A, L);'#010+
' end'#010+
' else'#010+
'{$endif HAS_UNIT_ZIPPER}'#010+
' CmdArchiveFi','les(L,A);'#010+
' Finally'#010+
' L.Free;'#010+
#010+
'{$ifdef HAS_UNIT_ZIPPER}'#010+
' if not Assigned(ArchiveFilesProc) then'#010+
' FreeAndNil(FZipFile);'#010+
'{$endif HAS_UNIT_ZIPPER}'#010+
' end;'#010+
' DoAfterArchive(Apackage);'#010+
' Finally'#010+
' If (APackage.Directory<>'#039,#039') then'#010+
' EnterDir('#039#039');'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.DoBeforeClean(APackage: TPackage);'#010+
'begin'#010+
' ExecuteCommands(APackage.Commands,caBeforeClean);'#010+
' If Assigned(APackage.BeforeClean) then'#010+
' APackage.BeforeClean(APackage);'#010+
'end;'#010,
#010+
#010+
'procedure TBuildEngine.DoAfterClean(APackage: TPackage);'#010+
'begin'#010+
' If Assigned(APackage.AfterClean) then'#010+
' APackage.AfterClean(APackage);'#010+
' ExecuteCommands(APackage.Commands,caAfterClean);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Clean(APackage: TPa','ckage);'#010+
'Var'#010+
' List : TStringList;'#010+
'begin'#010+
' Log(vlInfo,SInfoCleaningPackage,[APackage.Name]);'#010+
' try'#010+
' If (APackage.Directory<>'#039#039') then'#010+
' EnterDir(APackage.Directory);'#010+
' DoBeforeClean(Apackage);'#010+
' List:=TStringList.Create;'#010+
' try'#010+
' ',' APackage.GetCleanFiles(List,Defaults.CPU,Defaults.OS);'#010+
' if (List.Count>0) then'#010+
' CmdDeleteFiles(List);'#010+
' Finally'#010+
' List.Free;'#010+
' end;'#010+
' DoAfterClean(Apackage);'#010+
' Finally'#010+
' If (APackage.Directory<>'#039#039') then'#010+
' Ent','erDir('#039#039');'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'Procedure TBuildEngine.Manifest(APackage : TPackage);'#010+
'Var'#010+
' L : TStrings;'#010+
' PD,'#010+
' MF : String;'#010+
'begin'#010+
' L:=TStringList.Create;'#010+
' Try'#010+
' Log(vlInfo, Format(SInfoManifestPackage,[APackage.Name]));'#010+
' PD:=APackage.Dir','ectory;'#010+
' if PD<>'#039#039' then'#010+
' PD:=IncludeTrailingPathDelimiter(PD);'#010+
' MF:=PD+ManifestFile;'#010+
' Log(vlDebug, Format(SDbgGenerating, [MF]));'#010+
' L.Add('#039'<?xml version="1.0"?>'#039');'#010+
' L.Add('#039'<packages>'#039');'#010+
' APackage.GetManifest(L);'#010+
' L.','Add('#039'</packages>'#039');'#010+
' L.SaveToFile(MF);'#010+
' Finally'#010+
' L.Free;'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Compile(Packages: TPackages);'#010+
'Var'#010+
' I : Integer;'#010+
' P : TPackage;'#010+
'begin'#010+
' If Assigned(BeforeCompile) then'#010+
' BeforeCompile(Self);'#010+
' For I:=','0 to Packages.Count-1 do'#010+
' begin'#010+
' P:=Packages.PackageItems[i];'#010+
' If PackageOK(P) then'#010+
' MaybeCompile(P);'#010+
' end;'#010+
' If Assigned(AfterCompile) then'#010+
' AfterCompile(Self);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Install(Packages: TPac','kages);'#010+
'Var'#010+
' I : Integer;'#010+
' P : TPackage;'#010+
'begin'#010+
' If Assigned(BeforeInstall) then'#010+
' BeforeInstall(Self);'#010+
' For I:=0 to Packages.Count-1 do'#010+
' begin'#010+
' P:=Packages.PackageItems[i];'#010+
' If PackageOK(P) then'#010+
' Install(P);'#010+
' en','d;'#010+
' If Assigned(AfterInstall) then'#010+
' AfterInstall(Self);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Archive(Packages: TPackages);'#010+
'Var'#010+
' I : Integer;'#010+
' P : TPackage;'#010+
'begin'#010+
' If Assigned(BeforeArchive) then'#010+
' BeforeArchive(Self);'#010+
' Log(vlDebug, SDbgB','uildEngineArchiving);'#010+
' For I:=0 to Packages.Count-1 do'#010+
' begin'#010+
' P:=Packages.PackageItems[i];'#010+
' Archive(P);'#010+
' end;'#010+
' If Assigned(AfterArchive) then'#010+
' AfterArchive(Self);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Manifest(Packages: TPacka','ges);'#010+
'Var'#010+
' I : Integer;'#010+
' P : TPackage;'#010+
'begin'#010+
' If Assigned(BeforeManifest) then'#010+
' BeforeManifest(Self);'#010+
' Log(vlDebug, SDbgBuildEngineGenerateManifests);'#010+
' For I:=0 to Packages.Count-1 do'#010+
' begin'#010+
' P:=Packages.PackageItems[i];'#010+
' ',' Manifest(P);'#010+
' end;'#010+
' If Assigned(AfterManifest) then'#010+
' AfterManifest(Self);'#010+
'end;'#010+
#010+
#010+
'procedure TBuildEngine.Clean(Packages: TPackages);'#010+
'Var'#010+
' I : Integer;'#010+
' P : TPackage;'#010+
'begin'#010+
' If Assigned(BeforeClean) then'#010+
' BeforeClean(Self);'#010+
' ','Log(vldebug, SDbgBuildEngineCleaning);'#010+
' For I:=0 to Packages.Count-1 do'#010+
' begin'#010+
' P:=Packages.PackageItems[i];'#010+
' If PackageOK(P) then'#010+
' Clean(P);'#010+
' end;'#010+
' If Assigned(AfterClean) then'#010+
' AfterClean(Self);'#010+
'end;'#010+
#010+
#010+
'{*************','******************************************************'+
'*********'#010+
' TFPVersion'#010+
'**********************************************************************'+
'******}'#010+
#010+
'function TFPVersion.GetAsString: String;'#010+
'begin'#010+
' if Emp','ty then'#010+
' Result:='#039'<none>'#039#010+
' else'#010+
' Result:=Format('#039'%d.%d.%d-%d'#039',[Major,Minor,Micro,Build]);'#010+
'end;'#010+
#010+
'function TFPVersion.GetEmpty: Boolean;'#010+
'begin'#010+
' Result:=(Major=0) and (Minor=0) and (Micro=0) and (Build=0);'#010+
'end;'#010+
#010+
'procedure TFPVersion.Se','tAsString(const AValue: String);'#010+
#010+
' Function NextDigit(sep : Char; var V : string) : integer;'#010+
#010+
' Var'#010+
' P : Integer;'#010+
#010+
' begin'#010+
' P:=Pos(Sep,V);'#010+
' If (P=0) then'#010+
' P:=Length(V)+1;'#010+
' Result:=StrToIntDef(Copy(V,1,P-1),-1);'#010+
' If Resu','lt<>-1 then'#010+
' Delete(V,1,P)'#010+
' else'#010+
' Result:=0;'#010+
' end;'#010+
#010+
'Var'#010+
' V : String;'#010+
'begin'#010+
' Clear;'#010+
' // Special support for empty version string'#010+
' if (AValue='#039#039') or (AValue='#039'<none>'#039') then'#010+
' exit;'#010+
' V:=AValue;'#010+
' Major:=NextDigit('#039'.'#039',V);'#010+
' ','Minor:=NextDigit('#039'.'#039',V);'#010+
' Micro:=NextDigit('#039'-'#039',V);'#010+
' Build:=NextDigit(#0,V);'#010+
'end;'#010+
#010+
'procedure TFPVersion.Clear;'#010+
'begin'#010+
' Micro:=0;'#010+
' Major:=0;'#010+
' Minor:=0;'#010+
' Build:=0;'#010+
'end;'#010+
#010+
'procedure TFPVersion.Assign(Source: TPersistent);'#010+
#010+
'Var'#010+
' V : TFPVers','ion;'#010+
#010+
'begin'#010+
' if Source is TFPVersion then'#010+
' begin'#010+
' V:=Source as TFPVersion;'#010+
' Major:=V.Major;'#010+
' Minor:=V.Minor;'#010+
' Micro:=V.Micro;'#010+
' Build:=V.Build;'#010+
' end'#010+
' else'#010+
' inherited Assign(Source);'#010+
'end;'#010+
#010+
'function TFPVersion.Compare','Version(AVersion: TFPVersion): Integer;'#010+
'begin'#010+
' Result:=Major-AVersion.Major;'#010+
' If (Result=0) then'#010+
' begin'#010+
' Result:=Minor-AVersion.Minor;'#010+
' if (Result=0) then'#010+
' begin'#010+
' Result:=Micro-AVersion.Micro;'#010+
' If (Re','sult=0) then'#010+
' Result:=Build-AVersion.Build;'#010+
' end;'#010+
' end;'#010+
'end;'#010+
#010+
'function TFPVersion.SameVersion(AVersion: TFPVersion): Boolean;'#010+
'begin'#010+
' Result:=CompareVersion(AVersion)=0;'#010+
'end;'#010+
#010+
#010+
'{*****************************************','**************************'+
'*********'#010+
' TTarget'#010+
'**********************************************************************'+
'******}'#010+
#010+
'constructor TTarget.Create(ACollection: TCollection);'#010+
'begin'#010+
' inherited Create(AColl','ection);'#010+
' FInstall:=True;'#010+
' FCPUs:=AllCPUs;'#010+
' FOSes:=AllOSes;'#010+
' FUnitPath:=TConditionalStrings.Create(TConditionalString);'#010+
' FIncludePath:=TConditionalStrings.Create(TConditionalString);'#010+
' FObjectPath:=TConditionalStrings.Create(TCondition','alString);'#010+
' FDependencies:=TDependencies.Create(TDependency);'#010+
' FCommands:=TCOmmands.Create(TCommand);'#010+
'end;'#010+
#010+
#010+
'destructor TTarget.Destroy;'#010+
'begin'#010+
' FreeAndNil(FUnitPath);'#010+
' FreeAndNil(FObjectPath);'#010+
' FreeAndNil(FIncludePath);'#010+
' FreeAndNil(FD','ependencies);'#010+
' FreeAndNil(FCommands);'#010+
' inherited Destroy;'#010+
'end;'#010+
#010+
#010+
'function TTarget.GetSourceFileName: String;'#010+
'begin'#010+
' Result:=Name+FExtension;'#010+
'end;'#010+
#010+
#010+
'function TTarget.GetUnitFileName: String;'#010+
'begin'#010+
' Result:=Name+UnitExt;'#010+
'end;'#010+
#010+
#010+
'function T','Target.GetObjectFileName: String;'#010+
'begin'#010+
' Result:=Name+ObjExt;'#010+
'end;'#010+
#010+
#010+
'function TTarget.GetRSTFileName: String;'#010+
'begin'#010+
' Result:=Name+RSText;'#010+
'end;'#010+
#010+
#010+
'function TTarget.GetProgramFileName(AOS : TOS): String;'#010+
'begin'#010+
' if AOS in [Go32v2,Win32,Win64',',OS2] then'#010+
' Result:=Name+ExeExt'#010+
' else'#010+
' Result:=Name;'#010+
'end;'#010+
#010+
#010+
'function TTarget.GetOutputFileName(AOs: TOS): String;'#010+
'begin'#010+
' if TargetType in UnitTargets then'#010+
' Result:=GetUnitFileName'#010+
' else'#010+
' Result:=GetProgramFileName(AOs);'#010+
'end;'#010,
#010+
#010+
'procedure TTarget.SetName(const AValue: String);'#010+
'Var'#010+
' D,N,E : String;'#010+
'begin'#010+
' N:=FixPath(AValue);'#010+
' D:=ExtractFilePath(N);'#010+
' E:=ExtractFileExt(N);'#010+
' N:=ExtractFileName(N);'#010+
' inherited SetName(Copy(N,1,Length(N)-Length(E)));'#010+
' FExtension:','=E;'#010+
' FDirectory:=D;'#010+
'end;'#010+
#010+
#010+
'procedure TTarget.GetCleanFiles(List: TStrings; const APrefixU, APrefi'+
'xB : String; ACPU: TCPU; AOS : TOS);'#010+
'begin'#010+
' If not(ACPU in CPUs) or not(AOS in OSes) then'#010+
' exit;'#010+
' List.Add(APrefixU + ObjectFileName);'#010+
' ','If (TargetType in [ttUnit,ttImplicitUnit,ttExampleUnit, ttCleanOnl'+
'yUnit]) then'#010+
' List.Add(APrefixU + UnitFileName)'#010+
' else If (TargetType in [ttProgram,ttExampleProgram]) then'#010+
' List.Add(APrefixB + GetProgramFileName(AOS));'#010+
' If Resource','Strings then'#010+
' List.Add(APrefixU + RSTFileName);'#010+
' // Maybe add later ? AddConditionalStrings(List,CleanFiles);'#010+
'end;'#010+
#010+
#010+
'procedure TTarget.GetInstallFiles(List: TStrings; const APrefixU, APre'+
'fixB: String; ACPU: TCPU; AOS : TOS);'#010+
'begin'#010+
' If',' not(ACPU in CPUs) or not(AOS in OSes) then'#010+
' exit;'#010+
' If Not (TargetType in [ttProgram,ttExampleProgram]) then'#010+
' List.Add(APrefixU + ObjectFileName);'#010+
' If (TargetType in [ttUnit,ttImplicitUnit,ttExampleUnit]) then'#010+
' List.Add(APrefixU ','+ UnitFileName)'#010+
' else If (TargetType in [ttProgram,ttExampleProgram]) then'#010+
' List.Add(APrefixB + GetProgramFileName(AOS));'#010+
' If ResourceStrings then'#010+
' List.Add(APrefixU + RSTFileName);'#010+
' // Maybe add later ? AddConditionalStrings(List',',InstallFiles);'#010+
'end;'#010+
#010+
#010+
'procedure TTarget.GetArchiveFiles(List: TStrings; ACPU: TCPU; AOS : TO'+
'S);'#010+
'var'#010+
' i : integer;'#010+
' D : TDependency;'#010+
'begin'#010+
' If not(ACPU in CPUs) or not(AOS in OSes) then'#010+
' exit;'#010+
' // Main source'#010+
' if TargetSourceFileNam','e<>'#039#039' then'#010+
' List.Add(TargetSourceFileName);'#010+
' // Includes'#010+
' for i:=0 to Dependencies.Count-1 do'#010+
' begin'#010+
' D:=Dependencies[i];'#010+
' if (D.DependencyType=depInclude) and'#010+
' (D.TargetFileName<>'#039#039') then'#010+
' List.Add(D.Target','FileName);'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' TSource'#010+
'**********************************************************************'+
'******}'#010+
#010+
'constructor TSo','urce.Create(ACollection: TCollection);'#010+
'begin'#010+
' inherited Create(ACollection);'#010+
'end;'#010+
#010+
#010+
'destructor TSource.Destroy;'#010+
'begin'#010+
' inherited Destroy;'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' ',' TCommands'#010+
'**********************************************************************'+
'******}'#010+
#010+
'function TCommands.GetCommand(const Dest : String): TCommand;'#010+
'begin'#010+
' Result:=TCommand(ItemByName(Dest));'#010+
'end;'#010+
#010+
'function TCommands.Ge','tCommandItem(Index : Integer): TCommand;'#010+
'begin'#010+
' Result:=TCommand(Items[Index]);'#010+
'end;'#010+
#010+
#010+
'procedure TCommands.SetCommandItem(Index : Integer; const AValue: TCom'+
'mand);'#010+
'begin'#010+
' Items[Index]:=AValue;'#010+
'end;'#010+
#010+
#010+
'Function TCommands.AddCommand(const Cm','d: String) : TCommand;'#010+
'begin'#010+
' Result:=AddCommand(fdefaultAt,Cmd,'#039#039','#039#039','#039#039');'#010+
'end;'#010+
#010+
#010+
'function TCommands.AddCommand(const Cmd, Options: String): TCommand;'#010+
'begin'#010+
' Result:=AddCommand(fdefaultAt,Cmd,Options,'#039#039','#039#039');'#010+
'end;'#010+
#010+
#010+
'function TCommands.AddC','ommand(const Cmd, Options, Dest, Source: Stri'+
'ng ): TCommand;'#010+
'begin'#010+
' Result:=AddCommand(fdefaultAt,Cmd,options,Dest,Source);'#010+
'end;'#010+
#010+
#010+
'Function TCommands.AddCommand(At: TCommandAt; const Cmd: String) : TCo'+
'mmand;'#010+
'begin'#010+
' Result:=AddCommand(At,C','md,'#039#039','#039#039','#039#039');'#010+
'end;'#010+
#010+
#010+
'function TCommands.AddCommand(At: TCommandAt; const Cmd, Options: Stri'+
'ng ): TCommand;'#010+
'begin'#010+
' Result:=AddCommand(At,Cmd,Options,'#039#039','#039#039');'#010+
'end;'#010+
#010+
#010+
'function TCommands.AddCommand(At: TCommandAt; const Cmd, Options, Dest'+
', Sou','rce: String): TCommand;'#010+
'begin'#010+
' Result:=Add as TCommand;'#010+
' Result.Command:=Cmd;'#010+
' Result.Options:=Options;'#010+
' Result.At:=At;'#010+
' Result.SourceFile:=Source;'#010+
' Result.DestFile:=Dest;'#010+
'end;'#010+
#010+
#010+
'{******************************************************','*************'+
'*********'#010+
' TConditionalString'#010+
'**********************************************************************'+
'******}'#010+
#010+
'Constructor TConditionalString.Create;'#010+
'begin'#010+
' inherited Create;'#010+
'end;'#010+
#010+
#010+
'{*******************','************************************************'+
'*********'#010+
' TConditionalStrings'#010+
'**********************************************************************'+
'******}'#010+
#010+
'Constructor TConditionalStrings.Create(AClass:TCondition','alStringClas'+
's);'#010+
'begin'#010+
' inherited Create;'#010+
' FCSClass:=AClass;'#010+
'end;'#010+
#010+
#010+
'function TConditionalStrings.GetConditionalString(Index : Integer): TC'+
'onditionalString;'#010+
'begin'#010+
' Result:=TConditionalString(Items[Index]);'#010+
'end;'#010+
#010+
#010+
'procedure TConditionalStri','ngs.SetConditionalString(Index : Integer; '+
'const AValue: TConditionalString);'#010+
'begin'#010+
' Items[Index]:=AValue;'#010+
'end;'#010+
#010+
#010+
'Function TConditionalStrings.Add(Const Value : String) : TConditionalS'+
'tring;'#010+
'begin'#010+
' result:=Add(Value,AllCPUs,AllOSes);'#010+
'end;'#010,
#010+
#010+
'{$ifdef cpu_only_overloads}'#010+
'Function TConditionalStrings.Add(Const Value : String;const CPUs:TCPUs'+
') : TConditionalString;'#010+
'begin'#010+
' result:=Add(Value,CPUs,AllOSes);'#010+
'end;'#010+
'{$endif cpu_only_overloads}'#010+
#010+
#010+
'Function TConditionalStrings.Add(Const V','alue : String;const OSes:TOS'+
'es) : TConditionalString;'#010+
'begin'#010+
' result:=Add(Value,AllCPUs,OSes);'#010+
'end;'#010+
#010+
#010+
'Function TConditionalStrings.Add(Const Value : String;const CPUs:TCPUs'+
';const OSes:TOSes) : TConditionalString;'#010+
'begin'#010+
' Result:=FCSClass.Cr','eate;'#010+
' Result.Value:=Value;'#010+
' Result.OSes:=OSes;'#010+
' Result.CPUs:=CPUs;'#010+
' inherited Add(Result);'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' TDependency'#010+
'***************','*****************************************************'+
'********}'#010+
#010+
'Constructor TDependency.Create;'#010+
'begin'#010+
' inherited Create;'#010+
' FVersion:=TFPVersion.Create;'#010+
'end;'#010+
#010+
#010+
'Destructor TDependency.Destroy;'#010+
'begin'#010+
' FreeAndNil(FVersion);'#010+
'end;'#010+
#010+
#010+
'Function TD','ependency.GetVersion : string;'#010+
'begin'#010+
' result:=FVersion.AsString;'#010+
'end;'#010+
#010+
#010+
'Procedure TDependency.SetVersion(const V : string);'#010+
'begin'#010+
' FVersion.AsString:=V;'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010,
' TDependencies'#010+
'**********************************************************************'+
'******}'#010+
#010+
'function TDependencies.GetDependency(Index : Integer): TDependency;'#010+
'begin'#010+
' Result:=TDependency(Items[Index]);'#010+
'end;',#010+
#010+
#010+
'procedure TDependencies.SetDependency(Index : Integer; const AValue: T'+
'Dependency);'#010+
'begin'#010+
' Items[Index]:=AValue;'#010+
'end;'#010+
#010+
#010+
'Function TDependencies.Add(Const Value : String) : TDependency;'#010+
'begin'#010+
' result:=Add(Value,AllCPUs,AllOSes);'#010+
'end;'#010+
#010+
#010+
'{$','ifdef cpu_only_overloads}'#010+
'Function TDependencies.Add(Const Value : String;const CPUs:TCPUs) : TD'+
'ependency;'#010+
'begin'#010+
' result:=Add(Value,CPUs,AllOSes);'#010+
'end;'#010+
'{$endif cpu_only_overloads}'#010+
#010+
#010+
'Function TDependencies.Add(Const Value : String;const OSe','s:TOSes) : '+
'TDependency;'#010+
'begin'#010+
' result:=Add(Value,AllCPUs,OSes);'#010+
'end;'#010+
#010+
#010+
'Function TDependencies.Add(Const Value : String;const CPUs:TCPUs;const'+
' OSes:TOSes) : TDependency;'#010+
'begin'#010+
' Result:=inherited Add(Value,CPUs,OSes) as TDependency;'#010+
' Resul','t.Target:=nil;'#010+
' Result.FDependencyType:=depPackage;'#010+
'end;'#010+
#010+
#010+
'Function TDependencies.AddUnit(Const Value : String) : TDependency;'#010+
'begin'#010+
' result:=AddUnit(Value,AllCPUs,AllOSes);'#010+
'end;'#010+
#010+
#010+
'{$ifdef cpu_only_overloads}'#010+
'Function TDependencies.AddUni','t(Const Value : String;const CPUs:TCPUs'+
') : TDependency;'#010+
'begin'#010+
' result:=AddUnit(Value,CPUs,AllOSes);'#010+
'end;'#010+
'{$endif cpu_only_overloads}'#010+
#010+
#010+
'Function TDependencies.AddUnit(Const Value : String;const OSes:TOSes) '+
': TDependency;'#010+
'begin'#010+
' result:=Add','Unit(Value,AllCPUs,OSes);'#010+
'end;'#010+
#010+
#010+
'Function TDependencies.AddUnit(Const Value : String;const CPUs:TCPUs;c'+
'onst OSes:TOSes) : TDependency;'#010+
'begin'#010+
' Result:=inherited Add(Value,CPUs,OSes) as TDependency;'#010+
' Result.Target:=nil;'#010+
' Result.FDependency','Type:=depUnit;'#010+
'end;'#010+
#010+
#010+
'Function TDependencies.AddInclude(Const Value : String) : TDependency;'+
#010+
'begin'#010+
' result:=AddInclude(Value,AllCPUs,AllOSes);'#010+
'end;'#010+
#010+
#010+
'{$ifdef cpu_only_overloads}'#010+
'Function TDependencies.AddInclude(Const Value : String;const ','CPUs:TC'+
'PUs) : TDependency;'#010+
'begin'#010+
' result:=AddInclude(Value,CPUs,AllOSes);'#010+
'end;'#010+
'{$endif cpu_only_overloads}'#010+
#010+
#010+
'Function TDependencies.AddInclude(Const Value : String;const OSes:TOSe'+
's) : TDependency;'#010+
'begin'#010+
' result:=AddInclude(Value,AllCPUs,O','Ses);'#010+
'end;'#010+
#010+
#010+
'Function TDependencies.AddInclude(Const Value : String;const CPUs:TCPU'+
's;const OSes:TOSes) : TDependency;'#010+
'Var'#010+
' N : String;'#010+
'begin'#010+
' N:=FixPath(Value);'#010+
' if ExtractFileExt(N)='#039#039' then'#010+
' ChangeFileExt(N,IncExt);'#010+
' Result:=inherit','ed Add(N,CPUs,OSes) as TDependency;'#010+
' Result.FDependencyType:=depInclude;'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' TValueItem'#010+
'***************************************','*****************************'+
'********}'#010+
#010+
'constructor TValueItem.Create(AValue: String);'#010+
'begin'#010+
' FValue:=AValue;'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'*******'#010+
' TFunctionItem'#010,
'**********************************************************************'+
'******}'#010+
#010+
'constructor TFunctionItem.Create(AFunc: TReplaceFunction);'#010+
'begin'#010+
' FFunc:=AFunc;'#010+
'end;'#010+
#010+
#010+
'{*********************************************************************'+
'***','****'#010+
' TDictionary'#010+
'**********************************************************************'+
'******}'#010+
#010+
'constructor TDictionary.Create(AOwner: TComponent);'#010+
'begin'#010+
' inherited Create(AOwner);'#010+
' FList:=TStringList.Crea','te;'#010+
' FList.Sorted:=True;'#010+
' FList.Duplicates:=dupError;'#010+
'end;'#010+
#010+
#010+
'destructor TDictionary.Destroy;'#010+
'Var'#010+
' I : Integer;'#010+
'begin'#010+
' For I:=0 to Flist.Count-1 do'#010+
' FList.Objects[i].Free;'#010+
' FreeAndNil(FList);'#010+
' inherited Destroy;'#010+
'end;'#010+
#010+
#010+
'procedure TDi','ctionary.AddVariable(const AName, Value: String);'#010+
'Var'#010+
' I : Integer;'#010+
'begin'#010+
' I:=Flist.IndexOf(AName);'#010+
' If I=-1 then'#010+
' I:=FList.Add(Aname)'#010+
' else'#010+
' Flist.Objects[i].Free;'#010+
' Flist.Objects[i]:=TValueItem.Create(Value);'#010+
'end;'#010+
#010+
#010+
'procedure TD','ictionary.AddFunction(const AName: String; FReplacement:'+
' TReplaceFunction);'#010+
'Var'#010+
' I : Integer;'#010+
'begin'#010+
' I:=Flist.IndexOf(AName);'#010+
' If I=-1 then'#010+
' I:=Flist.Add(AName)'#010+
' else'#010+
' Flist.Objects[i].Free;'#010+
' Flist.Objects[i]:=TFunctionItem.Creat','e(FReplacement);'#010+
'end;'#010+
#010+
#010+
'procedure TDictionary.RemoveItem(const AName: String);'#010+
'Var'#010+
' I : Integer;'#010+
'begin'#010+
' I:=Flist.IndexOf(AName);'#010+
' If (I<>-1) then'#010+
' begin'#010+
' FList.Objects[i].Free;'#010+
' FList.Delete(I);'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'function TDiction','ary.GetValue(const AName: String): String;'#010+
'begin'#010+
' Result:=GetValue(AName,'#039#039');'#010+
'end;'#010+
#010+
#010+
'function TDictionary.GetValue(const AName,Args: String): String;'#010+
'Var'#010+
' O : TObject;'#010+
' I : Integer;'#010+
'begin'#010+
' I:=Flist.IndexOf(AName);'#010+
' If (I=-1) then'#010+
' R','aise EDictionaryError.CreateFmt(SErrNoDictionaryItem,[AName]);'#010+
' O:=Flist.Objects[I];'#010+
' If O is TValueItem then'#010+
' Result:=TValueItem(O).FValue'#010+
' else'#010+
' Result:=TFunctionItem(O).FFunc(AName,Args);'#010+
'end;'#010+
#010+
#010+
'function TDictionary.ReplaceStrin','gs(Const ASource: String): String;'#010+
'Var'#010+
' S,FN,FV : String;'#010+
' P: Integer;'#010+
'begin'#010+
' Result:='#039#039';'#010+
' S:=ASource;'#010+
' P:=Pos('#039'$('#039',S);'#010+
' While (P<>0) do'#010+
' begin'#010+
' Result:=Result+Copy(S,1,P-1);'#010+
' Delete(S,1,P+1);'#010+
' P:=Pos('#039')'#039',S);'#010+
' F','N:=Copy(S,1,P-1);'#010+
' Delete(S,1,P);'#010+
' P:=Pos('#039' '#039',FN);'#010+
' If (P<>0) then // function arguments ?'#010+
' begin'#010+
' FV:=FN;'#010+
' FN:=Copy(FN,1,P);'#010+
' System.Delete(FV,1,P);'#010+
' end'#010+
' else'#010+
' FV:='#039#039';'#010+
' Re','sult:=Result+GetValue(FN,FV);'#010+
' P:=Pos('#039'$('#039',S);'#010+
' end;'#010+
' Result:=Result+S;'#010+
'end;'#010+
#010+
#010+
'Function Substitute(Const Source : String; Macros : Array of string) :'+
' String;'#010+
'Var'#010+
' I : Integer;'#010+
'begin'#010+
' I:=0;'#010+
' While I<High(Macros) do'#010+
' begin'#010+
' ',' Dictionary.AddVariable(Macros[i],Macros[I+1]);'#010+
' Inc(I,2);'#010+
' end;'#010+
' Result:=Dictionary.ReplaceStrings(Source);'#010+
' While I<High(Macros) do'#010+
' begin'#010+
' Dictionary.RemoveItem(Macros[i]);'#010+
' Inc(I,2);'#010+
' end;'#010+
'end;'#010+
#010+
#010+
'{************','*******************************************************'+
'*********'#010+
' Default Instances'#010+
'**********************************************************************'+
'******}'#010+
#010+
'var'#010+
' DefInstaller : TCustomInstaller;'#010+
#010+
'Funct','ion Installer(InstallerClass: TInstallerClass): TCustomInstalle'+
'r;'#010+
'begin'#010+
' If Not Assigned(DefInstaller) then'#010+
' DefInstaller:=InstallerClass.Create(Nil);'#010+
' Result:=DefInstaller;'#010+
'end;'#010+
#010+
#010+
'Function Installer: TCustomInstaller;'#010+
'begin'#010+
' Result :','= Installer(TFPCInstaller);'#010+
'end;'#010+
#010+
#010+
'Initialization'#010+
' OnGetApplicationName:=@GetFPMakeName;'#010+
#010+
'Finalization'#010+
' FreeAndNil(DefInstaller);'#010+
' FreeAndNil(Dictionary);'#010+
' FreeAndNil(Defaults);'#010+
'end.'#010
);