说明:
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号