說明:
1、sipeed--為用戶名稱,具體操作時修改為你當前的用戶名稱就可以。
2、已修改的5個lazarus源碼及ppcrv64的下載地址:
通過網盤分享的文件:riscv64_fpc
鏈接: https://pan.baidu.com/s/1BjMZOJIZbNvmy43ts-R1YA?pwd=p68u 提取碼: p68u
3、在Sipeed荔枝派[LicheePi 4A](CPU:TH1520)實測通過。
可能是首個在riscv64環境運行的lazarus版本。
一、前期工作:
1、在windows版lazarus交叉編譯出ppcrv64,將ppcrv64拷貝到riscv64設備/home/sipeed/fpc/fpcbootstrap。
2、在riscv64設備
將下載好用fpc/lazarus源碼,解壓拷貝到fpc目錄,目錄結構如下:
/home/sipeed/fpc
fpcsrc
lazarus
fpcbootstrap
二、編譯FPC源碼
cd fpcsrc make install CPU_TARGET=riscv64 OS_TARGET=linux CPU_SOURCE=riscv64 OS_SOURCE=linux OPT='-gl -O2' FPC=/home/sipeed/fpc/fpcbootstrap/ppcrv64 OVERRIDEVERSIONCHECK=1 PREFIX=/home/sipeed/fpc/fpc -j16
編譯參數說明:
CPU_TARGET=riscv64 //目標CPU類型,常用的CPU:x86_64 / i386 / aarch64 / riscv64 / loongarch64
OS_TARGET=linux //目標的操作系統 linux / win64 /win32
CPU_SOURCE=riscv64 //源CPU類型--當前電腦使用的CPU類型
OS_SOURCE=linux //源OS --當前電腦使用的操作系統類型
FPC=/home/lbz/fpc/fpcbootstrap/ppcrv64 //fpc編譯器所在的目錄(用絕對路徑)
PREFIX=/home/sipeed/fpc/fpc //最后的fpc是編譯出來FPC所在目錄名稱
2、編譯完成后,生成fpc.cfg
cd /fpc/bin ./fpcmkcfg -o fpc.cfg
3、修改fpc.cfg,將units路徑用絕對目錄指定
# Search for $fpctarget/$fpcsubarch-$fpcmemorymodel/ subdirectory first # for i8086 CPU #ifdef cpui8086 -Fu/units/$fpctarget/$fpcsubarch-$fpcmemorymodel -Fu/units/$fpctarget/$fpcsubarch-$fpcmemorymodel/* -Fu/units/$fpctarget/$fpcsubarch-$fpcmemorymodel/rtl #endif # searchpath for units and other system dependent things -Fu/units/$fpctarget -Fu/units/$fpctarget/* -Fu/units/$fpctarget/rtl #IFDEF FPCAPACHE_1_3 -Fu/units/$fpctarget/httpd13/ #ELSE #IFDEF FPCAPACHE_2_0 -Fu/units/$fpctarget/httpd20 #ELSE -Fu/units/$fpctarget/httpd22 #ENDIF #ENDIF
改為:
# Search for $fpctarget/$fpcsubarch-$fpcmemorymodel/ subdirectory first # for i8086 CPU #ifdef cpui8086 -Fu/home/lbz/fpcupdeluxe4/fpc/lib/fpc/3.3.1/units/$fpctarget/$fpcsubarch-$fpcmemorymodel -Fu/home/lbz/fpcupdeluxe4/fpc/lib/fpc/3.3.1/units/$fpctarget/$fpcsubarch-$fpcmemorymodel/* -Fu/home/lbz/fpcupdeluxe4/fpc/lib/fpc/3.3.1/units/$fpctarget/$fpcsubarch-$fpcmemorymodel/rtl #endif # searchpath for units and other system dependent things -Fu/home/sipeed/fpc/fpc/lib/fpc/3.3.1/units/$fpctarget -Fu/home/sipeed/fpc/fpc/lib/fpc/3.3.1/units/$fpctarget/* -Fu/home/sipeed/fpc/fpc/lib/fpc/3.3.1/units/$fpctarget/rtl #IFDEF FPCAPACHE_1_3 -Fu/home/sipeed/fpc/fpc/lib/fpc/3.3.1/units/$fpctarget/httpd13/ #ELSE #IFDEF FPCAPACHE_2_0 -Fu/home/sipeed/fpc/fpc/lib/fpc/3.3.1/units/$fpctarget/httpd20 #ELSE -Fu/home/sipeed/fpc/fpc/lib/fpc/3.3.1/units/$fpctarget/httpd22 #ENDIF #ENDIF
將修改后的fpc.cfg拷貝到~/.fpc.cfg
cp fpc.cfg ~/.fpc.cfg
5、拷貝/home/sipeed/fpc/fpc/lib/fpc/3.3.1目錄的ppcrv64到/home/sipeed/fpc/fpc/bin目錄
cd fpc/bin cp /home/sipeed/fpc/fpc/lib/fpc/3.3.1/ppcrv64 /home/sipeed/fpc/fpc/bin
到此,fpc源碼已編譯完成。
三、編譯lazarus
編譯lazarus版要修改5個源碼,修改后按以下操作就可以,修改位置在文章最后。
D:\fpcupdeluxe4\lazarus\packager\pkgmanager.pas
D:\fpcupdeluxe4\lazarus\packager\PackageEditor.pas
D:\fpcupdeluxe4\lazarus\components\ideintf\FormEditingintf.pas
D:\fpcupdeluxe4\lazarus\components\lazdebuggers\lazdebuggerfp\fpdebugvalueconvertors.pas
D:\fpcupdeluxe4\lazarus\components\lazdebuggers\lazdebuggerfp\fpdebuggerresultdata.pas
1、設置路徑:
export PATH=/home/sipeed/fpc/fpc/bin/loongarch64-linux:$PATH
2、編譯
cd lazarus make
3、lazarus編譯完成后,在lazarus目錄新建lazarus.cfg文件,這個文件的配置目錄指向config_lazarus
添加完成后保存退出
--primary-config-path=/home/sipeed/fpc/config_lazarus
編譯完成后就可以運行lazarus


lazarus源碼修改位置:
1、D:\fpcupdeluxe4\lazarus\components\ideintf\FormEditingintf.pas
*** 93,99 **** procedure SetLookupRootBounds(ALeft, ATop, AWidth, AHeight: integer); virtual; function DockedDesigner: boolean; virtual; property NonFormDesigner: INonFormDesigner read FNonFormDesigner {$if not defined(cpuriscv64)} implements INonFormDesigner{$endif}; property LookupRoot: TComponent read FLookupRoot write SetLookupRoot; published property Left: Integer index 0 read GetPublishedBounds write SetPublishedBounds;
*** 106,121 **** { TFrameProxyDesignerForm } TFrameProxyDesignerForm = class(TNonFormProxyDesignerForm{$if not defined(cpuriscv64)}, IFrameDesigner{$endif}) private function GetFrameDesigner: IFrameDesigner; publicproperty FrameDesigner: IFrameDesigner read GetFrameDesigner{$if not defined(cpuriscv64)}implements IFrameDesigner{$endif}; end; { TNonControlProxyDesignerForm } TNonControlProxyDesignerForm = class(TNonFormProxyDesignerForm{$if not defined(cpuriscv64)}, INonControlDesigner{$endif}) private FMediator: TDesignerMediator; function GetNonControlDesigner: INonControlDesigner;
*** 122,128 **** protected procedure SetMediator(AValue: TDesignerMediator); virtual; public property NonControlDesigner: INonControlDesigner read GetNonControlDesigner{$if not defined(cpuriscv64)} implements INonControlDesigner{$endif}; property Mediator: TDesignerMediator read FMediator write SetMediator; end;
2、D:\fpcupdeluxe4\lazarus\packager\pkgmanager.pas:
--- 1632,1638 ---- if o is TTreeView then begin PkgEdit:=PackageEditors.TreeViewToPkgEditor(TTreeView(o)); if PkgEdit<>nil then Result:= {$if not defined(cpuriscv64)}PkgEdit{$else}nil{$endif} else begin aProjInsp:=ProjInspector.TreeViewToInspector(TTreeView(o)); if aProjInsp<>nil then
--- 2859,2868 ---- TargetDir: String; begin Result:=false; {$if not defined(cpuriscv64)} if Sender is TPackageEditorForm then FilesEdit:=TPackageEditorForm(Sender) else if {$endif}Sender is TProjectInspectorForm then FilesEdit:=TProjectInspectorForm(Sender) else begin debugln(['Error: (lazarus) TPkgManager.CopyMoveFiles wrong Sender: ',DbgSName(Sender)]);
3、D:\fpcupdeluxe4\lazarus\packager\PackageEditor.pas:
*** 156,162 **** { TPackageEditorForm } ! TPackageEditorForm = class(TBasePackageEditor{$if not defined(cpuriscv64)},IFilesEditorInterface{$endif}) MenuItem1: TMenuItem; mnuAddNewDiskFiles: TMenuItem; mnuAddFPMakeReq: TMenuItem;
4、D:\fpcupdeluxe4\lazarus\components\lazdebuggers\lazdebuggerfp\fpdebuggerresultdata.pas:
*** 154,160 **** end; if (CurConv <> nil) and CurConv.CanHandleValue(AnFpValue, Debugger) then begin
{$if not defined(cpuriscv64)}AnResFld := AnResData.CreateValueHandlerResult(CurConv);{$endif} if (FMaxTotalConv <= 0) then ReleaseRefAndNil(CurConv)
5、D:\fpcupdeluxe4\lazarus\components\lazdebuggers\lazdebuggerfp\fpdebugvalueconvertors.pas:
--- 20,26 ---- - Any setting that the IDE may need to store, should be published *) TFpDbgValueConverter = class(TRefCountedObject{$if not defined(cpuriscv64)} , ILazDbgValueConverterIntf{$endif}) private FLastErrror: TFpError; protected
--- 32,38 ---- function GetRegistryEntry: TLazDbgValueConvertRegistryEntryClass; virtual; constructor Create; virtual; procedure Assign(ASource: TFpDbgValueConverter); virtual; {$if not defined(cpuriscv64)} function CreateCopy: ILazDbgValueConverterIntf; virtual;{$endif} function NeedConversionLimit: Boolean; virtual; (* CanHandleValue must return the SAME RESULT if called repeatedly (e.g. in an array) CanHandleValue must NOT depend on DATA, or anything that can change
--- 66,72 ---- { TConverterSettingsFrameBase } TConverterSettingsFrameBase = class(TFrame{$if not defined(cpuriscv64)}, ILazDbgValueConverterSettingsFrameIntf{$endif}) protected function GetFrame: TObject; virtual; public
--- 153,159 ---- end; { TFpDbgValueConverter } {$if not defined(cpuriscv64)} function TFpDbgValueConverter.CreateCopy: ILazDbgValueConverterIntf; var c: TFpDbgValueConverter; *************** *** 163,167 **** --- 162,168 ---- c.Assign(Self); Result := c; end; {$endif} function TFpDbgValueConverter.NeedConversionLimit: Boolean; begin
--- 404,410 ---- class function TFpDbgValueConverterRegistryEntry.CreateValueConvertorIntf: ILazDbgValueConverterIntf; begin {$if not defined(cpuriscv64)} Result := TFpDbgValueConverterClass(GetConvertorClass).Create;{$endif} end;
--- 471,477 ---- function TFpDbgValueConverterVariantToLStr.GetSettingsFrame: ILazDbgValueConverterSettingsFrameIntf; begin {$if not defined(cpuriscv64)} Result := TConverterWithFuncCallSettingsFrame.Create(nil);{$endif} end; class function TFpDbgValueConverterVariantToLStr.GetName: String;

浙公網安備 33010602011771號