summaryrefslogtreecommitdiff
path: root/compiler/comprsrc.pas
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/comprsrc.pas')
-rw-r--r--compiler/comprsrc.pas185
1 files changed, 185 insertions, 0 deletions
diff --git a/compiler/comprsrc.pas b/compiler/comprsrc.pas
new file mode 100644
index 0000000000..35910d176e
--- /dev/null
+++ b/compiler/comprsrc.pas
@@ -0,0 +1,185 @@
+{
+ Copyright (c) 1998-2002 by Florian Klaempfl
+
+ Handles the resource files handling
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ ****************************************************************************
+}
+unit comprsrc;
+
+{$i fpcdefs.inc}
+
+interface
+
+type
+ presourcefile=^tresourcefile;
+ tresourcefile=object
+ private
+ fname : string;
+ public
+ constructor Init(const fn:string);
+ destructor Done;
+ procedure Compile;virtual;
+ end;
+
+procedure CompileResourceFiles;
+
+
+implementation
+
+uses
+{$IFDEF USE_SYSUTILS}
+ SysUtils,
+{$ELSE USE_SYSUTILS}
+ dos,
+{$ENDIF USE_SYSUTILS}
+ Systems,cutils,Globtype,Globals,Verbose,Fmodule,
+ Script;
+
+{****************************************************************************
+ TRESOURCEFILE
+****************************************************************************}
+
+constructor tresourcefile.init(const fn:string);
+begin
+ fname:=fn;
+end;
+
+
+destructor tresourcefile.done;
+begin
+end;
+
+
+procedure tresourcefile.compile;
+var
+ respath,
+ srcfilepath : dirstr;
+ n : namestr;
+{$IFDEF USE_SYSUTILS}
+{$ELSE USE_SYSUTILS}
+ e : extstr;
+{$ENDIF USE_SYSUTILS}
+ s,
+ resobj,
+ resbin : string;
+ resfound,
+ objused : boolean;
+begin
+ resbin:='';
+ resfound:=false;
+ if utilsdirectory<>'' then
+ resfound:=FindFile(utilsprefix+target_res.resbin+source_info.exeext,utilsdirectory,resbin);
+ if not resfound then
+ resfound:=FindExe(utilsprefix+target_res.resbin,resbin);
+ { get also the path to be searched for the windres.h }
+{$IFDEF USE_SYSUTILS}
+ respath := SplitPath(resbin);
+{$ELSE USE_SYSUTILS}
+ fsplit(resbin,respath,n,e);
+{$ENDIF USE_SYSUTILS}
+ if (not resfound) and not(cs_link_extern in aktglobalswitches) then
+ begin
+ Message(exec_e_res_not_found);
+ aktglobalswitches:=aktglobalswitches+[cs_link_extern];
+ end;
+{$IFDEF USE_SYSUTILS}
+ srcfilepath := SplitPath(current_module.mainsource^);
+{$ELSE USE_SYSUTILS}
+ fsplit(current_module.mainsource^,srcfilepath,n,e);
+{$ENDIF USE_SYSUTILS}
+ if not path_absolute(fname) then
+ fname:=srcfilepath+fname;
+ resobj:=ForceExtension(fname,target_info.resobjext);
+ s:=target_res.rescmd;
+ ObjUsed:=(pos('$OBJ',s)>0);
+ Replace(s,'$OBJ',maybequoted(resobj));
+ Replace(s,'$RES',maybequoted(fname));
+ { windres doesn't like empty include paths }
+ if respath='' then
+ respath:='.';
+ Replace(s,'$INC',maybequoted(respath));
+ if (target_info.system = system_i386_win32) and
+ (srcfilepath<>'') then
+ s:=s+' --include '+maybequoted(srcfilepath);
+{ Execute the command }
+ if not (cs_link_extern in aktglobalswitches) then
+ begin
+ Message1(exec_i_compilingresource,fname);
+ Message2(exec_d_resbin_params,resbin,s);
+{$IFDEF USE_SYSUTILS}
+ try
+ if ExecuteProcess(resbin,s) <> 0 then
+ begin
+ Message(exec_e_error_while_linking);
+ aktglobalswitches:=aktglobalswitches+[cs_link_extern];
+ end;
+ except
+ on E:EOSError do
+ begin
+ Message(exec_e_cant_call_linker);
+ aktglobalswitches:=aktglobalswitches+[cs_link_extern];
+ end
+ end;
+{$ELSE USE_SYSUTILS}
+ swapvectors;
+ exec(resbin,s);
+ swapvectors;
+ if (doserror<>0) then
+ begin
+ Message(exec_e_cant_call_linker);
+ aktglobalswitches:=aktglobalswitches+[cs_link_extern];
+ end
+ else
+ if (dosexitcode<>0) then
+ begin
+ Message(exec_e_error_while_linking);
+ aktglobalswitches:=aktglobalswitches+[cs_link_extern];
+ end;
+{$ENDIF USE_SYSUTILS}
+ end;
+ { Update asmres when externmode is set }
+ if cs_link_extern in aktglobalswitches then
+ AsmRes.AddLinkCommand(resbin,s,'');
+ if ObjUsed then
+ current_module.linkotherofiles.add(resobj,link_allways);
+end;
+
+
+procedure CompileResourceFiles;
+var
+ hr : presourcefile;
+begin
+ { OS/2 (EMX) must be processed elsewhere (in the linking/binding stage).
+ same with MacOS}
+ if not (target_info.system in [system_i386_os2,
+ system_i386_emx,system_powerpc_macos]) then
+ While not current_module.ResourceFiles.Empty do
+ begin
+ if target_info.res<>res_none then
+ begin
+ hr:=new(presourcefile,init(current_module.ResourceFiles.getfirst));
+ hr^.compile;
+ dispose(hr,done);
+ end
+ else
+ Message(scan_e_resourcefiles_not_supported);
+ end;
+end;
+
+
+end.