|
@@ -347,7 +347,7 @@ Type
|
|
Public
|
|
Public
|
|
Constructor Create(ACollection : TCollection); override;
|
|
Constructor Create(ACollection : TCollection); override;
|
|
Destructor Destroy; override;
|
|
Destructor Destroy; override;
|
|
- Function GetOutputFileName (AOs : TOS) : String; Virtual;
|
|
|
|
|
|
+ Function GetOutputFileName (AOs : TOS) : String; Virtual;
|
|
procedure SetName(const AValue: String);override;
|
|
procedure SetName(const AValue: String);override;
|
|
Procedure GetCleanFiles(List : TStrings; const APrefixU, APrefixB : String; ACPU:TCPU; AOS : TOS); virtual;
|
|
Procedure GetCleanFiles(List : TStrings; const APrefixU, APrefixB : String; ACPU:TCPU; AOS : TOS); virtual;
|
|
Procedure GetInstallFiles(List : TStrings; const APrefixU, APrefixB: String; ACPU:TCPU; AOS : TOS); virtual;
|
|
Procedure GetInstallFiles(List : TStrings; const APrefixU, APrefixB: String; ACPU:TCPU; AOS : TOS); virtual;
|
|
@@ -503,8 +503,10 @@ Type
|
|
Public
|
|
Public
|
|
constructor Create(ACollection: TCollection); override;
|
|
constructor Create(ACollection: TCollection); override;
|
|
destructor destroy; override;
|
|
destructor destroy; override;
|
|
- Procedure GetCleanFiles(List : TStrings; Const APrefixU, APrefixB : String; ACPU:TCPU; AOS : TOS); virtual;
|
|
|
|
- procedure GetInstallFiles(List: TStrings;Types : TTargetTypes;Const APrefix, APrefixU, APrefixB: String; ACPU:TCPU; AOS : TOS);
|
|
|
|
|
|
+ Function GetUnitsOutputDir(ACPU:TCPU; AOS : TOS):String;
|
|
|
|
+ Function GetBinOutputDir(ACPU:TCPU; AOS : TOS) : String;
|
|
|
|
+ Procedure GetCleanFiles(List : TStrings; ACPU:TCPU; AOS : TOS); virtual;
|
|
|
|
+ procedure GetInstallFiles(List: TStrings;Types : TTargetTypes;ACPU:TCPU; AOS : TOS);
|
|
Procedure GetArchiveFiles(List : TStrings; ACPU:TCPU; AOS : TOS); virtual;
|
|
Procedure GetArchiveFiles(List : TStrings; ACPU:TCPU; AOS : TOS); virtual;
|
|
Procedure GetManifest(Manifest : TStrings);
|
|
Procedure GetManifest(Manifest : TStrings);
|
|
Property Version : String Read FVersion Write FVersion;
|
|
Property Version : String Read FVersion Write FVersion;
|
|
@@ -659,7 +661,6 @@ Type
|
|
// general variables
|
|
// general variables
|
|
FCompiler : String;
|
|
FCompiler : String;
|
|
FStartDir : String;
|
|
FStartDir : String;
|
|
- FTargetDir : String;
|
|
|
|
FForceCompile : Boolean;
|
|
FForceCompile : Boolean;
|
|
FListMode : Boolean;
|
|
FListMode : Boolean;
|
|
{$ifdef HAS_UNIT_ZIPPER}
|
|
{$ifdef HAS_UNIT_ZIPPER}
|
|
@@ -680,7 +681,6 @@ Type
|
|
FBeforeCompile: TNotifyEvent;
|
|
FBeforeCompile: TNotifyEvent;
|
|
FBeforeInstall: TNotifyEvent;
|
|
FBeforeInstall: TNotifyEvent;
|
|
FBeforeManifest: TNotifyEvent;
|
|
FBeforeManifest: TNotifyEvent;
|
|
- procedure SetTargetDir(const AValue: String);
|
|
|
|
Protected
|
|
Protected
|
|
Procedure Error(const Msg : String);
|
|
Procedure Error(const Msg : String);
|
|
Procedure Error(const Fmt : String; const Args : Array of const);
|
|
Procedure Error(const Fmt : String; const Args : Array of const);
|
|
@@ -699,12 +699,11 @@ Type
|
|
Function GetCompiler : String;
|
|
Function GetCompiler : String;
|
|
Function InstallPackageFiles(APAckage : TPackage; tt : TTargetType; Const Dest : String):Boolean;
|
|
Function InstallPackageFiles(APAckage : TPackage; tt : TTargetType; Const Dest : String):Boolean;
|
|
Function FileNewer(const Src,Dest : String) : Boolean;
|
|
Function FileNewer(const Src,Dest : String) : Boolean;
|
|
- Procedure LogSearchPath(const ASearchPathName:string;Path:TConditionalStrings; ACPU:TCPU;AOS:TOS;Const PathPrefix :String='');
|
|
|
|
- Function FindFileInPath(Path:TConditionalStrings; AFileName:String; var FoundPath:String;ACPU:TCPU;AOS:TOS; Const PathPrefix :String=''):Boolean;
|
|
|
|
|
|
+ Procedure LogSearchPath(const ASearchPathName:string;Path:TConditionalStrings; ACPU:TCPU;AOS:TOS);
|
|
|
|
+ Function FindFileInPath(Path:TConditionalStrings; AFileName:String; var FoundPath:String;ACPU:TCPU;AOS:TOS):Boolean;
|
|
|
|
|
|
//package commands
|
|
//package commands
|
|
- Procedure ResolveFileNames(APackage : TPackage; ACPU:TCPU;AOS:TOS);
|
|
|
|
- Function GetOutputDir(AName: string; APackage : TPackage; AbsolutePath : Boolean = False) : String;
|
|
|
|
|
|
+ Procedure ResolveFileNames(APackage : TPackage; ACPU:TCPU;AOS:TOS;DoChangeDir:boolean=true);
|
|
function GetUnitDir(APackage:TPackage):String;
|
|
function GetUnitDir(APackage:TPackage):String;
|
|
procedure AddDependencyIncludePaths(L:TStrings;ATarget: TTarget);
|
|
procedure AddDependencyIncludePaths(L:TStrings;ATarget: TTarget);
|
|
procedure AddDependencyUnitPaths(L:TStrings;APackage: TPackage);
|
|
procedure AddDependencyUnitPaths(L:TStrings;APackage: TPackage);
|
|
@@ -722,7 +721,6 @@ Type
|
|
// Dependency commands
|
|
// Dependency commands
|
|
Function DependencyOK(ADependency : TDependency) : Boolean;
|
|
Function DependencyOK(ADependency : TDependency) : Boolean;
|
|
// Target commands
|
|
// Target commands
|
|
- Function GetTargetDir(APackage : TPackage; ATarget : TTarget; AbsolutePath : Boolean = False) : String;
|
|
|
|
Function GetCompilerCommand(APackage : TPackage; ATarget : TTarget) : String;
|
|
Function GetCompilerCommand(APackage : TPackage; ATarget : TTarget) : String;
|
|
Function TargetOK(ATarget : TTarget) : Boolean;
|
|
Function TargetOK(ATarget : TTarget) : Boolean;
|
|
Function NeedsCompile(APackage:TPackage; ATarget : TTarget) : Boolean;
|
|
Function NeedsCompile(APackage:TPackage; ATarget : TTarget) : Boolean;
|
|
@@ -730,9 +728,9 @@ Type
|
|
Procedure MaybeCompile(APackage:TPackage; ATarget: TTarget);
|
|
Procedure MaybeCompile(APackage:TPackage; ATarget: TTarget);
|
|
Procedure CompileDependencies(APackage:TPackage; ATarget: TTarget);
|
|
Procedure CompileDependencies(APackage:TPackage; ATarget: TTarget);
|
|
// Package commands
|
|
// Package commands
|
|
- Function GetPackageDir(APackage : TPackage; AbsolutePath : Boolean = False) : String;
|
|
|
|
|
|
+{ Function GetPackageDir(APackage : TPackage; AbsolutePath : Boolean = False) : String;
|
|
Function GetUnitsOutputDir(APackage : TPackage; AbsolutePath : Boolean = False) : String;
|
|
Function GetUnitsOutputDir(APackage : TPackage; AbsolutePath : Boolean = False) : String;
|
|
- Function GetBinOutputDir(APackage : TPackage; AbsolutePath : Boolean = False) : String;
|
|
|
|
|
|
+ Function GetBinOutputDir(APackage : TPackage; AbsolutePath : Boolean = False) : String; }
|
|
Function PackageOK(APackage : TPackage) : Boolean; virtual;
|
|
Function PackageOK(APackage : TPackage) : Boolean; virtual;
|
|
Procedure DoBeforeCompile(APackage : TPackage);virtual;
|
|
Procedure DoBeforeCompile(APackage : TPackage);virtual;
|
|
Procedure DoAfterCompile(APackage : TPackage);virtual;
|
|
Procedure DoAfterCompile(APackage : TPackage);virtual;
|
|
@@ -760,8 +758,6 @@ Type
|
|
Procedure GetManifest(Packages : TPackages; Manifest : TStrings);
|
|
Procedure GetManifest(Packages : TPackages; Manifest : TStrings);
|
|
Property ListMode : Boolean Read FListMode Write FListMode;
|
|
Property ListMode : Boolean Read FListMode Write FListMode;
|
|
Property ForceCompile : Boolean Read FForceCompile Write FForceCompile;
|
|
Property ForceCompile : Boolean Read FForceCompile Write FForceCompile;
|
|
-// Property Defaults : TCustomDefaults Read FDefaults Write SetDefaults;
|
|
|
|
- Property TargetDir : String Read FTargetDir Write SetTargetDir;
|
|
|
|
Property ExternalPackages: TPackages Read FExternalPackages;
|
|
Property ExternalPackages: TPackages Read FExternalPackages;
|
|
// Events
|
|
// Events
|
|
Property BeforeCompile : TNotifyEvent Read FBeforeCompile Write FBeforeCompile;
|
|
Property BeforeCompile : TNotifyEvent Read FBeforeCompile Write FBeforeCompile;
|
|
@@ -928,7 +924,8 @@ ResourceString
|
|
SErrDependencyNotFound = 'Could not find unit directory for dependency package "%s"';
|
|
SErrDependencyNotFound = 'Could not find unit directory for dependency package "%s"';
|
|
SErrAlreadyInitialized = 'Installer can only be initialized once';
|
|
SErrAlreadyInitialized = 'Installer can only be initialized once';
|
|
|
|
|
|
- SWarnCircularDependency = 'Warning: Circular dependency detected when compiling target %s with target %s';
|
|
|
|
|
|
+ SWarnCircularTargetDependency = 'Warning: Circular dependency detected when compiling target %s with target %s';
|
|
|
|
+ SWarnCircularPackageDependency = 'Warning: Circular dependency detected when compiling package %s with package %s';
|
|
SWarnFailedToSetTime = 'Warning: Failed to set timestamp on file "%s"';
|
|
SWarnFailedToSetTime = 'Warning: Failed to set timestamp on file "%s"';
|
|
SWarnFailedToGetTime = 'Warning: Failed to get timestamp from file "%s"';
|
|
SWarnFailedToGetTime = 'Warning: Failed to get timestamp from file "%s"';
|
|
SWarnFileDoesNotExist = 'Warning: File "%s" does not exist';
|
|
SWarnFileDoesNotExist = 'Warning: File "%s" does not exist';
|
|
@@ -937,7 +934,6 @@ ResourceString
|
|
SWarnIncludeFileNotFound = 'Warning: Include file "%s" not found for %s';
|
|
SWarnIncludeFileNotFound = 'Warning: Include file "%s" not found for %s';
|
|
SWarnDepUnitNotFound = 'Warning: Dependency on unit %s is not supported for %s';
|
|
SWarnDepUnitNotFound = 'Warning: Dependency on unit %s is not supported for %s';
|
|
|
|
|
|
- SInfoEnterDir = 'Entering directory "%s"';
|
|
|
|
SInfoCompilingPackage = 'Compiling package %s';
|
|
SInfoCompilingPackage = 'Compiling package %s';
|
|
SInfoCompilingTarget = 'Compiling target %s';
|
|
SInfoCompilingTarget = 'Compiling target %s';
|
|
SInfoExecutingCommand = 'Executing command "%s %s"';
|
|
SInfoExecutingCommand = 'Executing command "%s %s"';
|
|
@@ -973,6 +969,7 @@ ResourceString
|
|
SDbgDirectoryExists = 'Directory "%s" %s';
|
|
SDbgDirectoryExists = 'Directory "%s" %s';
|
|
SDbgFileExists = 'File "%s" %s';
|
|
SDbgFileExists = 'File "%s" %s';
|
|
SDbgSearchPath = 'Using %s path "%s"';
|
|
SDbgSearchPath = 'Using %s path "%s"';
|
|
|
|
+ SDbgEnterDir = 'Entering directory "%s"';
|
|
|
|
|
|
// Help messages for usage
|
|
// Help messages for usage
|
|
SValue = 'Value';
|
|
SValue = 'Value';
|
|
@@ -1860,68 +1857,45 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-Procedure TPackage.GetManifest(Manifest : TStrings);
|
|
|
|
-Var
|
|
|
|
- S : String;
|
|
|
|
- Release,Minor,Major : Word;
|
|
|
|
- i : Integer;
|
|
|
|
- D : TConditionalString;
|
|
|
|
|
|
+Function TPackage.GetUnitsOutputDir(ACPU:TCPU; AOS : TOS):String;
|
|
begin
|
|
begin
|
|
- With Manifest do
|
|
|
|
- begin
|
|
|
|
- Add(Format('<package name="%s">',[QuoteXml(Name)]));
|
|
|
|
- SplitVersion(Version,Release,Minor,Major,S);
|
|
|
|
- Add(Format('<version release="%d" major="%d" minor="%d" suffix="%s"/>',[Release,Minor,Major,QuoteXMl(S)]));
|
|
|
|
- Add(Format('<filename>%s</filename>',[QuoteXml(FileName + ZipExt)]));
|
|
|
|
- Add(Format('<author>%s</author>',[QuoteXml(Author)]));
|
|
|
|
- Add(Format('<license>%s</license>',[QuoteXml(License)]));
|
|
|
|
- if ExternalURL<>'' then
|
|
|
|
- Add(Format('<externalurl>%s</externalurl>',[QuoteXml(ExternalURL)]));
|
|
|
|
- Add(Format('<email>%s</email>',[QuoteXMl(Email)]));
|
|
|
|
- S:=Description;
|
|
|
|
- If (S<>'') then
|
|
|
|
- Add(Format('<description>%s</description>',[QuoteXML(S)]));
|
|
|
|
- If (Dependencies.Count>0) then
|
|
|
|
- begin
|
|
|
|
- Add('<dependencies>');
|
|
|
|
- for I:=0 to Dependencies.Count-1 do
|
|
|
|
- begin
|
|
|
|
- D:=Dependencies[i];
|
|
|
|
- S:='';
|
|
|
|
- if (D.OSes<>AllOSes) then
|
|
|
|
- S:=S+' os="'+OSesToString(D.OSes)+'"';
|
|
|
|
- if (D.CPUs<>AllCPUs) then
|
|
|
|
- S:=S+' cpu="'+CPUsToString(D.CPUs)+'"';
|
|
|
|
- Add(Format('<dependency><package%s packagename="%s"/></dependency>',[S,QuoteXML(D.Value)]));
|
|
|
|
- end;
|
|
|
|
- Add('</dependencies>');
|
|
|
|
- end;
|
|
|
|
- Add('</package>');
|
|
|
|
- end;
|
|
|
|
|
|
+ Result:='units'+PathDelim+MakeTargetString(ACPU,AOS);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-procedure TPackage.GetCleanFiles(List: TStrings; Const APrefixU, APrefixB : String; ACPU:TCPU; AOS : TOS);
|
|
|
|
|
|
+Function TPackage.GetBinOutputDir(ACPU:TCPU; AOS : TOS) : String;
|
|
|
|
+begin
|
|
|
|
+ Result:='bin'+PathDelim+MakeTargetString(ACPU,AOS);
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+procedure TPackage.GetCleanFiles(List: TStrings; ACPU:TCPU; AOS : TOS);
|
|
Var
|
|
Var
|
|
|
|
+ OB,OU : String;
|
|
I : Integer;
|
|
I : Integer;
|
|
begin
|
|
begin
|
|
- AddConditionalStrings(List,CleanFiles,ACPU,AOS,APrefixU);
|
|
|
|
|
|
+ OB:=IncludeTrailingPathDelimiter(GetBinOutputDir(Defaults.CPU,Defaults.OS));
|
|
|
|
+ OU:=IncludeTrailingPathDelimiter(GetUnitsOutputDir(Defaults.CPU,Defaults.OS));
|
|
|
|
+ AddConditionalStrings(List,CleanFiles,ACPU,AOS);
|
|
For I:=0 to FTargets.Count-1 do
|
|
For I:=0 to FTargets.Count-1 do
|
|
- FTargets.TargetItems[I].GetCleanFiles(List, APrefixU, APrefixB, ACPU, AOS);
|
|
|
|
|
|
+ FTargets.TargetItems[I].GetCleanFiles(List, OU, OB, ACPU, AOS);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-procedure TPackage.GetInstallFiles(List: TStrings;Types : TTargetTypes;Const APrefix, APrefixU, APrefixB: String; ACPU:TCPU; AOS : TOS);
|
|
|
|
|
|
+procedure TPackage.GetInstallFiles(List: TStrings;Types : TTargetTypes;ACPU:TCPU; AOS : TOS);
|
|
Var
|
|
Var
|
|
|
|
+ OB,OU : String;
|
|
I : Integer;
|
|
I : Integer;
|
|
T : TTarget;
|
|
T : TTarget;
|
|
begin
|
|
begin
|
|
- AddConditionalStrings(List,InstallFiles,ACPU,AOS,APrefix);
|
|
|
|
|
|
+ OB:=IncludeTrailingPathDelimiter(GetBinOutputDir(Defaults.CPU,Defaults.OS));
|
|
|
|
+ OU:=IncludeTrailingPathDelimiter(GetUnitsOutputDir(Defaults.CPU,Defaults.OS));
|
|
|
|
+ AddConditionalStrings(List,InstallFiles,ACPU,AOS);
|
|
For I:=0 to FTargets.Count-1 do
|
|
For I:=0 to FTargets.Count-1 do
|
|
begin
|
|
begin
|
|
T:=FTargets.TargetItems[I];
|
|
T:=FTargets.TargetItems[I];
|
|
if (T.TargetType in Types) and (T.Install) then
|
|
if (T.TargetType in Types) and (T.Install) then
|
|
- T.GetInstallFiles(List, APrefixU, APrefixB, ACPU, AOS);
|
|
|
|
|
|
+ T.GetInstallFiles(List, OU, OB, ACPU, AOS);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -1975,6 +1949,47 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+Procedure TPackage.GetManifest(Manifest : TStrings);
|
|
|
|
+Var
|
|
|
|
+ S : String;
|
|
|
|
+ Release,Minor,Major : Word;
|
|
|
|
+ i : Integer;
|
|
|
|
+ D : TConditionalString;
|
|
|
|
+begin
|
|
|
|
+ With Manifest do
|
|
|
|
+ begin
|
|
|
|
+ Add(Format('<package name="%s">',[QuoteXml(Name)]));
|
|
|
|
+ SplitVersion(Version,Release,Minor,Major,S);
|
|
|
|
+ Add(Format('<version release="%d" major="%d" minor="%d" suffix="%s"/>',[Release,Minor,Major,QuoteXMl(S)]));
|
|
|
|
+ Add(Format('<filename>%s</filename>',[QuoteXml(FileName + ZipExt)]));
|
|
|
|
+ Add(Format('<author>%s</author>',[QuoteXml(Author)]));
|
|
|
|
+ Add(Format('<license>%s</license>',[QuoteXml(License)]));
|
|
|
|
+ if ExternalURL<>'' then
|
|
|
|
+ Add(Format('<externalurl>%s</externalurl>',[QuoteXml(ExternalURL)]));
|
|
|
|
+ Add(Format('<email>%s</email>',[QuoteXMl(Email)]));
|
|
|
|
+ S:=Description;
|
|
|
|
+ If (S<>'') then
|
|
|
|
+ Add(Format('<description>%s</description>',[QuoteXML(S)]));
|
|
|
|
+ If (Dependencies.Count>0) then
|
|
|
|
+ begin
|
|
|
|
+ Add('<dependencies>');
|
|
|
|
+ for I:=0 to Dependencies.Count-1 do
|
|
|
|
+ begin
|
|
|
|
+ D:=Dependencies[i];
|
|
|
|
+ S:='';
|
|
|
|
+ if (D.OSes<>AllOSes) then
|
|
|
|
+ S:=S+' os="'+OSesToString(D.OSes)+'"';
|
|
|
|
+ if (D.CPUs<>AllCPUs) then
|
|
|
|
+ S:=S+' cpu="'+CPUsToString(D.CPUs)+'"';
|
|
|
|
+ Add(Format('<dependency><package%s packagename="%s"/></dependency>',[S,QuoteXML(D.Value)]));
|
|
|
|
+ end;
|
|
|
|
+ Add('</dependencies>');
|
|
|
|
+ end;
|
|
|
|
+ Add('</package>');
|
|
|
|
+ end;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+
|
|
procedure TPackage.LoadUnitConfigFromFile(Const AFileName: String);
|
|
procedure TPackage.LoadUnitConfigFromFile(Const AFileName: String);
|
|
Var
|
|
Var
|
|
F : TFileStream;
|
|
F : TFileStream;
|
|
@@ -2874,12 +2889,6 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-procedure TBuildEngine.SetTargetDir(const AValue: String);
|
|
|
|
-begin
|
|
|
|
- FTargetDir:=AValue;
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
procedure TBuildEngine.Error(const Msg: String);
|
|
procedure TBuildEngine.Error(const Msg: String);
|
|
begin
|
|
begin
|
|
Raise EInstallerError.Create(Msg);
|
|
Raise EInstallerError.Create(Msg);
|
|
@@ -3041,7 +3050,7 @@ Var
|
|
begin
|
|
begin
|
|
D:=FStartDir;
|
|
D:=FStartDir;
|
|
D:=D+ADir;
|
|
D:=D+ADir;
|
|
- Log(vlInfo,SInfoEnterDir,[D]);
|
|
|
|
|
|
+ Log(vlDebug,SDbgEnterDir,[D]);
|
|
If Not SetCurrentDir(D) then
|
|
If Not SetCurrentDir(D) then
|
|
Error(SErrChangeDirFailed,[D]);
|
|
Error(SErrChangeDirFailed,[D]);
|
|
end;
|
|
end;
|
|
@@ -3179,29 +3188,12 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-Function TBuildEngine.GetTargetDir(APackage : TPackage; ATarget : TTarget; AbsolutePath : Boolean = False) : String;
|
|
|
|
-begin
|
|
|
|
- If AbsolutePath then
|
|
|
|
- Result:=IncludeTrailingPathDelimiter(FStartDir)
|
|
|
|
- else
|
|
|
|
- Result:='';
|
|
|
|
- If (APackage.Directory<>'') then
|
|
|
|
- Result:=Result+IncludeTrailingPathDelimiter(APackage.Directory);
|
|
|
|
- If (ATarget.Directory<>'') then
|
|
|
|
- Result:=IncludeTrailingPathDelimiter(Result+ATarget.Directory);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-Procedure TBuildEngine.LogSearchPath(const ASearchPathName:string;Path:TConditionalStrings; ACPU:TCPU;AOS:TOS;Const PathPrefix :String='');
|
|
|
|
|
|
+Procedure TBuildEngine.LogSearchPath(const ASearchPathName:string;Path:TConditionalStrings; ACPU:TCPU;AOS:TOS);
|
|
var
|
|
var
|
|
- S,Prefix : String;
|
|
|
|
|
|
+ S : String;
|
|
I : Integer;
|
|
I : Integer;
|
|
C : TConditionalString;
|
|
C : TConditionalString;
|
|
begin
|
|
begin
|
|
- if PathPrefix<>'' then
|
|
|
|
- Prefix:=IncludeTrailingPathDelimiter(PathPrefix)
|
|
|
|
- else
|
|
|
|
- Prefix:='';
|
|
|
|
S:='';
|
|
S:='';
|
|
for i:=0 to Path.Count-1 do
|
|
for i:=0 to Path.Count-1 do
|
|
begin
|
|
begin
|
|
@@ -3210,7 +3202,7 @@ begin
|
|
begin
|
|
begin
|
|
if S<>'' then
|
|
if S<>'' then
|
|
S:=S+PathSeparator;
|
|
S:=S+PathSeparator;
|
|
- S:=S+Dictionary.ReplaceStrings(Prefix+C.Value)
|
|
|
|
|
|
+ S:=S+Dictionary.ReplaceStrings(C.Value)
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
if S<>'' then
|
|
if S<>'' then
|
|
@@ -3218,23 +3210,18 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-Function TBuildEngine.FindFileInPath(Path:TConditionalStrings; AFileName:String; var FoundPath:String;ACPU:TCPU;AOS:TOS; Const PathPrefix :String=''):Boolean;
|
|
|
|
|
|
+Function TBuildEngine.FindFileInPath(Path:TConditionalStrings; AFileName:String; var FoundPath:String;ACPU:TCPU;AOS:TOS):Boolean;
|
|
var
|
|
var
|
|
- Prefix : String;
|
|
|
|
I : Integer;
|
|
I : Integer;
|
|
C : TConditionalString;
|
|
C : TConditionalString;
|
|
begin
|
|
begin
|
|
Result:=false;
|
|
Result:=false;
|
|
- if PathPrefix<>'' then
|
|
|
|
- Prefix:=IncludeTrailingPathDelimiter(PathPrefix)
|
|
|
|
- else
|
|
|
|
- Prefix:='';
|
|
|
|
for i:=0 to Path.Count-1 do
|
|
for i:=0 to Path.Count-1 do
|
|
begin
|
|
begin
|
|
C:=Path[I];
|
|
C:=Path[I];
|
|
if (ACPU in C.CPUs) and (AOS in C.OSes) then
|
|
if (ACPU in C.CPUs) and (AOS in C.OSes) then
|
|
begin
|
|
begin
|
|
- FoundPath:=IncludeTrailingPathDelimiter(Dictionary.ReplaceStrings(Prefix+C.Value));
|
|
|
|
|
|
+ FoundPath:=IncludeTrailingPathDelimiter(Dictionary.ReplaceStrings(C.Value));
|
|
if FileExists(FoundPath+AFileName) then
|
|
if FileExists(FoundPath+AFileName) then
|
|
begin
|
|
begin
|
|
result:=true;
|
|
result:=true;
|
|
@@ -3246,20 +3233,17 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-Procedure TBuildEngine.ResolveFileNames(APackage : TPackage; ACPU:TCPU;AOS:TOS);
|
|
|
|
|
|
+Procedure TBuildEngine.ResolveFileNames(APackage : TPackage; ACPU:TCPU;AOS:TOS;DoChangeDir:boolean=true);
|
|
|
|
|
|
procedure FindMainSource(T:TTarget);
|
|
procedure FindMainSource(T:TTarget);
|
|
var
|
|
var
|
|
SD,SF : String;
|
|
SD,SF : String;
|
|
begin
|
|
begin
|
|
- LogSearchPath('package source',APackage.SourcePath,ACPU,AOS,APackage.Directory);
|
|
|
|
|
|
+ LogSearchPath('package source',APackage.SourcePath,ACPU,AOS);
|
|
SD:=Dictionary.ReplaceStrings(T.Directory);
|
|
SD:=Dictionary.ReplaceStrings(T.Directory);
|
|
SF:=Dictionary.ReplaceStrings(T.SourceFileName);
|
|
SF:=Dictionary.ReplaceStrings(T.SourceFileName);
|
|
if SD='' then
|
|
if SD='' then
|
|
- FindFileInPath(APackage.SourcePath,SF,SD,ACPU,AOS,APackage.Directory)
|
|
|
|
- else
|
|
|
|
- if APackage.Directory<>'' then
|
|
|
|
- SD:=IncludeTrailingPathDelimiter(APackage.Directory)+SD;
|
|
|
|
|
|
+ FindFileInPath(APackage.SourcePath,SF,SD,ACPU,AOS);
|
|
if SD<>'' then
|
|
if SD<>'' then
|
|
SD:=IncludeTrailingPathDelimiter(SD);
|
|
SD:=IncludeTrailingPathDelimiter(SD);
|
|
T.FTargetSourceFileName:=SD+SF;
|
|
T.FTargetSourceFileName:=SD+SF;
|
|
@@ -3278,8 +3262,8 @@ Procedure TBuildEngine.ResolveFileNames(APackage : TPackage; ACPU:TCPU;AOS:TOS);
|
|
D : TDependency;
|
|
D : TDependency;
|
|
j : integer;
|
|
j : integer;
|
|
begin
|
|
begin
|
|
- LogSearchPath('target include',T.IncludePath,ACPU,AOS,APackage.Directory);
|
|
|
|
- LogSearchPath('package include',APackage.IncludePath,ACPU,AOS,APackage.Directory);
|
|
|
|
|
|
+ LogSearchPath('target include',T.IncludePath,ACPU,AOS);
|
|
|
|
+ LogSearchPath('package include',APackage.IncludePath,ACPU,AOS);
|
|
for j:=0 to T.Dependencies.Count-1 do
|
|
for j:=0 to T.Dependencies.Count-1 do
|
|
begin
|
|
begin
|
|
D:=T.Dependencies[j];
|
|
D:=T.Dependencies[j];
|
|
@@ -3293,8 +3277,8 @@ Procedure TBuildEngine.ResolveFileNames(APackage : TPackage; ACPU:TCPU;AOS:TOS);
|
|
SF:=Dictionary.ReplaceStrings(D.Value);
|
|
SF:=Dictionary.ReplaceStrings(D.Value);
|
|
SD:='';
|
|
SD:='';
|
|
// first check the target specific path
|
|
// first check the target specific path
|
|
- if not FindFileInPath(T.IncludePath,SF,SD,ACPU,AOS,APackage.Directory) then
|
|
|
|
- FindFileInPath(APackage.IncludePath,SF,SD,ACPU,AOS,APackage.Directory);
|
|
|
|
|
|
+ if not FindFileInPath(T.IncludePath,SF,SD,ACPU,AOS) then
|
|
|
|
+ FindFileInPath(APackage.IncludePath,SF,SD,ACPU,AOS);
|
|
if SD<>'' then
|
|
if SD<>'' then
|
|
SD:=IncludeTrailingPathDelimiter(SD);
|
|
SD:=IncludeTrailingPathDelimiter(SD);
|
|
D.TargetFileName:=SD+SF;
|
|
D.TargetFileName:=SD+SF;
|
|
@@ -3317,14 +3301,11 @@ Procedure TBuildEngine.ResolveFileNames(APackage : TPackage; ACPU:TCPU;AOS:TOS);
|
|
var
|
|
var
|
|
SD,SF : String;
|
|
SD,SF : String;
|
|
begin
|
|
begin
|
|
- LogSearchPath('package example',APackage.ExamplePath,ACPU,AOS,APackage.Directory);
|
|
|
|
|
|
+ LogSearchPath('package example',APackage.ExamplePath,ACPU,AOS);
|
|
SD:=Dictionary.ReplaceStrings(T.Directory);
|
|
SD:=Dictionary.ReplaceStrings(T.Directory);
|
|
SF:=Dictionary.ReplaceStrings(T.SourceFileName);
|
|
SF:=Dictionary.ReplaceStrings(T.SourceFileName);
|
|
if SD='' then
|
|
if SD='' then
|
|
- FindFileInPath(APackage.ExamplePath,SF,SD,ACPU,AOS,APackage.Directory)
|
|
|
|
- else
|
|
|
|
- if APackage.Directory<>'' then
|
|
|
|
- SD:=IncludeTrailingPathDelimiter(APackage.Directory)+SD;
|
|
|
|
|
|
+ FindFileInPath(APackage.ExamplePath,SF,SD,ACPU,AOS);
|
|
if SD<>'' then
|
|
if SD<>'' then
|
|
SD:=IncludeTrailingPathDelimiter(SD);
|
|
SD:=IncludeTrailingPathDelimiter(SD);
|
|
T.FTargetSourceFileName:=SD+SF;
|
|
T.FTargetSourceFileName:=SD+SF;
|
|
@@ -3343,41 +3324,58 @@ var
|
|
begin
|
|
begin
|
|
if not((ACPU in APackage.CPUs) and (AOS in APackage.OSes)) then
|
|
if not((ACPU in APackage.CPUs) and (AOS in APackage.OSes)) then
|
|
exit;
|
|
exit;
|
|
- Dictionary.AddVariable('CPU',CPUToString(ACPU));
|
|
|
|
- Dictionary.AddVariable('OS',OSToString(AOS));
|
|
|
|
- For I:=0 to APackage.Targets.Count-1 do
|
|
|
|
- begin
|
|
|
|
- T:=APackage.FTargets.TargetItems[I];
|
|
|
|
- if (ACPU in T.CPUs) and (AOS in T.OSes) then
|
|
|
|
- begin
|
|
|
|
- // Debug information
|
|
|
|
- Log(vlDebug,SDbgResolvingSourcesOfTarget,[T.Name,MakeTargetString(ACPU,AOS)]);
|
|
|
|
- LogIndent;
|
|
|
|
-
|
|
|
|
- case T.TargetType of
|
|
|
|
- ttProgram,
|
|
|
|
- ttUnit,
|
|
|
|
- ttImplicitUnit :
|
|
|
|
- begin
|
|
|
|
- FindMainSource(T);
|
|
|
|
- if T.Dependencies.Count>0 then
|
|
|
|
- FindIncludeSources(T);
|
|
|
|
- end;
|
|
|
|
- ttExampleUnit,
|
|
|
|
- ttExampleProgram :
|
|
|
|
- begin
|
|
|
|
- FindExampleSource(T);
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
|
|
+ try
|
|
|
|
+ if DoChangeDir and (APackage.Directory<>'') then
|
|
|
|
+ EnterDir(APackage.Directory);
|
|
|
|
+ Dictionary.AddVariable('CPU',CPUToString(ACPU));
|
|
|
|
+ Dictionary.AddVariable('OS',OSToString(AOS));
|
|
|
|
+ For I:=0 to APackage.Targets.Count-1 do
|
|
|
|
+ begin
|
|
|
|
+ T:=APackage.FTargets.TargetItems[I];
|
|
|
|
+ if (ACPU in T.CPUs) and (AOS in T.OSes) then
|
|
|
|
+ begin
|
|
|
|
+ // Debug information
|
|
|
|
+ Log(vlDebug,SDbgResolvingSourcesOfTarget,[T.Name,MakeTargetString(ACPU,AOS)]);
|
|
|
|
+ LogIndent;
|
|
|
|
+
|
|
|
|
+ case T.TargetType of
|
|
|
|
+ ttProgram,
|
|
|
|
+ ttUnit,
|
|
|
|
+ ttImplicitUnit :
|
|
|
|
+ begin
|
|
|
|
+ FindMainSource(T);
|
|
|
|
+ if T.Dependencies.Count>0 then
|
|
|
|
+ FindIncludeSources(T);
|
|
|
|
+ end;
|
|
|
|
+ ttExampleUnit,
|
|
|
|
+ ttExampleProgram :
|
|
|
|
+ begin
|
|
|
|
+ FindExampleSource(T);
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
|
|
- LogUnIndent;
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
|
|
+ LogUnIndent;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
|
|
+ finally
|
|
|
|
+ If DoChangeDir and (APackage.Directory<>'') then
|
|
|
|
+ EnterDir('');
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
function TBuildEngine.GetUnitDir(APackage:TPackage):String;
|
|
function TBuildEngine.GetUnitDir(APackage:TPackage):String;
|
|
begin
|
|
begin
|
|
|
|
+ // Retrieve Full directory name where to find the units.
|
|
|
|
+ // The search order is:
|
|
|
|
+ // - Package in this fpmake.pp
|
|
|
|
+ // - LocalUnitDir
|
|
|
|
+ // - GlobalUnitDir
|
|
|
|
+ if (APackage.UnitDir='') and
|
|
|
|
+ (APackage.State=tsCompiled) then
|
|
|
|
+ begin
|
|
|
|
+ APackage.UnitDir:=IncludeTrailingPathDelimiter(FStartDir)+IncludeTrailingPathDelimiter(APackage.Directory)+APackage.GetUnitsOutputDir(Defaults.CPU,Defaults.OS);
|
|
|
|
+ end;
|
|
if (APackage.UnitDir='') and
|
|
if (APackage.UnitDir='') and
|
|
(Defaults.LocalUnitDir<>'') then
|
|
(Defaults.LocalUnitDir<>'') then
|
|
begin
|
|
begin
|
|
@@ -3451,16 +3449,12 @@ end;
|
|
|
|
|
|
Function TBuildEngine.GetCompilerCommand(APackage : TPackage; ATarget : TTarget) : String;
|
|
Function TBuildEngine.GetCompilerCommand(APackage : TPackage; ATarget : TTarget) : String;
|
|
Var
|
|
Var
|
|
- PD,OD : String;
|
|
|
|
L,Args : TStringList;
|
|
L,Args : TStringList;
|
|
-
|
|
|
|
i : Integer;
|
|
i : Integer;
|
|
begin
|
|
begin
|
|
Args:=TStringList.Create;
|
|
Args:=TStringList.Create;
|
|
Args.Duplicates:=dupIgnore;
|
|
Args.Duplicates:=dupIgnore;
|
|
|
|
|
|
- PD:=GetPackageDir(APackage,True);
|
|
|
|
-
|
|
|
|
Result := '';
|
|
Result := '';
|
|
|
|
|
|
//compiler configuration
|
|
//compiler configuration
|
|
@@ -3477,12 +3471,8 @@ begin
|
|
Args.Add('-M'+ModeToString(Defaults.Mode));
|
|
Args.Add('-M'+ModeToString(Defaults.Mode));
|
|
// Output file paths
|
|
// Output file paths
|
|
If ATarget.TargetType in ProgramTargets then
|
|
If ATarget.TargetType in ProgramTargets then
|
|
- begin
|
|
|
|
- OD:=GetBinOutputDir(APackage,True);
|
|
|
|
- Args.Add('-FE' + ExtractRelativePath(PD,OD));
|
|
|
|
- end;
|
|
|
|
- OD:=GetUnitsOutputDir(APackage,True);
|
|
|
|
- Args.Add('-FU' + ExtractRelativePath(PD,OD));
|
|
|
|
|
|
+ Args.Add('-FE'+APackage.GetBinOutputDir(Defaults.CPU,Defaults.OS));
|
|
|
|
+ Args.Add('-FU'+APackage.GetUnitsOutputDir(Defaults.CPU,Defaults.OS));
|
|
// Object Path
|
|
// Object Path
|
|
L:=TStringList.Create;
|
|
L:=TStringList.Create;
|
|
L.Sorted:=true;
|
|
L.Sorted:=true;
|
|
@@ -3520,7 +3510,7 @@ begin
|
|
If (ATarget.Options<>'') then
|
|
If (ATarget.Options<>'') then
|
|
Args.Add(ATarget.Options);
|
|
Args.Add(ATarget.Options);
|
|
// Add Filename to compile
|
|
// Add Filename to compile
|
|
- Args.Add(ExtractRelativePath(PD, ExpandFileName(ATarget.TargetSourceFileName)));
|
|
|
|
|
|
+ Args.Add(ATarget.TargetSourceFileName);
|
|
// Convert to string
|
|
// Convert to string
|
|
Result:='';
|
|
Result:='';
|
|
for i:=0 to Args.Count-1 do
|
|
for i:=0 to Args.Count-1 do
|
|
@@ -3549,54 +3539,13 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-function TBuildEngine.GetPackageDir(APackage: TPackage; AbsolutePath: Boolean): String;
|
|
|
|
-begin
|
|
|
|
- If AbsolutePath then
|
|
|
|
- Result:= IncludeTrailingPathDelimiter(FStartDir)
|
|
|
|
- else
|
|
|
|
- Result:='';
|
|
|
|
- Result:=Result+APackage.Directory;
|
|
|
|
- If (Result<>'') then
|
|
|
|
- Result:= IncludeTrailingPathDelimiter(Result);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-Function TBuildEngine.GetOutputDir(AName: string; APackage : TPackage; AbsolutePath : Boolean = False) : String;
|
|
|
|
-begin
|
|
|
|
- If (TargetDir<>'') then
|
|
|
|
- Result:=IncludeTrailingPathDelimiter(TargetDir)
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- If AbsolutePath then
|
|
|
|
- Result:=IncludeTrailingPathDelimiter(FStartDir)
|
|
|
|
- else
|
|
|
|
- Result:='';
|
|
|
|
- If (APackage.Directory<>'') then
|
|
|
|
- Result:=IncludeTrailingPathDelimiter(Result+APackage.Directory);
|
|
|
|
- Result := IncludeTrailingPathDelimiter(Result + AName + PathDelim + Defaults.Target);
|
|
|
|
- end;
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-Function TBuildEngine.GetUnitsOutputDir(APackage : TPackage; AbsolutePath : Boolean = False) : String;
|
|
|
|
-begin
|
|
|
|
- Result := GetOutputDir('units', APackage, AbsolutePath);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-Function TBuildEngine.GetBinOutputDir(APackage : TPackage; AbsolutePath : Boolean = False) : String;
|
|
|
|
-begin
|
|
|
|
- Result := GetOutputDir('bin', APackage, AbsolutePath);
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
procedure TBuildEngine.CreateOutputDir(APackage: TPackage);
|
|
procedure TBuildEngine.CreateOutputDir(APackage: TPackage);
|
|
Var
|
|
Var
|
|
D : String;
|
|
D : String;
|
|
i: integer;
|
|
i: integer;
|
|
begin
|
|
begin
|
|
//create a units directory
|
|
//create a units directory
|
|
- D:=GetUnitsOutputDir(APackage,True);
|
|
|
|
|
|
+ D:=APackage.GetUnitsOutputDir(Defaults.CPU,Defaults.OS);
|
|
If not SysDirectoryExists(D) then
|
|
If not SysDirectoryExists(D) then
|
|
begin
|
|
begin
|
|
Log(vlInfo,SInfoCreatingOutputDir,[D]);
|
|
Log(vlInfo,SInfoCreatingOutputDir,[D]);
|
|
@@ -3605,18 +3554,19 @@ begin
|
|
|
|
|
|
//also create a bin directory for programtargets
|
|
//also create a bin directory for programtargets
|
|
For i := 0 to Pred(APackage.Targets.Count) do
|
|
For i := 0 to Pred(APackage.Targets.Count) do
|
|
- begin
|
|
|
|
- if APackage.Targets.TargetItems[i].TargetType in ProgramTargets then
|
|
|
|
begin
|
|
begin
|
|
- D:=GetBinOutputDir(APackage,True);
|
|
|
|
- If not SysDirectoryExists(D) then
|
|
|
|
|
|
+ if APackage.Targets.TargetItems[i].TargetType in ProgramTargets then
|
|
begin
|
|
begin
|
|
- Log(vlInfo,SInfoCreatingOutputDir,[D]);
|
|
|
|
- CmdCreateDir(D);
|
|
|
|
|
|
+ D:=APackage.GetBinOutputDir(Defaults.CPU,Defaults.OS);
|
|
|
|
+ If not SysDirectoryExists(D) then
|
|
|
|
+ begin
|
|
|
|
+ Log(vlInfo,SInfoCreatingOutputDir,[D]);
|
|
|
|
+ CmdCreateDir(D);
|
|
|
|
+ end;
|
|
|
|
+ //do not continue loop, directory is made anyway
|
|
|
|
+ break;
|
|
end;
|
|
end;
|
|
- exit; //do not continue loop, directory is made anyway
|
|
|
|
end;
|
|
end;
|
|
- end;
|
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -3682,9 +3632,9 @@ begin
|
|
if not result then
|
|
if not result then
|
|
begin
|
|
begin
|
|
if ATarget.TargetType in ProgramTargets then
|
|
if ATarget.TargetType in ProgramTargets then
|
|
- OD:=GetBinOutputDir(APackage, True)
|
|
|
|
|
|
+ OD:=APackage.GetBinOutputDir(Defaults.CPU,Defaults.OS)
|
|
else
|
|
else
|
|
- OD:=GetUnitsOutputDir(APackage, True);
|
|
|
|
|
|
+ OD:=APackage.GetUnitsOutputDir(Defaults.CPU,Defaults.OS);
|
|
If (OD<>'') then
|
|
If (OD<>'') then
|
|
OD:=IncludeTrailingPathDelimiter(OD);
|
|
OD:=IncludeTrailingPathDelimiter(OD);
|
|
OFN:=OD+ATarget.GetOutPutFileName(Defaults.OS);
|
|
OFN:=OD+ATarget.GetOutPutFileName(Defaults.OS);
|
|
@@ -3796,7 +3746,7 @@ begin
|
|
if (T.TargetType<>ttImplicitUnit) then
|
|
if (T.TargetType<>ttImplicitUnit) then
|
|
begin
|
|
begin
|
|
if T.State=tsCompiling then
|
|
if T.State=tsCompiling then
|
|
- Log(vlWarning,SWarnCircularDependency,[ATarget.Name,T.Name]);
|
|
|
|
|
|
+ Log(vlWarning,SWarnCircularTargetDependency,[ATarget.Name,T.Name]);
|
|
MaybeCompile(APackage,T);
|
|
MaybeCompile(APackage,T);
|
|
end;
|
|
end;
|
|
end
|
|
end
|
|
@@ -3850,7 +3800,7 @@ begin
|
|
if FForceCompile then
|
|
if FForceCompile then
|
|
Result:=true;
|
|
Result:=true;
|
|
|
|
|
|
- // Recompile becuase of Package Dependencies?
|
|
|
|
|
|
+ // Recompile because of Package Dependencies?
|
|
if not Result then
|
|
if not Result then
|
|
begin
|
|
begin
|
|
I:=0;
|
|
I:=0;
|
|
@@ -3863,7 +3813,9 @@ begin
|
|
P:=TPackage(D.Target);
|
|
P:=TPackage(D.Target);
|
|
if Assigned(P) and (P<>APackage) then
|
|
if Assigned(P) and (P<>APackage) then
|
|
begin
|
|
begin
|
|
- Result:=NeedsCompile(P);
|
|
|
|
|
|
+ If (P.State in [tsCompiling,tsNeedCompile]) then
|
|
|
|
+ Log(vlWarning,SWarnCircularPackageDependency,[APackage.Name,P.Name]);
|
|
|
|
+ Result:=(P.State in [tsCompiled,tsCompiling,tsNeedCompile]);
|
|
if Result then
|
|
if Result then
|
|
break;
|
|
break;
|
|
end;
|
|
end;
|
|
@@ -3874,12 +3826,19 @@ begin
|
|
// Recompile a Target of this package?
|
|
// Recompile a Target of this package?
|
|
If Not Result then
|
|
If Not Result then
|
|
begin
|
|
begin
|
|
- for i:=0 to APackage.Targets.Count-1 do
|
|
|
|
- begin
|
|
|
|
- Result:=NeedsCompile(APackage,APackage.Targets.TargetItems[i]);
|
|
|
|
- if Result then
|
|
|
|
- break;
|
|
|
|
- end;
|
|
|
|
|
|
+ try
|
|
|
|
+ If (APackage.Directory<>'') then
|
|
|
|
+ EnterDir(APackage.Directory);
|
|
|
|
+ for i:=0 to APackage.Targets.Count-1 do
|
|
|
|
+ begin
|
|
|
|
+ Result:=NeedsCompile(APackage,APackage.Targets.TargetItems[i]);
|
|
|
|
+ if Result then
|
|
|
|
+ break;
|
|
|
|
+ end;
|
|
|
|
+ Finally
|
|
|
|
+ If (APackage.Directory<>'') then
|
|
|
|
+ EnterDir('');
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
// Upate also target state so a second check is faster
|
|
// Upate also target state so a second check is faster
|
|
@@ -3904,8 +3863,8 @@ begin
|
|
If (APackage.Directory<>'') then
|
|
If (APackage.Directory<>'') then
|
|
EnterDir(APackage.Directory);
|
|
EnterDir(APackage.Directory);
|
|
CreateOutputDir(APackage);
|
|
CreateOutputDir(APackage);
|
|
- Dictionary.AddVariable('UNITSOUTPUTDIR',GetUnitsOutputDir(APackage));
|
|
|
|
- Dictionary.AddVariable('BINOUTPUTDIR',GetBinOutputDir(APackage));
|
|
|
|
|
|
+ Dictionary.AddVariable('UNITSOUTPUTDIR',APackage.GetUnitsOutputDir(Defaults.CPU,Defaults.OS));
|
|
|
|
+ Dictionary.AddVariable('BINOUTPUTDIR',APackage.GetBinOutputDir(Defaults.CPU,Defaults.OS));
|
|
DoBeforeCompile(APackage);
|
|
DoBeforeCompile(APackage);
|
|
For I:=0 to APackage.Targets.Count-1 do
|
|
For I:=0 to APackage.Targets.Count-1 do
|
|
begin
|
|
begin
|
|
@@ -4000,7 +3959,7 @@ begin
|
|
P:=TPackage(D.Target);
|
|
P:=TPackage(D.Target);
|
|
// If it already was compiled, then State<>tsNeutral, and it won't be compiled again.
|
|
// If it already was compiled, then State<>tsNeutral, and it won't be compiled again.
|
|
If Assigned(P) and (P<>APackage) then
|
|
If Assigned(P) and (P<>APackage) then
|
|
- Compile(P)
|
|
|
|
|
|
+ MaybeCompile(P)
|
|
else
|
|
else
|
|
D.Target:=CheckExternalPackage(D.Value);
|
|
D.Target:=CheckExternalPackage(D.Value);
|
|
end;
|
|
end;
|
|
@@ -4011,15 +3970,11 @@ end;
|
|
Function TBuildEngine.InstallPackageFiles(APAckage : TPackage; tt : TTargetType; Const Dest : String):Boolean;
|
|
Function TBuildEngine.InstallPackageFiles(APAckage : TPackage; tt : TTargetType; Const Dest : String):Boolean;
|
|
Var
|
|
Var
|
|
List : TStringList;
|
|
List : TStringList;
|
|
- PD,UD,BD : string;
|
|
|
|
begin
|
|
begin
|
|
Result:=False;
|
|
Result:=False;
|
|
List:=TStringList.Create;
|
|
List:=TStringList.Create;
|
|
Try
|
|
Try
|
|
- UD:=GetUnitsOutputDir(APackage);
|
|
|
|
- BD:=GetBinOutputDir(APackage);
|
|
|
|
- PD:=GetPackageDir(APackage);
|
|
|
|
- APackage.GetInstallFiles(List,[tt],PD, UD, BD, Defaults.CPU, Defaults.OS);
|
|
|
|
|
|
+ APackage.GetInstallFiles(List,[tt],Defaults.CPU, Defaults.OS);
|
|
if (List.Count>0) then
|
|
if (List.Count>0) then
|
|
begin
|
|
begin
|
|
Result:=True;
|
|
Result:=True;
|
|
@@ -4054,28 +4009,35 @@ Var
|
|
begin
|
|
begin
|
|
If (Apackage.State<>tsCompiled) then
|
|
If (Apackage.State<>tsCompiled) then
|
|
Compile(APackage);
|
|
Compile(APackage);
|
|
- Log(vlInfo,SInfoInstallingPackage,[APackage.Name]);
|
|
|
|
- DoBeforeInstall(APackage);
|
|
|
|
- // units
|
|
|
|
- B:=false;
|
|
|
|
- D:=IncludeTrailingPathDelimiter(Defaults.UnitInstallDir)+APackage.Name;
|
|
|
|
- if InstallPackageFiles(APAckage,ttUnit,D) then
|
|
|
|
- B:=true;
|
|
|
|
- if InstallPackageFiles(APAckage,ttImplicitUnit,D) then
|
|
|
|
- B:=true;
|
|
|
|
- // Unit (dependency) configuration if there were units installed
|
|
|
|
- if B then
|
|
|
|
- begin
|
|
|
|
- UC:=IncludeTrailingPathDelimiter(D)+UnitConfigFile;
|
|
|
|
- Log(vlInfo, Format(SDbgGenerating, [UC]));
|
|
|
|
- APackage.SaveUnitConfigToFile(UC,Defaults.CPU,Defaults.OS);
|
|
|
|
- end;
|
|
|
|
- // Programs
|
|
|
|
- D:=IncludeTrailingPathDelimiter(Defaults.BinInstallDir);
|
|
|
|
- InstallPackageFiles(APAckage,ttProgram,D);
|
|
|
|
- // Done.
|
|
|
|
- APackage.FTargetState:=tsInstalled;
|
|
|
|
- DoAfterInstall(APackage);
|
|
|
|
|
|
+ try
|
|
|
|
+ Log(vlInfo,SInfoInstallingPackage,[APackage.Name]);
|
|
|
|
+ If (APackage.Directory<>'') then
|
|
|
|
+ EnterDir(APackage.Directory);
|
|
|
|
+ DoBeforeInstall(APackage);
|
|
|
|
+ // units
|
|
|
|
+ B:=false;
|
|
|
|
+ D:=IncludeTrailingPathDelimiter(Defaults.UnitInstallDir)+APackage.Name;
|
|
|
|
+ if InstallPackageFiles(APAckage,ttUnit,D) then
|
|
|
|
+ B:=true;
|
|
|
|
+ if InstallPackageFiles(APAckage,ttImplicitUnit,D) then
|
|
|
|
+ B:=true;
|
|
|
|
+ // Unit (dependency) configuration if there were units installed
|
|
|
|
+ if B then
|
|
|
|
+ begin
|
|
|
|
+ UC:=IncludeTrailingPathDelimiter(D)+UnitConfigFile;
|
|
|
|
+ Log(vlInfo, Format(SDbgGenerating, [UC]));
|
|
|
|
+ APackage.SaveUnitConfigToFile(UC,Defaults.CPU,Defaults.OS);
|
|
|
|
+ end;
|
|
|
|
+ // Programs
|
|
|
|
+ D:=IncludeTrailingPathDelimiter(Defaults.BinInstallDir);
|
|
|
|
+ InstallPackageFiles(APAckage,ttProgram,D);
|
|
|
|
+ // Done.
|
|
|
|
+ APackage.FTargetState:=tsInstalled;
|
|
|
|
+ DoAfterInstall(APackage);
|
|
|
|
+ Finally
|
|
|
|
+ If (APackage.Directory<>'') then
|
|
|
|
+ EnterDir('');
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -4098,57 +4060,63 @@ end;
|
|
procedure TBuildEngine.Archive(APackage: TPackage);
|
|
procedure TBuildEngine.Archive(APackage: TPackage);
|
|
Var
|
|
Var
|
|
L : TStringList;
|
|
L : TStringList;
|
|
- PD,A : String;
|
|
|
|
|
|
+ A : String;
|
|
i: integer;
|
|
i: integer;
|
|
ICPU : TCPU;
|
|
ICPU : TCPU;
|
|
IOS : TOS;
|
|
IOS : TOS;
|
|
begin
|
|
begin
|
|
Log(vlInfo,SInfoArchivingPackage,[APackage.Name]);
|
|
Log(vlInfo,SInfoArchivingPackage,[APackage.Name]);
|
|
- DoBeforeArchive(Apackage);
|
|
|
|
- L:=TStringList.Create;
|
|
|
|
- L.Sorted:=true;
|
|
|
|
- L.Duplicates:=dupIgnore;
|
|
|
|
- Try
|
|
|
|
- // Add fpmake.pp & manifest.xml always
|
|
|
|
- PD:=GetPackageDir(APackage,False);
|
|
|
|
- L.Add(PD+FPMakePPFile);
|
|
|
|
- L.Add(PD+ManifestFile);
|
|
|
|
- //get all files from all targets
|
|
|
|
- for ICPU:=Low(TCPU) to high(TCPU) do
|
|
|
|
- for IOS:=Low(TOS) to high(TOS) do
|
|
|
|
- if OSCPUSupported[IOS,ICPU] then
|
|
|
|
- begin
|
|
|
|
- ResolveFileNames(APackage,ICPU,IOS);
|
|
|
|
- APackage.GetArchiveFiles(L, ICPU, IOS);
|
|
|
|
- end;
|
|
|
|
- //from sources
|
|
|
|
- for i := 0 to APackage.Sources.Count-1 do
|
|
|
|
- L.Add(APackage.Sources[i].Name);
|
|
|
|
|
|
+ try
|
|
|
|
+ If (APackage.Directory<>'') then
|
|
|
|
+ EnterDir(APackage.Directory);
|
|
|
|
+ DoBeforeArchive(Apackage);
|
|
|
|
+ L:=TStringList.Create;
|
|
|
|
+ L.Sorted:=true;
|
|
|
|
+ L.Duplicates:=dupIgnore;
|
|
|
|
+ Try
|
|
|
|
+ // Add fpmake.pp & manifest.xml always
|
|
|
|
+ L.Add(FPMakePPFile);
|
|
|
|
+ L.Add(ManifestFile);
|
|
|
|
+ //get all files from all targets
|
|
|
|
+ for ICPU:=Low(TCPU) to high(TCPU) do
|
|
|
|
+ for IOS:=Low(TOS) to high(TOS) do
|
|
|
|
+ if OSCPUSupported[IOS,ICPU] then
|
|
|
|
+ begin
|
|
|
|
+ ResolveFileNames(APackage,ICPU,IOS,false);
|
|
|
|
+ APackage.GetArchiveFiles(L, ICPU, IOS);
|
|
|
|
+ end;
|
|
|
|
+ //from sources
|
|
|
|
+ for i := 0 to APackage.Sources.Count-1 do
|
|
|
|
+ L.Add(APackage.Sources[i].Name);
|
|
|
|
|
|
- //show all files
|
|
|
|
- for i := 0 to L.Count-1 do
|
|
|
|
- Log(vlInfo, Format(SInfoArchivingFile, [L[i]]));
|
|
|
|
|
|
+ //show all files
|
|
|
|
+ for i := 0 to L.Count-1 do
|
|
|
|
+ Log(vlInfo, Format(SInfoArchivingFile, [L[i]]));
|
|
|
|
|
|
- A:=APackage.FileName + ZipExt;
|
|
|
|
|
|
+ A:=FStartDir+ APackage.FileName + ZipExt;
|
|
|
|
|
|
{$ifdef HAS_UNIT_ZIPPER}
|
|
{$ifdef HAS_UNIT_ZIPPER}
|
|
- if not Assigned(ArchiveFilesProc) then
|
|
|
|
- begin
|
|
|
|
- FZipFile := TZipper.Create;
|
|
|
|
- FZipFile.ZipFiles(A, L);
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
|
|
+ if not Assigned(ArchiveFilesProc) then
|
|
|
|
+ begin
|
|
|
|
+ FZipFile := TZipper.Create;
|
|
|
|
+ FZipFile.ZipFiles(A, L);
|
|
|
|
+ end
|
|
|
|
+ else
|
|
{$endif HAS_UNIT_ZIPPER}
|
|
{$endif HAS_UNIT_ZIPPER}
|
|
- CmdArchiveFiles(L,A);
|
|
|
|
- Finally
|
|
|
|
- L.Free;
|
|
|
|
|
|
+ CmdArchiveFiles(L,A);
|
|
|
|
+ Finally
|
|
|
|
+ L.Free;
|
|
|
|
|
|
{$ifdef HAS_UNIT_ZIPPER}
|
|
{$ifdef HAS_UNIT_ZIPPER}
|
|
- if not Assigned(ArchiveFilesProc) then
|
|
|
|
- FZipFile.Free;
|
|
|
|
|
|
+ if not Assigned(ArchiveFilesProc) then
|
|
|
|
+ FreeAndNil(FZipFile);
|
|
{$endif HAS_UNIT_ZIPPER}
|
|
{$endif HAS_UNIT_ZIPPER}
|
|
|
|
+ end;
|
|
|
|
+ DoAfterArchive(Apackage);
|
|
|
|
+ Finally
|
|
|
|
+ If (APackage.Directory<>'') then
|
|
|
|
+ EnterDir('');
|
|
end;
|
|
end;
|
|
- DoAfterArchive(Apackage);
|
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -4170,23 +4138,26 @@ end;
|
|
|
|
|
|
procedure TBuildEngine.Clean(APackage: TPackage);
|
|
procedure TBuildEngine.Clean(APackage: TPackage);
|
|
Var
|
|
Var
|
|
- OU : String;
|
|
|
|
- OB : String;
|
|
|
|
List : TStringList;
|
|
List : TStringList;
|
|
begin
|
|
begin
|
|
Log(vlInfo,SInfoCleaningPackage,[APackage.Name]);
|
|
Log(vlInfo,SInfoCleaningPackage,[APackage.Name]);
|
|
- DoBeforeClean(Apackage);
|
|
|
|
- OU:=IncludeTrailingPathDelimiter(GetUnitsOutputDir(APAckage));
|
|
|
|
- OB:=IncludeTrailingPathDelimiter(GetBinOutputDir(APAckage));
|
|
|
|
- List:=TStringList.Create;
|
|
|
|
try
|
|
try
|
|
- APackage.GetCleanFiles(List,OU, OB, Defaults.CPU,Defaults.OS);
|
|
|
|
- if (List.Count>0) then
|
|
|
|
- CmdDeleteFiles(List);
|
|
|
|
|
|
+ If (APackage.Directory<>'') then
|
|
|
|
+ EnterDir(APackage.Directory);
|
|
|
|
+ DoBeforeClean(Apackage);
|
|
|
|
+ List:=TStringList.Create;
|
|
|
|
+ try
|
|
|
|
+ APackage.GetCleanFiles(List,Defaults.CPU,Defaults.OS);
|
|
|
|
+ if (List.Count>0) then
|
|
|
|
+ CmdDeleteFiles(List);
|
|
|
|
+ Finally
|
|
|
|
+ List.Free;
|
|
|
|
+ end;
|
|
|
|
+ DoAfterClean(Apackage);
|
|
Finally
|
|
Finally
|
|
- List.Free;
|
|
|
|
|
|
+ If (APackage.Directory<>'') then
|
|
|
|
+ EnterDir('');
|
|
end;
|
|
end;
|
|
- DoAfterClean(Apackage);
|
|
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|