From a13ce1dfb43bbcea65ca8e194ef4124564c6f688 Mon Sep 17 00:00:00 2001 From: florian Date: Sat, 6 Sep 2003 10:01:11 +0000 Subject: [PATCH] + added *_watcom units --- compiler/systems/i_watcom.pas | 110 +++++++++++++++++++++ compiler/systems/t_watcom.pas | 175 ++++++++++++++++++++++++++++++++++ 2 files changed, 285 insertions(+) create mode 100644 compiler/systems/i_watcom.pas create mode 100644 compiler/systems/t_watcom.pas diff --git a/compiler/systems/i_watcom.pas b/compiler/systems/i_watcom.pas new file mode 100644 index 0000000000..2dff2d9209 --- /dev/null +++ b/compiler/systems/i_watcom.pas @@ -0,0 +1,110 @@ +{ + $Id$ + Copyright (c) 1998-2002 by Peter Vreman + + This unit implements support information structures for go32v2 + + 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. + **************************************************************************** +} +{ This unit implements support information structures for go32v2. } +unit i_watcom; + +{$i fpcdefs.inc} + + interface + + uses + systems; + + const + system_i386_watcom_info : tsysteminfo = + ( + system : system_i386_Watcom; + name : 'Watcom compatible DOS extenders'; + shortname : 'WATCOM'; + flags : []; + cpu : cpu_i386; + unit_env : 'WATCOMUNITS'; + extradefines : 'DPMI'; + sourceext : '.pp'; + pasext : '.pas'; + exeext : '.exe'; + defext : '.def'; + scriptext : '.bat'; + smartext : '.sl'; + unitext : '.ppu'; + unitlibext : '.ppl'; + asmext : '.asm'; + objext : '.obj'; + resext : '.res'; + resobjext : '.or'; + sharedlibext : '.dll'; + staticlibext : '.a'; + staticlibprefix : ''; + sharedlibprefix : ''; + sharedClibext : '.dll'; + staticClibext : '.a'; + staticClibprefix : ''; + sharedClibprefix : ''; + Cprefix : '_'; + newline : #13#10; + dirsep : '\'; + files_case_relevent : false; + assem : as_i386_coff; + assemextern : as_gas; + link : nil; + linkextern : nil; + ar : ar_gnu_ar; + res : res_none; + script : script_dos; + endian : endian_little; + alignment : + ( + procalign : 4; + loopalign : 4; + jumpalign : 0; + constalignmin : 0; + constalignmax : 4; + varalignmin : 0; + varalignmax : 4; + localalignmin : 0; + localalignmax : 4; + paraalign : 2; + recordalignmin : 0; + recordalignmax : 2; + maxCrecordalign : 4 + ); + first_parm_offset : 8; + heapsize : 2048*1024; + stacksize : 16384; + DllScanSupported : false; + use_function_relative_addresses : true + ); + + implementation + +initialization +{$ifdef cpu86} + {$ifdef watcom} + set_source_info(system_i386_watcom_info); + {$endif watcom} +{$endif cpu86} +end. +{ + $Log$ + Revision 1.1 2003-09-06 10:01:11 florian + + added *_watcom units +} diff --git a/compiler/systems/t_watcom.pas b/compiler/systems/t_watcom.pas new file mode 100644 index 0000000000..44305daea5 --- /dev/null +++ b/compiler/systems/t_watcom.pas @@ -0,0 +1,175 @@ +{ + $Id$ + Copyright (c) 2003 by Wiktor Sywula + + This unit implements support import, export, link routines + for the (i386) Watcom target + + 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 t_watcom; + +{$i fpcdefs.inc} + + interface + + uses + link; + + type + plinkerwatcom=^tlinkerwatcom; + tlinkerwatcom=class(texternallinker) + private + Function WriteResponseFile(isdll:boolean) : Boolean; + public + constructor create;override; + procedure SetDefaultInfo;virtual; + function MakeExecutable:boolean;virtual; +{ function MakeSharedLibrary:boolean;virtual;} + end; + + + implementation + + uses + cclasses,cutils,strings,globtype,globals,systems,verbose,script,fmodule,i_watcom; + + +{**************************************************************************** + TLinkerWatcom +****************************************************************************} + +Constructor TLinkerWatcom.Create; +begin + Inherited Create; + SharedLibFiles.doubles:=true; + StaticLibFiles.doubles:=true; +end; + + +procedure TLinkerWatcom.SetDefaultInfo; +begin + with Info do + ExeCmd[1]:='wlink system causeway option quiet $OPT $STRIP name $EXE @$RES'; +end; + +Function TLinkerWatcom.WriteResponseFile(isdll:boolean) : Boolean; +Var + linkres : TLinkRes; + i : longint; + s : string; + linklibc : boolean; +begin + WriteResponseFile:=False; + + { Open link.res file } + LinkRes:=TLinkRes.Create(outputexedir+Info.ResName); + + { Write staticlibraries } + if not StaticLibFiles.Empty then + While not StaticLibFiles.Empty do + begin + S:=StaticLibFiles.GetFirst; + LinkRes.AddFileName('file '+GetShortName(s)) + end; + +(* + + { Write sharedlibraries like -l, also add the needed dynamic linker + here to be sure that it gets linked this is needed for glibc2 systems (PFV) } + linklibc:=false; + While not SharedLibFiles.Empty do + begin + S:=SharedLibFiles.Get; + if s<>'c' then + begin + i:=Pos(target_os.sharedlibext,S); + if i>0 then + Delete(S,i,255); + LinkRes.Add('-l'+s); + end + else + begin + LinkRes.Add('-l'+s); + linklibc:=true; + end; + end; + { be sure that libc&libgcc is the last lib } + if linklibc then + begin + LinkRes.Add('-lc'); + LinkRes.Add('-lgcc'); + end; +*) +{ Write and Close response } + linkres.writetodisk; + linkres.free; + + WriteResponseFile:=True; +end; + + +function TLinkerWatcom.MakeExecutable:boolean; +var + binstr, + cmdstr : string; + success : boolean; + StripStr : string[40]; +begin + if not(cs_link_extern in aktglobalswitches) then + Message1(exec_i_linking,current_module.exefilename^); + +{ Create some replacements } + StripStr:='debug dwarf all'; + if (cs_link_strip in aktglobalswitches) then + StripStr:=''; + +{ Write used files and libraries } + WriteResponseFile(false); + +{ Call linker } + SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr); + if pos(' ',current_module.exefilename^)>0 then + Replace(cmdstr,'$EXE','"'+current_module.exefilename^+'"') + else + Replace(cmdstr,'$EXE',current_module.exefilename^); + Replace(cmdstr,'$OPT',Info.ExtraOptions); + Replace(cmdstr,'$RES',outputexedir+Info.ResName); + Replace(cmdstr,'$STRIP',StripStr); + success:=DoExec(FindUtil(BinStr),cmdstr,true,false); + +{ Remove ReponseFile } + if (success) and not(cs_link_extern in aktglobalswitches) then + RemoveFile(outputexedir+Info.ResName); + + MakeExecutable:=success; { otherwise a recursive call to link method } +end; + +{function TLinkerWatcom.MakeSharedLibrary:boolean; +begin + MakeSharedLibrary:=false; +end;} + +initialization + RegisterExternalLinker(system_i386_watcom_info,TLinkerWatcom); + RegisterTarget(system_i386_watcom_info); +end. +{ + $Log$ + Revision 1.1 2003-09-06 10:01:11 florian + + added *_watcom units +}