瀏覽代碼

+ added *_watcom units

florian 22 年之前
父節點
當前提交
a13ce1dfb4
共有 2 個文件被更改,包括 285 次插入0 次删除
  1. 110 0
      compiler/systems/i_watcom.pas
  2. 175 0
      compiler/systems/t_watcom.pas

+ 110 - 0
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
+}

+ 175 - 0
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<lib>, 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
+}