浏览代码

+ infrastructure for target specific resourcefile classes

git-svn-id: trunk@6564 -
florian 18 年之前
父节点
当前提交
4ceadcbc6e

+ 16 - 13
compiler/comprsrc.pas

@@ -25,15 +25,17 @@ unit comprsrc;
 
 
 interface
 interface
 
 
+  uses
+    Systems;
+
 type
 type
-   presourcefile=^tresourcefile;
-   tresourcefile=object
+   tresourcefile = class(TAbstractResourceFile)
    private
    private
-      fname : string;
+      fname : ansistring;
    public
    public
-      constructor Init(const fn:string);
-      destructor Done;
-      procedure  Compile;virtual;
+      constructor Create(const fn : ansistring);override;
+      procedure Compile;virtual;
+      procedure PostProcessResourcefile(const s : ansistring);virtual;
    end;
    end;
 
 
 procedure CompileResourceFiles;
 procedure CompileResourceFiles;
@@ -43,7 +45,7 @@ implementation
 
 
 uses
 uses
   SysUtils,
   SysUtils,
-  Systems,cutils,cfileutils,
+  cutils,cfileutils,
   Globtype,Globals,Verbose,Fmodule,
   Globtype,Globals,Verbose,Fmodule,
   Script;
   Script;
 
 
@@ -51,13 +53,13 @@ uses
                               TRESOURCEFILE
                               TRESOURCEFILE
 ****************************************************************************}
 ****************************************************************************}
 
 
-constructor tresourcefile.init(const fn:string);
+constructor tresourcefile.create(const fn : ansistring);
 begin
 begin
   fname:=fn;
   fname:=fn;
 end;
 end;
 
 
 
 
-destructor tresourcefile.done;
+procedure tresourcefile.PostProcessResourcefile(const s : ansistring);
 begin
 begin
 end;
 end;
 
 
@@ -121,6 +123,7 @@ begin
        end
        end
      end;
      end;
     end;
     end;
+  PostProcessResourcefile(maybequoted(resobj));
   { Update asmres when externmode is set }
   { Update asmres when externmode is set }
   if cs_link_nolink in current_settings.globalswitches then
   if cs_link_nolink in current_settings.globalswitches then
     AsmRes.AddLinkCommand(resbin,s,'');
     AsmRes.AddLinkCommand(resbin,s,'');
@@ -131,7 +134,7 @@ end;
 
 
 procedure CompileResourceFiles;
 procedure CompileResourceFiles;
 var
 var
-  hr : presourcefile;
+  resourcefile : tresourcefile;
 begin
 begin
   { OS/2 (EMX) must be processed elsewhere (in the linking/binding stage).
   { OS/2 (EMX) must be processed elsewhere (in the linking/binding stage).
     same with MacOS}
     same with MacOS}
@@ -141,9 +144,9 @@ begin
      begin
      begin
        if target_info.res<>res_none then
        if target_info.res<>res_none then
          begin
          begin
-           hr:=new(presourcefile,init(current_module.ResourceFiles.getfirst));
-           hr^.compile;
-           dispose(hr,done);
+           resourcefile:=TResourceFile(resinfos[target_info.res]^.resourcefileclass).create(current_module.ResourceFiles.getfirst);
+           resourcefile.compile;
+           resourcefile.free;
          end
          end
        else
        else
          Message(scan_e_resourcefiles_not_supported);
          Message(scan_e_resourcefiles_not_supported);

+ 1 - 1
compiler/psub.pas

@@ -816,7 +816,7 @@ implementation
                      tg.direction:=1;
                      tg.direction:=1;
                    end;
                    end;
                end;
                end;
-            
+
 {$endif}
 {$endif}
             { Create register allocator }
             { Create register allocator }
             cg.init_register_allocators;
             cg.init_register_allocators;

+ 10 - 2
compiler/systems.pas

@@ -215,6 +215,12 @@ interface
        TAbstractAssemblerClass = class of TAbstractAssembler;
        TAbstractAssemblerClass = class of TAbstractAssembler;
 
 
 
 
+       TAbstractResourceFile = class
+         constructor create(const fn : ansistring);virtual;abstract;
+       end;
+       TAbstractResourceFileClass = class of TAbstractResourceFile;
+
+
        palignmentinfo = ^talignmentinfo;
        palignmentinfo = ^talignmentinfo;
        talignmentinfo = record
        talignmentinfo = record
          procalign,
          procalign,
@@ -263,6 +269,7 @@ interface
           id      : tres;
           id      : tres;
           resbin  : string[8];
           resbin  : string[8];
           rescmd  : string[50];
           rescmd  : string[50];
+          resourcefileclass : TAbstractResourceFileClass;
        end;
        end;
 
 
        pdbginfo = ^tdbginfo;
        pdbginfo = ^tdbginfo;
@@ -414,7 +421,7 @@ interface
     procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
     procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
 
 
     procedure RegisterTarget(const r:tsysteminfo);
     procedure RegisterTarget(const r:tsysteminfo);
-    procedure RegisterRes(const r:tresinfo);
+    procedure RegisterRes(const r:tresinfo; rcf : TAbstractResourceFileClass);
     procedure RegisterAr(const r:tarinfo);
     procedure RegisterAr(const r:tarinfo);
     { Register the external linker. This routine is called to setup the
     { Register the external linker. This routine is called to setup the
       class to use for the linker. It returns the tsysteminfo structure
       class to use for the linker. It returns the tsysteminfo structure
@@ -658,7 +665,7 @@ begin
 end;
 end;
 
 
 
 
-procedure RegisterRes(const r:tresinfo);
+procedure RegisterRes(const r:tresinfo; rcf : TAbstractResourceFileClass);
 var
 var
   t : tres;
   t : tres;
 begin
 begin
@@ -668,6 +675,7 @@ begin
   else
   else
     Getmem(resinfos[t],sizeof(tresinfo));
     Getmem(resinfos[t],sizeof(tresinfo));
   resinfos[t]^:=r;
   resinfos[t]^:=r;
+  resinfos[t]^.resourcefileclass:=rcf;
 end;
 end;
 
 
 
 

+ 2 - 2
compiler/systems/t_emx.pas

@@ -41,7 +41,7 @@ implementation
      cutils,cfileutils,cclasses,
      cutils,cfileutils,cclasses,
      globtype,comphook,systems,symconst,symsym,symdef,
      globtype,comphook,systems,symconst,symsym,symdef,
      globals,verbose,fmodule,script,ogbase,
      globals,verbose,fmodule,script,ogbase,
-     import,link,i_emx,ppu;
+     comprsrc,import,link,i_emx,ppu;
 
 
   type
   type
     TImportLibEMX=class(timportlib)
     TImportLibEMX=class(timportlib)
@@ -526,6 +526,6 @@ end;
 initialization
 initialization
   RegisterExternalLinker(system_i386_emx_info,TLinkerEMX);
   RegisterExternalLinker(system_i386_emx_info,TLinkerEMX);
   RegisterImport(system_i386_emx,TImportLibEMX);
   RegisterImport(system_i386_emx,TImportLibEMX);
-  RegisterRes(res_emxbind_info);
+  RegisterRes(res_emxbind_info,TResourceFile);
   RegisterTarget(system_i386_emx_info);
   RegisterTarget(system_i386_emx_info);
 end.
 end.

+ 3 - 2
compiler/systems/t_linux.pas

@@ -72,6 +72,7 @@ implementation
     fmodule,
     fmodule,
     aasmbase,aasmtai,aasmdata,aasmcpu,cpubase,
     aasmbase,aasmtai,aasmdata,aasmcpu,cpubase,
     cgbase,cgobj,cgutils,ogbase,ncgutil,
     cgbase,cgobj,cgutils,ogbase,ncgutil,
+    comprsrc,
     i_linux
     i_linux
     ;
     ;
 
 
@@ -891,7 +892,7 @@ initialization
   RegisterImport(system_i386_linux,timportliblinux);
   RegisterImport(system_i386_linux,timportliblinux);
   RegisterExport(system_i386_linux,texportliblinux);
   RegisterExport(system_i386_linux,texportliblinux);
   RegisterTarget(system_i386_linux_info);
   RegisterTarget(system_i386_linux_info);
-  RegisterRes(res_elf32_info);
+  RegisterRes(res_elf32_info,TResourceFile);
 
 
   RegisterExternalLinker(system_x86_6432_linux_info,TLinkerLinux);
   RegisterExternalLinker(system_x86_6432_linux_info,TLinkerLinux);
   RegisterImport(system_x86_6432_linux,timportliblinux);
   RegisterImport(system_x86_6432_linux,timportliblinux);
@@ -927,7 +928,7 @@ initialization
   RegisterImport(system_x86_64_linux,timportliblinux);
   RegisterImport(system_x86_64_linux,timportliblinux);
   RegisterExport(system_x86_64_linux,texportliblinux);
   RegisterExport(system_x86_64_linux,texportliblinux);
   RegisterTarget(system_x86_64_linux_info);
   RegisterTarget(system_x86_64_linux_info);
-  RegisterRes(res_elf64_info);
+  RegisterRes(res_elf64_info,TResourceFile);
 {$endif x86_64}
 {$endif x86_64}
 {$ifdef SPARC}
 {$ifdef SPARC}
   RegisterExternalLinker(system_sparc_linux_info,TLinkerLinux);
   RegisterExternalLinker(system_sparc_linux_info,TLinkerLinux);

+ 4 - 3
compiler/systems/t_palmos.pas

@@ -45,7 +45,8 @@ implementation
     uses
     uses
        SysUtils,
        SysUtils,
        cutils,cfileutils,cclasses,
        cutils,cfileutils,cclasses,
-       globtype,globals,systems,verbose,script,fmodule,i_palmos;
+       globtype,globals,systems,verbose,script,fmodule,i_palmos,
+       comprsrc;
 
 
 {****************************************************************************
 {****************************************************************************
                                TLinkerPalmOS
                                TLinkerPalmOS
@@ -208,10 +209,10 @@ end;
 initialization
 initialization
 {$ifdef m68k}
 {$ifdef m68k}
   RegisterTarget(system_m68k_palmos_info);
   RegisterTarget(system_m68k_palmos_info);
-  RegisterRes(res_m68k_palmos_info);
+  RegisterRes(res_m68k_palmos_info,TResourceFile);
 {$endif m68k}
 {$endif m68k}
 {$ifdef arm}
 {$ifdef arm}
   RegisterTarget(system_arm_palmos_info);
   RegisterTarget(system_arm_palmos_info);
-  RegisterRes(res_arm_palmos_info);
+  RegisterRes(res_arm_palmos_info,TResourceFile);
 {$endif arm}
 {$endif arm}
 end.
 end.

+ 8 - 4
compiler/systems/t_win.pas

@@ -31,7 +31,7 @@ interface
        symconst,symdef,symsym,
        symconst,symdef,symsym,
        script,gendef,
        script,gendef,
        cpubase,
        cpubase,
-       import,export,link,cgobj,i_win;
+       import,export,link,comprsrc,cgobj,i_win;
 
 
 
 
     const
     const
@@ -91,6 +91,10 @@ interface
       end;
       end;
 
 
 
 
+      TWinResourceFile = class(TResourceFile)
+      end;
+
+
 implementation
 implementation
 
 
   uses
   uses
@@ -1718,7 +1722,7 @@ initialization
   RegisterImport(system_i386_win32,TImportLibWin);
   RegisterImport(system_i386_win32,TImportLibWin);
   RegisterExport(system_i386_win32,TExportLibWin);
   RegisterExport(system_i386_win32,TExportLibWin);
   RegisterDLLScanner(system_i386_win32,TDLLScannerWin);
   RegisterDLLScanner(system_i386_win32,TDLLScannerWin);
-  RegisterRes(res_gnu_windres_info);
+  RegisterRes(res_gnu_windres_info,TWinResourceFile);
   RegisterTarget(system_i386_win32_info);
   RegisterTarget(system_i386_win32_info);
   { WinCE }
   { WinCE }
   RegisterExternalLinker(system_i386_wince_info,TExternalLinkerWin);
   RegisterExternalLinker(system_i386_wince_info,TExternalLinkerWin);
@@ -1733,7 +1737,7 @@ initialization
   RegisterImport(system_x86_64_win64,TImportLibWin);
   RegisterImport(system_x86_64_win64,TImportLibWin);
   RegisterExport(system_x86_64_win64,TExportLibWin);
   RegisterExport(system_x86_64_win64,TExportLibWin);
   RegisterDLLScanner(system_x86_64_win64,TDLLScannerWin);
   RegisterDLLScanner(system_x86_64_win64,TDLLScannerWin);
-  RegisterRes(res_gnu_windres_info);
+  RegisterRes(res_gnu_windres_info,TWinResourceFile);
   RegisterTarget(system_x64_win64_info);
   RegisterTarget(system_x64_win64_info);
 {$endif x86_64}
 {$endif x86_64}
 {$ifdef arm}
 {$ifdef arm}
@@ -1741,7 +1745,7 @@ initialization
   RegisterInternalLinker(system_arm_wince_info,TInternalLinkerWin);
   RegisterInternalLinker(system_arm_wince_info,TInternalLinkerWin);
   RegisterImport(system_arm_wince,TImportLibWin);
   RegisterImport(system_arm_wince,TImportLibWin);
   RegisterExport(system_arm_wince,TExportLibWin);
   RegisterExport(system_arm_wince,TExportLibWin);
-  RegisterRes(res_gnu_wince_windres_info);
+  RegisterRes(res_gnu_wince_windres_info,TWinResourceFile);
   RegisterTarget(system_arm_wince_info);
   RegisterTarget(system_arm_wince_info);
 {$endif arm}
 {$endif arm}
 end.
 end.