Browse Source

Try to avoid use of native libgcc directory when cross-compiling.

  Add FSourceCPU, FSourceOS, FCompilerDate FFullCompilerVersion fields to TCustomDefaults class.
  Set these new fields by also parsing FPC -iDWSPSO output.
  Use these fields to try to correctly guess if native gcc should be used to
  try to find libgcc directory, or only $BINUTILSPREFIX prepended gcc.

git-svn-id: trunk@48152 -
pierre 4 years ago
parent
commit
1fa5edd34e
1 changed files with 71 additions and 3 deletions
  1. 71 3
      packages/fpmkunit/src/fpmkunit.pp

+ 71 - 3
packages/fpmkunit/src/fpmkunit.pp

@@ -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;