From b3351e169d90574271d8f6bd5d93bb07c9823e6c Mon Sep 17 00:00:00 2001 From: LongDirtyAnimAlf Date: Fri, 28 Apr 2017 17:17:14 +0200 Subject: [PATCH] Added cross-compilers for Darwin. Added arm-linux and arm-android for Darwin --- fpcupdeluxe.lps | 185 ++++++++++++++++++---------------------- fpcupdeluxemainform.pas | 49 ++++++++--- fpcuputil.pas | 16 ++++ installerfpc.pas | 7 +- m_any_to_androidarm.pas | 25 +++--- m_any_to_linuxarm.pas | 15 +++- 6 files changed, 166 insertions(+), 131 deletions(-) diff --git a/fpcupdeluxe.lps b/fpcupdeluxe.lps index e7fc1ade..040da528 100644 --- a/fpcupdeluxe.lps +++ b/fpcupdeluxe.lps @@ -4,11 +4,10 @@ - + - @@ -18,6 +17,7 @@ + @@ -61,7 +61,7 @@ - + @@ -81,22 +81,22 @@ - + + - - + + - - + @@ -110,8 +110,8 @@ - - + + @@ -204,8 +204,8 @@ - - + + @@ -416,8 +416,8 @@ - - + + @@ -445,8 +445,8 @@ - - + + @@ -458,8 +458,9 @@ - - + + + @@ -485,9 +486,9 @@ - - - + + + @@ -507,15 +508,15 @@ - - - + + + - - + + @@ -560,9 +561,9 @@ - - - + + + @@ -580,9 +581,9 @@ - - - + + + @@ -851,8 +852,8 @@ - - + + @@ -1282,7 +1283,9 @@ - + + + @@ -1384,9 +1387,9 @@ - - - + + + @@ -1578,9 +1581,9 @@ - - - + + + @@ -1642,8 +1645,8 @@ - - + + @@ -1936,9 +1939,9 @@ - - - + + + @@ -2006,7 +2009,7 @@ - + @@ -2165,8 +2168,8 @@ - - + + @@ -2192,84 +2195,64 @@ + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -2279,7 +2262,7 @@ - + diff --git a/fpcupdeluxemainform.pas b/fpcupdeluxemainform.pas index 6be003a4..a3bab9a2 100644 --- a/fpcupdeluxemainform.pas +++ b/fpcupdeluxemainform.pas @@ -154,7 +154,7 @@ implementation FPCUPBINSURL=''; {$endif} {$ifdef Darwin} - FPCUPBINSURL=''; + FPCUPBINSURL=FPCUPGITREPO+'/releases/download/darwinx64crossbins_v1.0'; {$endif} FPCUPLIBSURL=FPCUPGITREPO+'/releases/download/crosslibs_v1.0'; FPCUPDELUXEVERSION='1.2.0p'; @@ -963,7 +963,7 @@ procedure TForm1.Button5Click(Sender: TObject); // http://repo.or.cz/openal-soft/android.git or // https://github.com/michaliskambi/tremolo-android . if (FPCupManager.CrossOS_Target='android') - then FPCupManager.CrossOPT:='-CpARMV7A -CfVFPV3 ' + then FPCupManager.CrossOPT:='-CpARMV7A ' else FPCupManager.CrossOPT:='-CpARMV7A -CfVFPV3 -OoFASTMATH -CaEABIHF '; end; end; @@ -1008,7 +1008,7 @@ procedure TForm1.Button5Click(Sender: TObject); if NOT RealRun then begin - {$ifndef BSD} + {$IF not defined(BSD) OR defined(DARWIN)} // perhaps there were no libraries and/or binutils ... download them (if available) from fpcup on GitHub @@ -1027,7 +1027,11 @@ procedure TForm1.Button5Click(Sender: TObject); if FPCupManager.CrossOS_Target='linux' then begin + {$ifdef Darwin} + if FPCupManager.CrossCPU_Target='arm' then BinsURL:='LinuxARM.zip'; + {$else} if FPCupManager.CrossCPU_Target='arm' then BinsURL:='LinuxARM.rar'; + {$endif} if FPCupManager.CrossCPU_Target='aarch64' then BinsURL:='LinuxAarch64.rar'; if FPCupManager.CrossCPU_Target='i386' then BinsURL:='Linuxi386.rar'; if FPCupManager.CrossCPU_Target='x86_64' then BinsURL:='Linuxx64.rar'; @@ -1055,7 +1059,11 @@ procedure TForm1.Button5Click(Sender: TObject); end; if FPCupManager.CrossOS_Target='android' then begin - if FPCupManager.CrossCPU_Target='arm' then BinsURL:='AndroidARM.rar'; + {$ifdef Darwin} + if FPCupManager.CrossCPU_Target='arm' then BinsURL:='AndroidARM.zip'; + {$else} + if FPCupManager.CrossCPU_Target='arm' then BinsURL:='AndroidARM.rar'; + {$endif} if FPCupManager.CrossCPU_Target='aarch64' then BinsURL:='AndroidAArch64.rar'; end; if FPCupManager.CrossOS_Target='embedded' then @@ -1099,10 +1107,12 @@ procedure TForm1.Button5Click(Sender: TObject); end; end; - // tricky ... reset BinsURL in case the binutils and libs are already there ... to exit this retry ... ;-) - if (DirectoryExists(IncludeTrailingPathDelimiter(sInstallDir)+'cross'+BinPath)) - AND - (DirectoryExists(IncludeTrailingPathDelimiter(sInstallDir)+'cross'+LibPath)) + // bit tricky ... reset BinsURL in case the binutils and libs are already there ... to exit this retry ... ;-) + if ( + (NOT DirectoryIsEmpty(IncludeTrailingPathDelimiter(sInstallDir)+'cross'+BinPath)) + AND + (NOT DirectoryIsEmpty(IncludeTrailingPathDelimiter(sInstallDir)+'cross'+LibPath)) + ) then BinsURL:=''; if BinsURL<>'' then @@ -1136,11 +1146,15 @@ procedure TForm1.Button5Click(Sender: TObject); {$ifndef MSWINDOWS} TargetPath:=IncludeTrailingPathDelimiter(sInstallDir)+'cross'+BinPath+DirectorySeparator; {$endif} + if (NOT DirectoryExists(TargetPath)) then ForceDirectories(TargetPath); AddMessage('Going to extract archive into '+TargetPath); if UseNativeUnzip then begin + {$ifdef Darwin} + success:=(ExecuteCommand('unzip -o -d ' + TargetPath + ' ' + TargetFile, true)=0); + {$else} ProgressForm := TProgressForm.Create(Self); try FileUnzipper := TThreadedUnzipper.Create; @@ -1153,9 +1167,10 @@ procedure TForm1.Button5Click(Sender: TObject); finally if Assigned(FileUnzipper) then FileUnzipper := nil; end; - finally - ProgressForm.Free; - end; + finally + ProgressForm.Free; + end; + {$endif} end else begin @@ -1209,6 +1224,8 @@ procedure TForm1.Button5Click(Sender: TObject); AddMessage('Successfully downloaded the libraries.'); TargetPath:=IncludeTrailingPathDelimiter(sInstallDir); //TargetPath:=IncludeTrailingPathDelimiter(sInstallDir)+'cross'+LibPath+DirectorySeparator; + //if (NOT DirectoryExists(IncludeTrailingPathDelimiter(sInstallDir)+'cross'+LibPath)) then ForceDirectories(IncludeTrailingPathDelimiter(sInstallDir)+'cross'+LibPath); + AddMessage('Going to extract them into '+TargetPath); // many files to unpack for Darwin libs : do not show progress of unpacking files when unpacking for Darwin. @@ -1216,6 +1233,9 @@ procedure TForm1.Button5Click(Sender: TObject); if UseNativeUnzip then begin + {$ifdef Darwin} + success:=(ExecuteCommand('unzip -o -d ' + TargetPath + ' ' + TargetFile, true)=0); + {$else} ProgressForm := TProgressForm.Create(Self); try FileUnzipper := TThreadedUnzipper.Create; @@ -1228,9 +1248,10 @@ procedure TForm1.Button5Click(Sender: TObject); finally if Assigned(FileUnzipper) then FileUnzipper := nil; end; - finally - ProgressForm.Free; - end; + finally + ProgressForm.Free; + end; + {$endif} end else begin diff --git a/fpcuputil.pas b/fpcuputil.pas index 1dec6ceb..6d2582c4 100755 --- a/fpcuputil.pas +++ b/fpcuputil.pas @@ -266,6 +266,7 @@ function GetCrossCompilerName(Cpu_Target:string):string; function DoubleQuoteIfNeeded(FileName: string): string; function GetNumericalVersion(aVersion: string): word; function UppercaseFirstChar(s: String): String; +function DirectoryIsEmpty(Directory: string): Boolean; implementation @@ -1353,6 +1354,21 @@ function UppercaseFirstChar(s: String): String; result := UpperCase(ch) + LowerCase(rest); end; +function DirectoryIsEmpty(Directory: string): Boolean; +var + SR: TSearchRec; + i: Integer; +begin + Result:=(NOT DirectoryExists(Directory)); + if Result=true then exit; + SysUtils.FindFirst(IncludeTrailingPathDelimiter(Directory) + '*', faAnyFile, SR); + for i := 1 to 2 do + if (SR.Name = '.') or (SR.Name = '..') then + Result := SysUtils.FindNext(SR) <> 0; + SysUtils.FindClose(SR); +end; + + {TUnzipper} procedure TThreadedUnzipper.DoOnZipProgress; diff --git a/installerfpc.pas b/installerfpc.pas index 05d0286e..5a19e197 100755 --- a/installerfpc.pas +++ b/installerfpc.pas @@ -579,10 +579,15 @@ function TFPCCrossInstaller.BuildModuleCustom(ModuleName: string): boolean; {$endif} {$ifdef Darwin} - //if (CrossInstaller.TargetOS='iphonesim') then + if (CrossInstaller.TargetOS='macos') OR (CrossInstaller.TargetOS='darwin') OR (CrossInstaller.TargetOS='iphonesim') then begin s:=ResolveDots(IncludeTrailingPathDelimiter(CrossInstaller.LibsPath)+'../../'); CrossOptions:=CrossOptions+' -XR'+ExcludeTrailingPathDelimiter(s); + end + else + begin + CrossOptions:=CrossOptions+' -Xd'; + CrossOptions:=CrossOptions+' -Fl'+ExcludeTrailingPathDelimiter(CrossInstaller.LibsPath); end; {$endif} diff --git a/m_any_to_androidarm.pas b/m_any_to_androidarm.pas index 61f34313..192a3060 100644 --- a/m_any_to_androidarm.pas +++ b/m_any_to_androidarm.pas @@ -100,6 +100,10 @@ function TAny_ARMAndroid.GetLibs(Basepath:string): boolean; // begin simple: check presence of library file in basedir result:=SearchLibrary(Basepath,LibName); + // local paths based on libraries provided for or adviced by fpc itself + if not result then + result:=SimpleSearchLibrary(BasePath,DirName,LibName); + // if binaries already found, search for library belonging to these binaries !! if (not result) AND (Length(FBinUtilsPath)>0) AND (SearchModeUsed=smAuto) then begin @@ -123,14 +127,7 @@ function TAny_ARMAndroid.GetLibs(Basepath:string): boolean; end; end; - // first search local paths based on libbraries provided for or adviced by fpc itself - if not result then - result:=SimpleSearchLibrary(BasePath,DirName,LibName); - // search for a library provide by a standard android libraries install - - //C:\Users\\AppData\Local\Android\sdk - if (not result) AND (SearchModeUsed=smAuto) then begin for ndkversion:=High(NDKVERSIONNAMES) downto Low(NDKVERSIONNAMES) do @@ -233,7 +230,10 @@ function TAny_ARMAndroid.GetBinUtils(Basepath:string): boolean; var AsFile: string; PresetBinPath:string; - ndkversion,delphiversion,toolchain:byte; + ndkversion,toolchain:byte; + {$IFDEF MSWINDOWS} + delphiversion:byte; + {$ENDIF} begin result:=inherited; if result then exit; @@ -242,6 +242,9 @@ function TAny_ARMAndroid.GetBinUtils(Basepath:string): boolean; result:=SearchBinUtil(Basepath,AsFile); + if not result then + result:=SimpleSearchBinUtil(BasePath,DirName,AsFile); + // if libs already found, search for binutils belonging to this lib !! if (not result) AND (Length(FLibsPath)>0) AND (SearchModeUsed=smAuto) then begin @@ -285,9 +288,6 @@ function TAny_ARMAndroid.GetBinUtils(Basepath:string): boolean; end; end; - if not result then - result:=SimpleSearchBinUtil(BasePath,DirName,AsFile); - if (not result) AND (SearchModeUsed=smAuto) then begin for ndkversion:=High(NDKVERSIONNAMES) downto Low(NDKVERSIONNAMES) do @@ -403,7 +403,8 @@ function TAny_ARMAndroid.GetBinUtils(Basepath:string): boolean; // Architecture: e.g. ARMv6, ARMv7,... if StringListStartsWith(FCrossOpts,'-Cp')=-1 then begin - AsFile:='-CpARMV7A -CfVFPV3 -OoFASTMATH '; + //AsFile:='-CpARMV7A -CfVFPV3 -OoFASTMATH '; + AsFile:='-CpARMV7A '; FCrossOpts.Add(AsFile); //apparently earlier instruction sets unsupported by Android ShowInfo('Did not find any -Cp architecture parameter; using '+AsFile+'.'); AsFile:=StringReplace(AsFile,' ',LineEnding,[rfReplaceAll]); diff --git a/m_any_to_linuxarm.pas b/m_any_to_linuxarm.pas index 734e63cc..39428f76 100644 --- a/m_any_to_linuxarm.pas +++ b/m_any_to_linuxarm.pas @@ -73,7 +73,7 @@ function Tany_linuxarm.GetLibs(Basepath:string): boolean; // begin simple: check presence of library file in basedir result:=SearchLibrary(Basepath,LibName); - // local paths based on libbraries provided for or adviced by fpc itself + // local paths based on libraries provided for or adviced by fpc itself if not result then result:=SimpleSearchLibrary(BasePath,DirName,LibName); // also check in the gnueabi directory @@ -144,12 +144,21 @@ function Tany_linuxarm.GetBinUtils(Basepath:string): boolean; // Also allow for crossfpc naming if not result then begin - BinPrefixTry:='arm-linux-gnueabi'; + BinPrefixTry:='arm-linux-gnueabi-'; AsFile:=BinPrefixTry+'as'+GetExeExt; result:=SimpleSearchBinUtil(BasePath,DirName,AsFile); // also check in the gnueabi directory if not result then result:=SimpleSearchBinUtil(BasePath,DirName+'-gnueabi',AsFile); + {$ifdef Darwin} + if not result then + begin + // some special binutils, also working for RPi2 !! + BinPrefixTry:='armv8-rpi3-linux-gnueabihf-'; + AsFile:=BinPrefixTry+'as'+GetExeExt; + result:=SimpleSearchBinUtil(BasePath,DirName,AsFile); + end; + {$endif} if result then FBinUtilsPrefix:=BinPrefixTry; end; @@ -216,7 +225,7 @@ function Tany_linuxarm.GetBinUtils(Basepath:string): boolean; // Architecture: e.g. ARMv6, ARMv7,... if StringListStartsWith(FCrossOpts,'-Cp')=-1 then begin - FCrossOpts.Add('-CpARMV6'); //apparently earlier instruction sets unsupported by Android and Raspberry Pi + FCrossOpts.Add('-CpARMV6 '); //apparently earlier instruction sets unsupported by Android and Raspberry Pi ShowInfo('Did not find any -Cp architecture parameter; using -CpARMV6.',etInfo); end;