summaryrefslogtreecommitdiff
path: root/compiler/utils/fpc.pp
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/utils/fpc.pp')
-rw-r--r--compiler/utils/fpc.pp205
1 files changed, 205 insertions, 0 deletions
diff --git a/compiler/utils/fpc.pp b/compiler/utils/fpc.pp
new file mode 100644
index 0000000000..01511f7419
--- /dev/null
+++ b/compiler/utils/fpc.pp
@@ -0,0 +1,205 @@
+{
+ Copyright (c) 2000-2002 by Florian Klaempfl
+
+ This file is the "loader" for the Free Pascal compiler
+
+ 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.
+
+ ****************************************************************************}
+program fpc;
+
+{$mode objfpc}{$H+}
+
+ uses
+ Sysutils;
+
+ const
+{$ifdef UNIX}
+ exeext='';
+{$else UNIX}
+ {$ifdef AMIGA}
+ exeext='';
+ {$else}
+ {$ifdef MORPHOS}
+ exeext='';
+ {$else}
+ {$ifdef NETWARE}
+ exeext='.nlm';
+ {$else}
+ exeext='.exe';
+ {$endif NETWARE}
+ {$endif MORPHOS}
+ {$endif AMIGA}
+{$endif UNIX}
+
+
+ procedure error(const s : string);
+ begin
+ writeln('Error: ',s);
+ halt(1);
+ end;
+
+
+ function SplitPath(Const HStr:String):String;
+ var
+ i : longint;
+ begin
+ i:=Length(Hstr);
+ while (i>0) and not(Hstr[i] in ['\','/']) do
+ dec(i);
+ SplitPath:=Copy(Hstr,1,i);
+ end;
+
+
+ function FileExists ( Const F : String) : Boolean;
+ var
+ Info : TSearchRec;
+ begin
+ FileExists:= findfirst(F,fareadonly+faarchive+fahidden,info)=0;
+ findclose(Info);
+ end;
+
+ procedure findexe(var ppcbin:string);
+ var
+ path : string;
+ begin
+ { add .exe extension }
+ ppcbin:=ppcbin+exeext;
+
+ { get path of fpc.exe }
+ path:=splitpath(paramstr(0));
+ if FileExists(path+ppcbin) then
+ ppcbin:=path+ppcbin
+ else
+ begin
+ path:=FileSearch(ppcbin,getenvironmentvariable('PATH'));
+ if path<>'' then
+ ppcbin:=path;
+
+ end;
+ end;
+
+ var
+ s : ansistring;
+ processorname,
+ ppcbin,
+ versionStr,
+ processorstr : string;
+ ppccommandline : ansistring;
+ i : longint;
+ errorvalue : Longint;
+ begin
+ ppccommandline:='';
+{$ifdef i386}
+ ppcbin:='ppc386';
+ processorname:='i386';
+{$endif i386}
+{$ifdef m68k}
+ ppcbin:='ppc68k';
+ processorname:='m68k';
+{$endif m68k}
+{$ifdef alpha}
+ ppcbin:='ppcapx';
+ processorname:='alpha';
+{$endif alpha}
+{$ifdef powerpc}
+ ppcbin:='ppcppc';
+ processorname:='powerpc';
+{$endif powerpc}
+{$ifdef arm}
+ ppcbin:='ppcarm';
+ processorname:='arm';
+{$endif arm}
+{$ifdef sparc}
+ ppcbin:='ppcsparc';
+ processorname:='sparc';
+{$endif sparc}
+{$ifdef x86_64}
+ ppcbin:='ppcx64';
+ processorname:='x86_64';
+{$endif x86_64}
+{$ifdef ia64}
+ ppcbin:='ppcia64';
+ processorname:='ia64';
+{$endif ia64}
+ versionstr:=''; { Default is just the name }
+ for i:=1 to paramcount do
+ begin
+ s:=paramstr(i);
+ if pos('-V',s)=1 then
+ versionstr:=copy(s,3,length(s)-2)
+ else
+ begin
+ if pos('-P',s)=1 then
+ begin
+ processorstr:=copy(s,3,length(s)-2);
+ { -PB is a special code that will show the
+ default compiler and exit immediatly. It's
+ main usage is for Makefile }
+ if processorstr='B' then
+ begin
+ { report the full name of the ppcbin }
+ findexe(ppcbin);
+ writeln(ppcbin);
+ halt(0);
+ end
+ { -PP is a special code that will show the
+ processor and exit immediatly. It's
+ main usage is for Makefile }
+ else if processorstr='P' then
+ begin
+ { report the processor }
+ writeln(processorname);
+ halt(0);
+ end
+ else if processorstr='i386' then
+ ppcbin:='ppc386'
+ else if processorstr='m68k' then
+ ppcbin:='ppc68k'
+ else if processorstr='alpha' then
+ ppcbin:='ppcapx'
+ else if processorstr='powerpc' then
+ ppcbin:='ppcppc'
+ else if processorstr='arm' then
+ ppcbin:='ppcarm'
+ else if processorstr='sparc' then
+ ppcbin:='ppcsparc'
+ else if processorstr='ia64' then
+ ppcbin:='ppcia64'
+ else if processorstr='x86_64' then
+ ppcbin:='ppcx64'
+ else error('Illegal processor type "'+processorstr+'"');
+ end
+ else
+ ppccommandline:=ppccommandline+s+' ';
+ end;
+ end;
+
+ if versionstr<>'' then
+ ppcbin:=ppcbin+'-'+versionstr;
+ { find the full path to the specified exe }
+ findexe(ppcbin);
+
+ { call ppcXXX }
+ try
+ errorvalue:=ExecuteProcess(ppcbin,ppccommandline);
+ except
+ on e : exception do
+ error(ppcbin+' can''t be executed, error message: '+e.message);
+ end;
+ if errorvalue<>0 then
+ error(ppcbin+' returned an error exitcode (normal if you did not specify a source file to be compiled)');
+ halt(errorvalue);
+ end.