秋·风

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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

 

posted on 2025-03-20 13:17  秋·风  阅读(346)  评论(0)    收藏  举报