+ infrastructure for target specific resourcefile classes

git-svn-id: trunk@6564 -
This commit is contained in:
florian 2007-02-19 19:02:21 +00:00
parent 2566e38eae
commit 4ceadcbc6e
7 changed files with 44 additions and 27 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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