|
@@ -1059,8 +1059,12 @@ Type
|
|
FOptions: TStrings;
|
|
FOptions: TStrings;
|
|
FCPU: TCPU;
|
|
FCPU: TCPU;
|
|
FOS: TOS;
|
|
FOS: TOS;
|
|
|
|
+ FSourceCPU: TCPU;
|
|
|
|
+ FSourceOS: TOS;
|
|
FMode : TCompilerMode;
|
|
FMode : TCompilerMode;
|
|
|
|
+ FCompilerDate : String;
|
|
FCompilerVersion : String;
|
|
FCompilerVersion : String;
|
|
|
|
+ FFullCompilerVersion : String;
|
|
FPrefix: String;
|
|
FPrefix: String;
|
|
FBaseInstallDir,
|
|
FBaseInstallDir,
|
|
FUnitInstallDir,
|
|
FUnitInstallDir,
|
|
@@ -1134,7 +1138,11 @@ Type
|
|
Property Target : String Read FTarget Write SetTarget;
|
|
Property Target : String Read FTarget Write SetTarget;
|
|
Property OS : TOS Read FOS Write SetOS;
|
|
Property OS : TOS Read FOS Write SetOS;
|
|
Property CPU : TCPU Read FCPU Write SetCPU;
|
|
Property CPU : TCPU Read FCPU Write SetCPU;
|
|
|
|
+ Property SourceOS : TOS Read FSourceOS;
|
|
|
|
+ Property SourceCPU : TCPU Read FSourceCPU;
|
|
Property CompilerVersion : String read FCompilerVersion;
|
|
Property CompilerVersion : String read FCompilerVersion;
|
|
|
|
+ Property CompilerDate : String read FCompilerDate;
|
|
|
|
+ Property FullCompilerVersion : String read FFullCompilerVersion;
|
|
Property ExplicitOSNone: Boolean read FExplicitOSNone Write FExplicitOSNone;
|
|
Property ExplicitOSNone: Boolean read FExplicitOSNone Write FExplicitOSNone;
|
|
Property BuildString : String read GetBuildString;
|
|
Property BuildString : String read GetBuildString;
|
|
Property BuildOS : TOS read GetBuildOS;
|
|
Property BuildOS : TOS read GetBuildOS;
|
|
@@ -1774,6 +1782,7 @@ ResourceString
|
|
SWarnExtCommandNotFound = 'Warning: External command "%s" not found but "%s" is older then "%s"';
|
|
SWarnExtCommandNotFound = 'Warning: External command "%s" not found but "%s" is older then "%s"';
|
|
SWarnDuplicatePackage = 'Warning: Package %s is already added. Using the existing package';
|
|
SWarnDuplicatePackage = 'Warning: Package %s is already added. Using the existing package';
|
|
SWarngccNotFound = 'Could not find libgcc';
|
|
SWarngccNotFound = 'Could not find libgcc';
|
|
|
|
+ SWarncrossgccNotFound = 'Could not find libgcc for cross-configuration';
|
|
SWarngcclibpath = 'Warning: Unable to determine the libgcc path.';
|
|
SWarngcclibpath = 'Warning: Unable to determine the libgcc path.';
|
|
SWarnNoFCLProcessSupport= 'No FCL-Process support';
|
|
SWarnNoFCLProcessSupport= 'No FCL-Process support';
|
|
SWarnRetryRemDirectory = 'Failed to remove directory "%s". Retry after a short delay';
|
|
SWarnRetryRemDirectory = 'Failed to remove directory "%s". Retry after a short delay';
|
|
@@ -2838,6 +2847,10 @@ end;
|
|
|
|
|
|
function GetDefaultLibGCCDir(CPU : TCPU;OS: TOS; var ErrorMessage: string): string;
|
|
function GetDefaultLibGCCDir(CPU : TCPU;OS: TOS; var ErrorMessage: string): string;
|
|
|
|
|
|
|
|
+var
|
|
|
|
+ CrossPrefix: string;
|
|
|
|
+ UseBinutilsPrefix: boolean;
|
|
|
|
+
|
|
function Get4thWord(const AString: string): string;
|
|
function Get4thWord(const AString: string): string;
|
|
var p: pchar;
|
|
var p: pchar;
|
|
spacecount: integer;
|
|
spacecount: integer;
|
|
@@ -2874,7 +2887,7 @@ function GetDefaultLibGCCDir(CPU : TCPU;OS: TOS; var ErrorMessage: string): stri
|
|
GccExecutable: string;
|
|
GccExecutable: string;
|
|
begin
|
|
begin
|
|
result := '';
|
|
result := '';
|
|
- GccExecutable := ExeSearch(AddProgramExtension('gcc', OS),Sysutils.GetEnvironmentVariable('PATH'));
|
|
|
|
|
|
+ GccExecutable := ExeSearch(AddProgramExtension(CrossPrefix+'gcc', OS),Sysutils.GetEnvironmentVariable('PATH'));
|
|
if FileExists(GccExecutable) then
|
|
if FileExists(GccExecutable) then
|
|
begin
|
|
begin
|
|
{$ifdef HAS_UNIT_PROCESS}
|
|
{$ifdef HAS_UNIT_PROCESS}
|
|
@@ -2894,6 +2907,8 @@ function GetDefaultLibGCCDir(CPU : TCPU;OS: TOS; var ErrorMessage: string): stri
|
|
ErrorMessage := SWarnNoFCLProcessSupport;
|
|
ErrorMessage := SWarnNoFCLProcessSupport;
|
|
{$endif HAS_UNIT_PROCESS}
|
|
{$endif HAS_UNIT_PROCESS}
|
|
end
|
|
end
|
|
|
|
+ else if UseBinutilsPrefix then
|
|
|
|
+ ErrorMessage := SWarncrossgccNotFound
|
|
else
|
|
else
|
|
ErrorMessage := SWarngccNotFound;
|
|
ErrorMessage := SWarngccNotFound;
|
|
end;
|
|
end;
|
|
@@ -2901,10 +2916,42 @@ function GetDefaultLibGCCDir(CPU : TCPU;OS: TOS; var ErrorMessage: string): stri
|
|
begin
|
|
begin
|
|
result := '';
|
|
result := '';
|
|
ErrorMessage:='';
|
|
ErrorMessage:='';
|
|
|
|
+ if (Defaults.SourceOS<>OS) then
|
|
|
|
+ UseBinutilsPrefix:=true;
|
|
|
|
+ if (Defaults.SourceCPU<>CPU) then
|
|
|
|
+ begin
|
|
|
|
+ { we need to accept 32<->64 conversion }
|
|
|
|
+ { expect for OpenBSD which does not allow this }
|
|
|
|
+ if not(
|
|
|
|
+ ((Defaults.SourceCPU=aarch64) and (CPU=arm)) or
|
|
|
|
+ ((Defaults.SourceCPU=powerpc64) and (CPU=powerpc)) or
|
|
|
|
+ ((Defaults.SourceCPU=x86_64) and (CPU=i386)) or
|
|
|
|
+ ((Defaults.SourceCPU=riscv64) and (CPU=riscv32)) or
|
|
|
|
+ ((Defaults.SourceCPU=sparc64) and (CPU=sparc)) or
|
|
|
|
+ ((CPU=aarch64) and (Defaults.SourceCPU=arm)) or
|
|
|
|
+ ((CPU=powerpc64) and (Defaults.SourceCPU=powerpc)) or
|
|
|
|
+ ((CPU=x86_64) and (Defaults.SourceCPU=i386)) or
|
|
|
|
+ ((CPU=riscv64) and (Defaults.SourceCPU=riscv32)) or
|
|
|
|
+ ((CPU=sparc64) and (Defaults.SourceCPU=sparc))
|
|
|
|
+ ) or (Defaults.SourceOS=openbsd) then
|
|
|
|
+ UseBinutilsPrefix:=true;
|
|
|
|
+ end;
|
|
|
|
+ if not UseBinutilsPrefix then
|
|
|
|
+ CrossPrefix:=''
|
|
|
|
+ else if Sysutils.GetEnvironmentVariable('BINUTILSPREFIX')<>'' then
|
|
|
|
+ CrossPrefix:=Sysutils.GetEnvironmentVariable('BINUTILSPREFIX')
|
|
|
|
+ else
|
|
|
|
+ CrossPrefix:=CPUToString(CPU)+'-'+OSToString(OS)+'-';
|
|
if OS in [freebsd, openbsd, dragonfly] then
|
|
if OS in [freebsd, openbsd, dragonfly] then
|
|
- result := '/usr/local/lib'
|
|
|
|
|
|
+ begin
|
|
|
|
+ if CrossPrefix='' then
|
|
|
|
+ result := '/usr/local/lib'
|
|
|
|
+ end
|
|
else if OS = netbsd then
|
|
else if OS = netbsd then
|
|
- result := '/usr/pkg/lib'
|
|
|
|
|
|
+ begin
|
|
|
|
+ if CrossPrefix='' then
|
|
|
|
+ result := '/usr/pkg/lib'
|
|
|
|
+ end
|
|
else if OS = linux then
|
|
else if OS = linux then
|
|
case CPU of
|
|
case CPU of
|
|
i386: result := GetGccDirArch('cpui386','-m32');
|
|
i386: result := GetGccDirArch('cpui386','-m32');
|
|
@@ -5017,6 +5064,27 @@ begin
|
|
OS:=StringToOS({$I %FPCTARGETOS%});
|
|
OS:=StringToOS({$I %FPCTARGETOS%});
|
|
if FCompilerVersion='' then
|
|
if FCompilerVersion='' then
|
|
FCompilerVersion:={$I %FPCVERSION%};
|
|
FCompilerVersion:={$I %FPCVERSION%};
|
|
|
|
+{$endif HAS_UNIT_PROCESS}
|
|
|
|
+ end;
|
|
|
|
+ if (FSourceOS=osNone) then
|
|
|
|
+ begin
|
|
|
|
+{$ifdef HAS_UNIT_PROCESS}
|
|
|
|
+ // Detect compiler version/target from -i option
|
|
|
|
+ infosl:=TStringList.Create;
|
|
|
|
+ infosl.Delimiter:=' ';
|
|
|
|
+ infosl.DelimitedText:=GetCompilerInfo(GetCompiler,'-iDWSPSO', False, True);
|
|
|
|
+ if infosl.Count<>4 then
|
|
|
|
+ Raise EInstallerError.Create(SErrInvalidFPCInfo);
|
|
|
|
+ FCompilerDate:=infosl[0];
|
|
|
|
+ FFullCompilerVersion:=infosl[1];
|
|
|
|
+ FSourceCPU:=StringToCPU(infosl[2]);
|
|
|
|
+ FSourceOS:=StringToOS(infosl[3]);
|
|
|
|
+{$else HAS_UNIT_PROCESS}
|
|
|
|
+ // Defaults taken from compiler used to build fpmake
|
|
|
|
+ FSourceCPU:=StringToCPU({$I %FPCTARGETCPU%});
|
|
|
|
+ FSourceOS:=StringToOS({$I %FPCTARGETOS%});
|
|
|
|
+ FFullCompilerVersion:={$I %FPCFULLVERSION%};
|
|
|
|
+ FCompilerDate:={$I %FPCDATE%};
|
|
{$endif HAS_UNIT_PROCESS}
|
|
{$endif HAS_UNIT_PROCESS}
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|